Создание CGridView + некое сферическое поле в вакууме.

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
‡[анти]КИЉЕР‡
Сообщения: 14
Зарегистрирован: 2010.06.20, 13:23

Создание CGridView + некое сферическое поле в вакууме.

Сообщение ‡[анти]КИЉЕР‡ »

Итак. У меня примерно следующая задача.
Необходимо сделать интерфейс назначения пользователям ролей. Для этого есть представление "Управление ролями" в модели и CRUD Юзера.
Там по задумке должна выводится таблица всех ролей, которые есть в принципе + поле с чекбоксом. И те роли которые есть у этого пользователя, должен чекбокс стоять в checked. При этом нет никаких кнопок типа "сохранить". Всё делается он-лайн. Админ поставил галку - запустился аякс скрипт который дал эту роль юзеру. Админ убрал галку - так же по аяксу удалилось соотвествие роли юзеру.
Проблема возникла, как раз при добавлении поля с этим чекбоксом. Оно оказывается обязательно должно быть в модели прописано (т.е. должно быть в таблице roles). Ну да ладно, это моно обоити используя для этого поле data, которое вообще ХЗ зачем нужно.
Я делаю так:

Код: Выделить всё

   $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'users-grid',
    'dataProvider'=>roles::model()->search(),
    'filter'=>roles::model(),
    'columns'=>array(
        'name',
        'description',
        'bizrule',
        array(
            'name'=>'data',
            'value'=>'<input type="checkbox" id="XZ" value="ZX">',
        ),

    ),
));
 
Однако при этом ругается на eval:
Parse error: syntax error, unexpected '<' in Z:\home\kafedra\www\frontend\framework\base\CComponent.php(587) : eval()'d code on line 1
Там на этой строке как раз выполняется возврат результата: return eval('return '.$_expression_.';');.

Ну да ладно, добавим ещё одни кавычки:

Код: Выделить всё

   $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'users-grid',
    'dataProvider'=>roles::model()->search(),
    'filter'=>roles::model(),
    'columns'=>array(
        'name',
        'description',
        'bizrule',
        array(
            'name'=>'data',
            'value'=>'\'<input type="checkbox" id="XZ" value="ZX">\'',
        ),

    ),
));
 
Но тогда, это чудо выводит результат в виде текста, а не HTML:
<input type="checkbox" id="XZ" value="ZX">
При этом не собираюсь пока даже начинать думать, как в id чекбокса к примеру, передать id выводимой роли.
В общем то всё можно сделать добавлением костылей, ну вроде как использовании поля data, хотя оно для этого не преднозначено.

В общем можно это всё сделать как то по нормальному, без костылей? И как?

Аватара пользователя
TrustNik
Сообщения: 65
Зарегистрирован: 2009.10.25, 14:21
Откуда: Воронеж

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение TrustNik »

Роли иерархические? Если да то у юзверя может быть только одна роль (а не несколько).
Зачем вам GridView?
Не проще создать представление в котором просто будет radioButtonList() ? И к нему уже пытаться вешать аякс.

‡[анти]КИЉЕР‡
Сообщения: 14
Зарегистрирован: 2010.06.20, 13:23

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение ‡[анти]КИЉЕР‡ »

Роли иерархические? Если да то у юзверя может быть только одна роль (а не несколько).
Нет. Там у меня есть несколько модулей и несколько моделей и для всего этого нужно довольно сложную систему реализовать.
Например есть роль админа вики, и есть роль админа устройств. Может быть такое, что один юзер имеет только роль админа Вики, другой может админить только устройства, а третий и то и то.
Ну и плюс роль главного админа, которому можно всё)
Не проще создать представление в котором просто будет radioButtonList() ? И к нему уже пытаться вешать аякс.
Хм... не знаю, возможно. Завтра тогда буду курить это дело.

Anton_Yu
Сообщения: 27
Зарегистрирован: 2009.10.29, 01:30

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение Anton_Yu »

Вот и у меня таже проблема. Хочу раскрасить текст внутри колонки CGridView, никак не могу сообразить, как это менее накладно реализовать.
В value осуществляется только вывод, а вот где обработку этого вывода сделать? Перед вызовом CGridView менять содержимое в dataProvide мне Yii не дает. Да и не правильно это, менять на лету dataProvider, я думаю..

youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение youroff »

В колонке надо type выставить html, как минимум... ну и чекбокс, наверное, лучше выводить через хелпер CHtml (хотя я и не уверен, что модель пролезет туда, где происходит выполнение выражения -- но если не пролезет, то можно срендерить чекбоксы заранее):

Код: Выделить всё

array(
            'name'=>'data',
            'type'=>'html',
            'value'=>'CHtml::activeCheckBox(....)',
        ),
 

Аватара пользователя
TrustNik
Сообщения: 65
Зарегистрирован: 2009.10.25, 14:21
Откуда: Воронеж

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение TrustNik »

Anton_Yu писал(а):Вот и у меня таже проблема. Хочу раскрасить текст внутри колонки CGridView, никак не могу сообразить, как это менее накладно реализовать.
Что значит раскрасить? Поменять цвет? Тогда вам нужно работать с CSS, а не с данными.
Может быть такое, что один юзер имеет только роль админа Вики, другой может админить только устройства, а третий и то и то.
Ну тогда не список радиокнопок, а список чекбоксов - http://www.yiiframework.com/doc/api/CAc ... eckBoxList
youroff писал(а):В колонке надо type выставить html, как минимум... ну и чекбокс, наверное, лучше выводить через хелпер CHtml (хотя я и не уверен, что модель пролезет туда, где происходит выполнение выражения -- но если не пролезет, то можно срендерить чекбоксы заранее):

Код: Выделить всё

array(
            'name'=>'data',
            'type'=>'html',
            'value'=>'CHtml::activeCheckBox(....)',
        ),
 
Вот это уже началось извращение. Зачем так усложнять когда все уже есть в Api? ;) Для тех кто все же решит впихнуть чекбоксы в GridView - http://www.yiiframework.com/doc/api/CCheckBoxColumn

youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение youroff »

Все правильно. Я скорее отвечал на общий вопрос, почему HTML режется из value, ибо сам с этим сталкивался.
С другой стороны, если забабахать чекбокс вручную, то можно будет задать ему clientChange() для аяксовых действий, а в CCheckBoxColumn с заданием обработчиков будут сложности, поскольку в htmlOptions не выполняются выражения и необходимый идентификатор ячейки можно прицепить только к TD через cssClassExpression...

‡[анти]КИЉЕР‡
Сообщения: 14
Зарегистрирован: 2010.06.20, 13:23

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение ‡[анти]КИЉЕР‡ »

Ух, всем спасибо, вроде удалось кое что. А именно сгенерировать необходимые чекбоксы.
Но теперь встала проблема того, как у этих чекбоксов поставить checked по умолчанию, если эта роль уже есть у юзера.

Код, выводящий список ролей и чекбоксы выглядит так:

Код: Выделить всё

   $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'users-grid',
    'dataProvider'=>roles::model()->search(),
    'filter'=>roles::model(),
    'columns'=>array(
        'name',
        'description',
        'bizrule',
        array(
            'class'=>'CCheckBoxColumn',
            'header'=>'Присвоена роль?',
            'id'=>'roleCkeckers',
        ),

    ),
));
 
В результате чего, мы получаем в колонку c чекбоксами вида:
<input type="checkbox" name="roleCkeckers[]" id="roleCkeckers_0" value="23">
В value хранится по сути id роли.
Затем, в прицнипе все просто. Через JQuery привязываем вызов аякса по клику на элементе с id, начинающегося с roleCkeckers.
Ну так то так:

Код: Выделить всё

    $("input[id^=roleCkeckers]").click
    (
      function()
      {
         //alert($(this).attr('value'));
         //тут уж пишем аякс запрос, которые даёт/забирает у пользователя роль
      }
    ); 
Но вот никак не соображу, как у этих же чекбоксов сделать чтобы они были уже checked, если у данного пользователя есть данная роль.
При этом соответствия роли пользователю хранятся в таблице AuthAssignment, где в поле itemname хранится id роли, а в поле userid соответственно id юзера

Аватара пользователя
TrustNik
Сообщения: 65
Зарегистрирован: 2009.10.25, 14:21
Откуда: Воронеж

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение TrustNik »

