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