CGridView personalizzare bottoni

Ciao a tutti,

Ho una lista con CGridView e due tipologie di utenti che possono visualizzarla.

Una tipologia di utenza può modificare ed eliminare qualsiasi record, l’altra tipologia invece può solo modificare e non eliminare solo quelli che hanno un campo della stessa query con “personaggio=‘vip’”

Domanda posso sfruttare CGridView o devo rifarmi la lista io?

Grazie e buon we

Giuseppe

la cgridview ha una proprietà template


  	'columns' => array(

    	array(

      	'class' => 'CButtonColumn',

      	'template' => '{view}{edit}{delete}',

      	'deleteButtonUrl' => 'Yii::app()->controller->createAbsoluteUrl("tuaAzione", array("id" => $data->primaryKey))',

    	),

grazie mille manuel, questa proprietà template me la studio subito…

e mi risolverebbe il differenziare le azioni delle due tipologie di utenti,

ma è possibile personalizzare anche in base ad un campo… come chiedevo?

In particolari ho due tipologie di utente A e B

L’utente A modifica e cancella tutti i record (quindi non c’è nessun problema), l’utente B però può solo modificare alcuni record quelli che hanno citta=roma per esempio…

spero di essere stato chiaro…

grazie ancora

Giuseppe

be , mi sembra ovvio che nei 2 casi andrai a renderizzare due gridview diverse o inizializzate con parametri diversi

nel caso dell’utente B, se intendi far comparire il pulsante di modifica solo su alcuni record, il tutto si complica e così su 2 piedi non saprei dare una soluzione

Ok!!..

Pensavo fosse possibile perchè ho letto più volte che il widget gridview é uno dei più malleabili… Ma se non è possibile mettere il pulsante di modifica solo su alcuni record, toccherà farmi a manina la tabella di backend :)

Grz mille manuel

Giuseppe

Puoi provare ad estendere la classe CButtonColumn. In particolare puoi sovrascrivere il metodo CButtonColumn::renderDataCellContent() per alterarne il comportamento. Il metodo renderDataCellContent è quel metodo che tramuta il template in bottoni veri e propri. In questo esempio, altero renderDataCellContent in modo tale che mostri un botton solo nel caso in cui il record abbia id == 33 ed il bottone in questione sia un delete.

Ovviamente l’esempio è banale e serve solo a comprendere le potenzialità di questo hack.


class MyButtonColumn extends CButtonColumn {


    protected function checkBottoni($data, $id) {

        return $data->id == 33 && $id == 'delete';

    }


    protected function renderDataCellContent($row, $data) {

        $tr = array();

        ob_start();

        foreach ($this->buttons as $id => $button) {

            if ($this->checkBottoni($data, $id)) {

                $this->renderButton($id, $button, $row, $data);

            }

            $tr['{' . $id . '}'] = ob_get_contents();

            ob_clean();

        }

        ob_end_clean();

        echo strtr($this->template, $tr);

    }


}

PS, il file che contiene questo componente, puoi metterlo dentro alla cartella /protected/components e chiamarlo MyButtonColumn.php. Verrà caricato automaticamente da yii.

Fatto questo, puoi alterare il CGridView:


 'columns' => array(

        array(

            'class' => 'MyButtonColumn',

        ),

Questa soluzione me l’ha suggerita Chuck Norris.

Sono graditi tanti "+" =).

dajeeeee!!!!!

grande Simone e grande Chuck Norris :)

era proprio quello che volevo fare…

grande!

grazie mille

Giuseppe

Ho modificato un mio vecchio wiki per documentare la cosa:

http://www.yiiframework.com/wiki/290/change-buttons-on-our-cgridview-extending-yii/