Поиск по блогу

воскресенье, 9 августа 2015 г.

Yii 1.x вывод кнопок в CGridView по нескольким условиям


При создании одного из проектов на любимом фреймворке появилась необходимость фильтровать вывод кнопок (иконок) управления строкой (удалить, редактировать) в CGridView в зависимости от определенных условий.

Если условие одно, то задача достаточно тривиальна и ее решение не составит труда найти в интернете. А вот два условия объединенные стандартной логикой просто отказываются  работать. Однако не все так просто ...

Задача состоит в том, чтобы кнопки выводились в таблице:
- без условий для админа
- для пользователя не выводятся, если присутствует информация в поле post_code

Решение "в лоб":
$admin = Yii::app()->getModule("user")->isAdmin();
. . .
array(
   'name' => 'post_code',
),
array(
  'class' => 'CButtonColumn',
  'template' => '{update} {delete}',
  'buttons' => array (
     'update' => array(
        'visible' => '((mb_strlen($data->post_code, "UTF-8") == 0) || '.$admin.')'
     ),
     'delete' => array(
        'visible' => '((mb_strlen($data->post_code, "UTF-8") == 0) || 1)'
     ),
),
 

Разные условия для кнопок здесь я сделал специально для примера.

(mb_strlen($data->post_code, "UTF-8") == 0) || '.$admin   // кнопка update

Левая и правая части выражения ИЛИ могут принимать логические значение true/false слева и 1/0 (что в PHP идентично true/false) справа.

(mb_strlen($data->post_code, "UTF-8") == 0) || 1   // кнопка delete

Если в условии видимости кнопки delete изменять правую часть как 1 или 0 - выражение прекрасно отрабатывает, а если таким же образом изменять значение переменной $admin в условии для кнопки update - то выражение работать отказывается.

Для решения проблемы пришлось внедрить свою переменную непосредственно в запрос, чтобы ее в итоге "увидела" $data
В модели прописываем:

class OurCrazyClass extends CactiveRecord {
 
public $isadmin;
 
. . .
 
public function search() {
 
$criteria = new CDbCriteria;
 
. . .
 
$add = '';
if(Yii::app()->getModule('user')->isAdmin())
   $add = '1 as isadmin, ';
$criteria->select() = 't.*, '.$add.' ';

Если пользователь есть администратор, то в запрос добавляется наше новое поле isadmin. Теперь в представлении мы немного изменим наш код до рабочего состояния:
удаляем строку:

$admin = Yii::app()->getModule("user")->isAdmin();

и далее изменяем условия:

array(
  'class' => 'CButtonColumn',
  'template' => '{update} {delete}',
  'buttons' => array (
     'update' => array(
        'visible' => '((mb_strlen($data->post_code, "UTF-8") == 0) || $data->isadmin)'
     ),
     'delete' => array(
        'visible' => '((mb_strlen($data->post_code, "UTF-8") == 0) || $data->isadmin)'
     ),
),

Теперь все работает как и задумано. Возможно есть другое решение - делитесь в комментариях.
Всем успехов и спасибо

Комментариев нет :

Отправить комментарий

Есть что сказать - скажи