Desidero che il pulsante Elimina sia attivo solo in determinate condizioni in CGgridView
CButtonColumn
(o crea un pulsante di eliminazione personalizzato) e g se user=='admin'
o status=='draft'
. Qualche idea? Grazie!Pulsante di cancellazione condizionale CGridview
risposta
uso parametro 'visibile' -
'buttons'=>array
(
'delete' => array
(
'label'=>'Delete',
//other params
'visible'=>!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;
}
Non funziona – Sky
Penso che deve essere la funzione ($ dati, $ riga) e non la funzione ($ riga, $ dati). –
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'
Per migliorare la qualità del tuo post, includi perché/come la tua risposta risolve il problema. –
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.
- 1. Un pulsante di cancellazione per ogni campo
- 2. Come modificare l'immagine del pulsante di cancellazione (pulsante x) o almeno il colore dell'immagine del pulsante di cancellazione in UISearchbar?
- 3. Come disattivare il pulsante vista cgridview o impostando visiability false
- 4. Implementazione di un pulsante "condizionale" in ember.js
- 5. Come aggiungere un'immagine sul pulsante di cancellazione di UITableView?
- 6. Android EditText ha tipo di input con pulsante di cancellazione?
- 7. Cancellare il filtro senza fare clic sul pulsante di cancellazione
- 8. Come posso spostare il pulsante di cancellazione in un UITextField?
- 9. CGridView dropdown del filtro dall'array
- 10. Pulsante condizionale aggiunto a jQuery modal
- 11. Come personalizzare Yii CGridView Pager?
- 12. Yii - CGridView - aggiunge proprio attributo
- 13. Filtro CGridView con campo di testo personalizzato
- 14. Personalizzato UITextField tasto di cancellazione
- 15. Come posso annullare la cancellazione del record in base alle decisioni dopo aver premuto il pulsante di cancellazione di dbnavigator?
- 16. Nascondere la colonna in YII CGridView
- 17. Chiave di cancellazione in Editor di traduzioni
- 18. Utilizzo di CGridView per l'associazione di un modello
- 19. Visualizzazione di un "pulsante di cancellazione" (pulsante Elimina) in una casella di testo del webapp per iPhone
- 20. Cancellazione di un ByteBuffer
- 21. Token di cancellazione semaforo
- 22. MVC 4 - Come disabilitare questo pulsante in modo condizionale?
- 23. Il pulsante di cancellazione di UITextfield nasconde la tastiera quando è all'interno di UIScrollView
- 24. Utilizzando CGridView per mostrare gli attributi di un altro modello
- 25. Cancellazione dell'eco
- 26. Gestione del pulsante di cancellazione di IE con il binding AngularJS
- 27. Gestire il pulsante di cancellazione di IE 9 e 10 con rilegatura Knockout
- 28. Binding condizionale
- 29. Tipo di cancellazione in Java
- 30. Funzione di cancellazione ricorsiva PHP
Grazie, funziona (se inserisco il valore 'visibile' tra virgolette singole) – zuups
@Mukesh Soni, questo è fuorviante.Si prega di inserire virgolette intorno a quell'espressione nella risposta, attualmente errata. –
Questo non funzionerà per il caso d'uso della bozza. Vedi le risposte che coinvolgono $ dati – guidod