Обновление CGridView при изменении раскрывающегося значения - PullRequest
0 голосов
/ 22 апреля 2010

У меня есть CGridView со столбцами из таблицы "product" => {'product_id','category_id',...} У меня есть еще один стол "category" => {'category_id','category_name'}

category_id - это FK в таблице product.

Теперь я хочу выпадающий список таблицы категорий, и при выборе определенного значения CGridView продукта должен быть обновлен, чтобы показывать только строки с этим category_id. Мне также нужна фильтрация / сортировка столбцов для работы CGridView (с использованием AJAX).

Мне удалось обновить CGridView, когда значение выбрано из выпадающего списка, однако я не возможность отправить category_id с «данными» для CGridView: clientScript->registerScript('search', " $('.cat_dropdown').change(function(){ $.fn.yiiGridView.update('order-grid', { data: $(this).serialize(), }); return false; }); "); data: $(this).serialize() отправляет только те значения, которые присутствуют в текстовых полях фильтрации CGridView. Как мне добавить к нему category_id?

Если вышеуказанный метод не является правильным, предложите альтернативный метод.

Ответы [ 2 ]

1 голос
/ 02 мая 2012

Вам нужно только добавить раскрывающееся меню в CGridView, ничего более, например ::10000 *

array('name' => 'category_id', 'value' => 'Categories::model()->getCategoryName($data->category_id)', 'filter'=>CHtml::listData(Categories::model()->getCategoryObj(), 'category_id', 'category_name')),

Глядя на вышесказанное, вам нужно добавить два метода в ваш класс Categories:

getCategoryName getCategoryObj

Читать это:

http://www.mattiressler.com/customising-cgridview-select-menu/

http://www.mattiressler.com/using-class-properties-to-minimise-database-queries/

Вам не нужно добавлять никакой JavaScript: -)

1 голос
/ 25 апреля 2010

Вот так я наконец и сделал. Я не знаю, является ли решение оптимальным или нет, но оно работает. Любые комментарии приветствуются. <pre></p> <p>Yii::app()->clientScript->registerScript('yiiGridView.update', " $.fn.yiiGridView.update = function(id, options) { var settings = $.fn.yiiGridView.settings[id]; var data = { 'product[category_id]': $('.cat_dropdown option:selected').val(), }; options = $.extend({ type: 'GET', data: data, success: function(data,status) { $.each(settings.ajaxUpdate, function() { $('#'+this).replaceWith($(data).find('#'+this)); }); if(settings.afterUpdate != undefined) settings.afterUpdate(id, data); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.responseText); } }, options || {}); if(settings.beforeUpdate != undefined) settings.beforeUpdate(id); $.ajax(options); }; ");

Однако для вышеприведенного решения требуется параметр category_id в столбцах CGridView. Если он удален, фильтрация по другим столбцам не работает. Если оно сохраняется, фильтрация по другим столбцам работает, но в сетке присутствует category_id (что не требуется) Нужен способ скрыть столбец category_id в CGridView или другом решении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...