Передать дополнительные данные в CGridView

Уже исправленные репорты или принятые предложения
Ответить
гриша
Сообщения: 13
Зарегистрирован: 2011.02.06, 15:44

Передать дополнительные данные в CGridView

Сообщение гриша »

Вот смотрите.
Есть CListView, и в нём есть замечательное свойство viewData, которое позволяет передать дополнительную информацию внутрь CListView. Это свойство согласно мануалу определяется прямо в CListView.

И есть CGridView, в котором ничего такого нет. Хотя оно очень нужно, по моему. Как я понял, на данный момент я могу оперировать в колонках/строках только данными строки, доступными из $data. А если у меня, напрмиер, во вью есть массив

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

$my_array(
'1'='Значение 1',
 '2'='Значение 2'
);
 
и я хочу вывести эти значения в колонке

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

$this->widget('zii.widgets.grid.CGridView', array( 
....
'columns'=>array(
        'values'=> array(
            'name' => 'values',
            'value' => '$my_array[$data->value_id]' 
        ),
 
То у меня конечно ничего не получится... А очень хочется. И даже не столько хочется, сколько прям таки необходимо.

В общем, непонятно почему этот функционал передачи доп. данных в виджет появляется прямо в CListView, а не в каком то предке, от которого наследуется также и CGridView. Возможно, его можно перенести например в CBaseListView.

Надеюсь я понятно описал чего хочу и что предлагаю.
Последний раз редактировалось гриша 2011.10.16, 23:35, всего редактировалось 1 раз.
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: Передать дополнительные данные в CGridView

Сообщение creocoder »

Элементарно:

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

'columns'=>array(
    'values'=> array(
        'name' => 'values',
        'value' => function($data) use ($my_array) {
            return $my_array[$data->value_id];
        },
    ),
),
 
Но есть важное замечание, работать будет в PHP не ниже 5.3
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Передать дополнительные данные в CGridView

Сообщение Ekstazi »

Как вариант - create_function подойдет для версий помладше.
гриша
Сообщения: 13
Зарегистрирован: 2011.02.06, 15:44

Re: Передать дополнительные данные в CGridView

Сообщение гриша »

Спасибо за советы как выкрутиться. Возможно, в обозримом будущем мне придётся к ним прибегнуть. Но... Я понимаю что yii+php даёт небывалую гибкость в реализации чего угодно, но иногда хочется от фреймворка чего то такого правильного, красивого, логичного, единообразного.

Ведь вот есть 2 виджета с похожим функционалом, причём в один можно передать данные штатными средствами фреймворка, а в другой нет. И в чём тут смысл, скажите мне? По моему моё предложение передать этот уже написанный кем-то зачем-то функционал из одного наследника (CListView) в общего родителя (CBaseListView) довольно обоснованно. И более того, как я понимаю весь патч заключается в одной строчке кода - определении свойства в одном классе вместо другого. Или я не прав?

Собственно, прошу людей близких к разработке как то оформить и протолкнуть моё предложение.

Или уж, раз всё можно сделать, давайте все вместе ходатайствовать о удалении функционала передачи данных в CListView, для единообразия, и чтобы не путаться :) И написании howto "как передать данные в grid" с учётом версии php :mrgreen:
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: Передать дополнительные данные в CGridView

Сообщение creocoder »

Вам дали не workaround, а штатный способ, причем для разных версий php.
гриша писал(а):По моему моё предложение передать этот уже написанный кем-то зачем-то функционал из одного наследника (CListView) в общего родителя (CBaseListView) довольно обоснованно. И более того, как я понимаю весь патч заключается в одной строчке кода - определении свойства в одном классе вместо другого. Или я не прав?
Нет, не прав. Передача дополнительных параметров в шаблоны CListView и в ячейку CGridView это совершенно разный подход. В первом случае данные передаются как есть, во втором данные проходят через evaluateExpression().
гриша
Сообщения: 13
Зарегистрирован: 2011.02.06, 15:44

Re: Передать дополнительные данные в CGridView

Сообщение гриша »

Я знал и помнил про eval, но был уверен что можно что-то передать в контекст в котором он выполняется.
И вот, нашёл более удовлетворяющий меня способ тут: http://www.yiiframework.com/wiki/252/sp ... clistview/
Почти то же что viewData в CListView, но обращаться внутри eval придётся как $this->grid->myData. Но всё равно, гораздо писабельнее и читабельнее чем create_function return array.

И всё равно по прежнему мне кажется что можно бы добавить это свойство в основной класс, снабдить комментарием как пользоваться - и опля. Правда да, добавлять надо в CGridView, моё первое мнение о возможности добавлении в общего родителя оказалось неверным.

...У меня какой то внутренний протест против экстендов ради таких неспецифических вещей, которые потом всё равно надо таскать с собой из проекта в проект.
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: Передать дополнительные данные в CGridView

Сообщение creocoder »

Чем не устраивают анонимные функции? Способ который вы привели по ссылке по сравнению с анонимками сильно проигрывает. К тому же скорость работы при использовании анонимных функций намного выше, чем при использовании evaluateExpression() + eval внутри.

P.S. А учитывая что Yii 2.0 будет под 5.3, то вероятнее всего способ определения колонок под старые версии PHP станет вообще недоступен. Так что привыкайте к анонимным функциям. Тот функционал, который вы описали добавлять смысла нет по многим причинам.
ZxUkr
Сообщения: 20
Зарегистрирован: 2011.11.21, 13:00

Re: Передать дополнительные данные в CGridView

Сообщение ZxUkr »

Ekstazi писал(а):Как вариант - create_function подойдет для версий помладше.
А как тогда должен выглядеть вышеописанный код?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Передать дополнительные данные в CGridView

Сообщение Ekstazi »

Не без изврата, но:

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

=>array(create_function('$data','$my_array=array(...);return $my_array[$data->value_id];'); 
gustav
Сообщения: 56
Зарегистрирован: 2013.01.20, 16:52
Откуда: Ташкент
Контактная информация:

Re: Передать дополнительные данные в CGridView

Сообщение gustav »

А как теперь осуществить поиск на странице admin по новым значениям. Т.е не по 0,1 а по , например, да , нет?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Передать дополнительные данные в CGridView

Сообщение rak »

в базе хранится как раз 0,1
А в качестве фильтра нужно сделать выпадающий список
Ответить