Domanda

Voglio che il pulsante Elimina sia attivo solo in determinate condizioni in CGgridView CButtonColumn (o creare un pulsante di eliminazione personalizzato) E G se user=='admin' o status=='draft'.Qualche idea?Grazie!

È stato utile?

Soluzione

Utilizzare il parametro 'visibile' -

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

Altri suggerimenti

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

È inoltre possibile utilizzare la funzione anonima se PHP>= 5.3

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

Come gli stati Zuups in Mukesh Post, devi usare le virgolette singole! E User1584901 ha ragione con la risposta, nel caso in cui lo stato è di proprietà dell'istanza del modello. Quindi,

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

è corretto. (Spiegazione in basso)

Voglio aggiungere alcune cose interessanti che puoi fare. Ad esempio, considera un utente con beni. In questo caso vorrei aggiungere il tasto Elimina solo agli utenti che non hanno alcuna risorsa.

In questo caso, è possibile effettuare una relazione nel modello utente come

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

che restituirà 1 se l'utente ha beni o 0 altrimenti. E definisci il parametro visibile come

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


.

Il motivo per cui tutto ciò che funziona (come richiesto da 0x7FFFFFFFF) è dovuto al quale YII utilizza la stringa definita in visibile per applicarlo alla funzione EvalueSpression all'interno della funzione che rendono i pulsanti (Rendering).

Da: https:// github.com/yiisoft/yii/blob/1.1.14/framework/zii/widgets/grid/cbuttonColumn.php Line 337

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

che è definito nella classe CComponent: https://github.com/yiisoft/yii/blob /1.1.14/FRAMWork/Base/Ccomponent.php Line 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_);
            }
    }
.

Così fondamentalmente ciò che accade è che la funzione Evalueexpression renderà disponibile le variabili $ dati (che è l'istanza del modello per la riga in questione) e $ riga (tutto questo utilizzando la funzione di estrazione) e valuta la tua espressione di stringa come PHP codice. Quindi ogni menzione di $ dati o $ riga utilizzerà la variabile già impostata dalla funzione EvaluteExpression in questo scopo. Ecco perché è possibile utilizzare la rispettiva istanza del modello della riga rispettiva (come $ Data-> Stato o $ Data-> Haveasets dagli esempi). Si noti che la stringa dovrebbe essere un'espressione che restituisce un booleano per determinare la visibilità del pulsante.

E il motivo per cui le stringhe dovrebbero essere in virgolette singole è che mentre si utilizzano quotazioni doppie, PHP assumerà che qualsiasi stringa che inizia con $ è una variabile e tenterà di sostituirlo con quel valore variabile. Dal momento che, nella tua scope, la variabile dei dati $ è priva di significato (o potrebbe essere definita) proietterà un errore o sostituiràlo in modo fuorviante. Utilizzando le virgolette singole impedisci di avere questo comportamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top