Но вот никак не соображу, как у этих же чекбоксов сделать чтобы они были уже checked, если у данного пользователя есть данная роль.
При этом соответствия роли пользователю хранятся в таблице AuthAssignment, где в поле itemname хранится id роли, а в поле userid соответственно id юзера
В модели ролей пишешь функцию в которую передается id роли, а возвращается true или false в зависимости от наличия у текущего юзера данной роли.
Дальше дописываешь в свою колонку:

Код: Выделить всё

'value'=>'$data->tvoia_funkcia($data->id)',
 

‡[анти]КИЉЕР‡
Сообщения: 14
Зарегистрирован: 2010.06.20, 13:23

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение ‡[анти]КИЉЕР‡ »

TrustNik писал(а):
Но вот никак не соображу, как у этих же чекбоксов сделать чтобы они были уже checked, если у данного пользователя есть данная роль.
При этом соответствия роли пользователю хранятся в таблице AuthAssignment, где в поле itemname хранится id роли, а в поле userid соответственно id юзера
В модели ролей пишешь функцию в которую передается id роли, а возвращается true или false в зависимости от наличия у текущего юзера данной роли.
Дальше дописываешь в свою колонку:

Код: Выделить всё

'value'=>'$data->tvoia_funkcia($data->id)',
 
Это не то к сожалению. Такая инструкция заполняет у checkbox`а атрибут value. А этого мне не нужно, он и так заполнен.
Я пытался сделать так:

Код: Выделить всё

   $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'users-grid',
    'dataProvider'=>roles::model()->search(),
    'filter'=>roles::model(),
    'columns'=>array(
        'name',
        'description',
        'bizrule',
        array(
            'class'=>'CCheckBoxColumn',
            'header'=>'Присвоена роль?',
            'id'=>'roleCkeckers',
            'checkBoxHtmlOptions'=>array('checked'=>true)
        ),

    ),
)); 
Но даже такой код не выполняется. Он вроде игнориует если атрибут checked, т.к. с другими атрибутами срабатывает.
Вижу только как вариант добавлять в onload js функцию, которая будет пробегаться по всем этим значениям чекбокса и сравнивать их с неким скрытым полем к примеру, в котором хранится список ролей юзера. И уже в этом js выставлять у них checked.
Но такие костыли мне не категорически нравятся.

Аватара пользователя
TrustNik
Сообщения: 65
Зарегистрирован: 2009.10.25, 14:21
Откуда: Воронеж

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение TrustNik »

Прошу прощения, конечно нужно пихать функцию не в value.
Посмотрел код ядра, действительно "чекнутый" чекбокс сделать никак не получится, там всегда стоит false:

Код: Выделить всё

echo CHtml::checkBox($this->id.'[]',false,$options); 
Наверно нужно это в WishList добавить.

Аватара пользователя
samdark
Администратор
Сообщения: 9404
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение samdark »

Добавил возможность, забрать можно из SVN. Пример использования:

Код: Выделить всё

$this->widget('zii.widgets.grid.CGridView', array(
  'dataProvider' => new CActiveDataProvider('Artist'),
  'columns'=>array(
    array(
      'class'=>'CCheckBoxColumn',
      'checked' => '$row%2==0',
    ),
    'name',
  ),
));
 
Отметит все чекбоксы через один.

andreyrud
Сообщения: 265
Зарегистрирован: 2011.09.26, 14:59

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение andreyrud »

youroff писал(а):Все правильно. Я скорее отвечал на общий вопрос, почему HTML режется из value, ибо сам с этим сталкивался.
Удалось победить? Можно ли вообще вставлять в CGridView произвольный HTML текс? На 'value' => '<b>test</b>' у меня ругается "Parse error: syntax error, unexpected '<' in /home/user/yii-1.1.8.r3324/framework/base/CComponent.php(619) : eval()'d code on line 1" при 'type' => ''html' тоже. Каков рецепт? В какую сторону копать?

Аватара пользователя
samdark
Администратор
Сообщения: 9404
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение samdark »

andreyrud, копать в сторону документации. Тип колонки надо выставить в raw, в value должна быть либо строка с PHP кодом, либо замыкание.

Аватара пользователя
rem
Сообщения: 56
Зарегистрирован: 2011.11.22, 16:08

Re: Создание CGridView + некое сферическое поле в вакууме.

Сообщение rem »

А как тогда быть, если нужно вставить картинку?

Ответить