Difference between #5 and #4 of Change buttons on our CGridView extending yii

unchanged
Title
Change buttons on our CGridView extending yii
unchanged
Category
Tips
unchanged
Tags
CGridView, CButtonColumn, extending
changed
Content
In this tip, I'll help you to change in few second buttons of your CGridView. I
hope you like it =).

This is our standard grid created by yii (with gii, or console, ...)

~~~
[php]
    $this->widget('zii.widgets.grid.CGridView', array(
        'id' => 'standard-grid',
        'dataProvider' => $model->search(),
        'filter' => $model,
        'columns' => array(
            'id',
            'field',
            array(
                'class' => 'CButtonColumn',
            ),
        ),
    ));
~~~

What if we want to easy upgrade columns of all our grid? we can extend
CButtonColumn with a new class. We can create this class and call it
MyCButtonColumn (for example). Then change column class in our CGridView:

~~~
[php]
    $this->widget('zii.widgets.grid.CGridView', array(
        'id' => 'standard-grid',
        'dataProvider' => $model->search(),
        'filter' => $model,
        'columns' => array(
            'id',
            'field',
            array(
                'class' => 'MyCButtonColumn',
            ),
        ),
    ));
~~~

Second, create MyCButtonColumn class in
/protected/components/MyCButtonColumn.php

~~~
[php]
    class MyCButtonColumn extends CButtonColumn {
        public $template = '{update} {delete}';
    }
~~~

In this example, we simply replace standard template deleting '{view}' button.
But what if you want hide delete button in 21 december of 2012?

~~~
[php]
    class MyCButtonColumn extends CButtonColumn {

        protected function checkButtons($data, $id) {
            return date('Y-m-d')!(date('Y-m-d') ==
'2012-12-21' && $id == 'delete';'delete');
        }

        protected function renderDataCellContent($row, $data) {
            $tr = array();
            ob_start();
            foreach ($this->buttons as $id => $button) {
                if ($this->checkButtons($data, $id)) {
                    $this->renderButton($id, $button, $row, $data);
                }
                $tr['{' . $id . '}'] = ob_get_contents();
                ob_clean();
            }
            ob_end_clean();
            echo strtr($this->template, $tr);
        }

    }
~~~