2012-02-24 16 views
10

Desidero che il pulsante Elimina sia attivo solo in determinate condizioni in CGgridViewCButtonColumn (o crea un pulsante di eliminazione personalizzato) e g se user=='admin' o status=='draft'. Qualche idea? Grazie!Pulsante di cancellazione condizionale CGridview

risposta

19

uso parametro 'visibile' -

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

Grazie, funziona (se inserisco il valore 'visibile' tra virgolette singole) – zuups

+0

@Mukesh Soni, questo è fuorviante.Si prega di inserire virgolette intorno a quell'espressione nella risposta, attualmente errata. –

+1

Questo non funzionerà per il caso d'uso della bozza. Vedi le risposte che coinvolgono $ dati – guidod

6

È inoltre possibile utilizzare la funzione anonima se PHP> = 5,3

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

Non funziona – Sky

+0

Penso che deve essere la funzione ($ dati, $ riga) e non la funzione ($ riga, $ dati). –

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

Per migliorare la qualità del tuo post, includi perché/come la tua risposta risolve il problema. –

3

Come zuups afferma in Mukesh posta, è necessario utilizzare singolo citazioni! E user1584901 ha ragione con la risposta, nel caso in cui lo stato sia una 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 anche tu. Ad esempio, considera un utente con risorse. In questo caso, vorrei aggiungere il pulsante Elimina solo agli utenti che non dispongono di risorse.

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

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

che restituirà 1 se l'utente ha un patrimonio, o 0 altrimenti. E definire il parametro visibile come

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

La ragione tutto questo funziona (come richiesto dalla 0x7fffffff) è perché Yii utilizza la stringa definita nel visibile per applicarlo alla funzione evaluateExpression all'interno della funzione che rendono la pulsanti (renderButton).

Da: https://github.com/yiisoft/yii/blob/1.1.14/framework/zii/widgets/grid/CButtonColumn.php linea 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 componente I: https://github.com/yiisoft/yii/blob/1.1.14/framework/base/CComponent.php linea 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_); 
      } 
    } 

Quindi, in pratica quello che succede è che la funzione evaluateExpression metterà a disposizione le variabili $ data (che è l'istanza del modello per la riga in questione) e $ row (tutto ciò utilizzando la funzione di estrazione) e valuta l'espressione della stringa come codice php. Quindi qualsiasi menzione a $ data o $ row userà la variabile già impostata dalla funzione evaluteExpression in questo ambito. Ecco perché è possibile utilizzare la rispettiva istanza di modello della rispettiva riga (come $ data-> status o $ data-> haveAssets dagli esempi). Si noti che la stringa deve essere un'espressione che restituisce un valore booleano per determinare la visibilità del pulsante.

E il motivo per cui le stringhe devono essere racchiuse tra virgolette singole è che mentre si usano le virgolette doppie, php supporrà che ogni stringa che inizia con $ sia una variabile e proverà a sostituirla con quel valore di variabile. Poiché, nel tuo ambito, la variabile $ data non ha senso (o potrebbe essere definita) genererà un errore o lo sostituirà in modo fuorviante. Usando le virgolette singole si impedisce di avere questo comportamento.

Problemi correlati