Question

Je veux que le bouton supprimer pour être actif seulement dans certaines conditions, dans CGgridView CButtonColumn (ou personnaliser un bouton supprimer) e g si user=='admin' ou status=='draft'.Des idées?Merci!

Était-ce utile?

La solution

utiliser "visibles" paramètre -

 'buttons'=>array
    (
        'delete' => array
        (
            'label'=>'Delete',
            //other params
            'visible'=>!Yii::app()->user->checkAccess('admin'),
        ),

Autres conseils

'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'

Vous pouvez également utiliser la fonction anonyme si PHP >= 5.3

'visible'=>function($row, $data) {
    return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}

Comme zuups états Mukesh poste, vous devez utiliser des guillemets simples!Et user1584901 est à droite avec la réponse, dans le cas de l'état est une propriété de l'instance du modèle.Donc,

'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")',

est correcte.(Explication en bas)

Je tiens à ajouter quelques choses intéressantes que vous pouvez en faire autant.Considérons, par exemple, un utilisateur actif.Dans ce cas, je voudrais ajouter le bouton supprimer uniquement pour les utilisateurs qui n'ont pas de actifs.

Dans ce cas, vous pouvez faire une relation dans le modèle de l'utilisateur telles que

'haveAssets' = array(self::STAT,'Asset', 'asset_id','select'=>'1')

Qui retourne 1 si l'utilisateur possède des biens, ou 0 sinon.Et de définir le paramètre visible que

'visible' => '!$data->haveAssets',

La raison de tout cela fonctionne (comme demandé par 0x7fffffff) c'est parce que Yii utilise la chaîne définie dans le visible pour l'appliquer à l'evaluateExpression fonction à l'intérieur de la fonction de rendu des boutons (renderButton).

De: https://github.com/yiisoft/yii/blob/1.1.14/framework/zii/widgets/grid/CButtonColumn.php ligne 337

protected function renderButton($id,$button,$row,$data)
    {
            if (isset($button['visible']) && !$this->evaluateExpression($button['visible'],array('row'=>$row,'data'=>$data)))
                      return;

Qui est défini dans le CComponent classe:https://github.com/yiisoft/yii/blob/1.1.14/framework/base/CComponent.php ligne 607

public function evaluateExpression($_expression_,$_data_=array())
    {
            if(is_string($_expression_))
            {
                    extract($_data_);
                    return eval('return '.$_expression_.';');
            }
            else
            {
                    $_data_[]=$this;
                    return call_user_func_array($_expression_, $_data_);
            }
    }

Donc, fondamentalement, ce qui se passe est que le evaluateExpression fonction de mettre à disposition les variables $de données (qui est l'instance du modèle pour la ligne en question) et $row (tout cela en utilisant l'extrait de fonction) et d'évaluer votre expression de chaîne comme du code php.De sorte que toute mention de $données $ou ligne va utiliser la variable déjà définie par la evaluteExpression fonction dans ce champ d'application.C'est pourquoi vous pouvez utiliser le modèle de l'instance de la ligne correspondante (comme $data->statut, ou $data->haveAssets à partir des exemples).Notez que la chaîne doit être une expression qui renvoie une valeur booléenne pour déterminer la visibilité du bouton.

Et la raison pour laquelle les chaînes doivent être entre guillemets, c'est que tout en utilisant les guillemets, php va supposer que n'importe quelle chaîne de caractères qui commence par $ est une variable et va essayer de la remplacer par la variable valeur.Depuis, dans votre champ d'application de l' $variable de données est vide de sens (ou pourrait être défini) lèvera une erreur ou de le remplacer, de façon trompeuse.L'utilisation des guillemets simples vous empêcher d'avoir ce comportement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top