При создании одного из проектов на любимом фреймворке появилась необходимость фильтровать вывод кнопок (иконок) управления строкой (удалить, редактировать) в 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)' ), ),
Теперь все работает как и задумано. Возможно есть другое решение - делитесь в комментариях.
Всем успехов и спасибо
Комментариев нет :
Отправить комментарий
Есть что сказать - скажи