我有一个CGridView,其中包含表"product" => {'product_id','category_id',...}
中的列
我有另一张桌子"category" => {'category_id','category_name'}
category_id
是product
表格中的FK。
现在我想要一个类别表的下拉列表,并且在选择特定值时,应该更新产品的CGridView以仅显示具有category_id
的行。
我还需要CGridView的列过滤/排序才能工作(使用AJAX)。
当从下拉列表中选择一个值时,我能够刷新CGridView,但我不是
能够发送带有CGridView的'data'的category_id:
clientScript->registerScript('search', "
$('.cat_dropdown').change(function(){
$.fn.yiiGridView.update('order-grid', {
data: $(this).serialize(),
});
return false;
});
");
data: $(this).serialize()
仅发送CGridView的过滤文本字段中存在的值。
我如何附上category_id呢?
如果上述方法不正确,请提出另一种方法。
答案 0 :(得分:1)
这就是我最终做到的。我不知道解决方案是否最佳,但它确实有效。
任何评论欢迎。
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); }; ");
但是,上述解决方案需要CGridView的columns选项中的category_id
。如果删除它,则对其他列的过滤不起作用。
如果保留,则对其他列的过滤有效,但网格中存在category_id
(这不是必需的)
需要一种方法来隐藏CGridView中的category_id
列或其他解决方案。
答案 1 :(得分:1)
您只需要将下拉菜单添加到CGridView,仅此而已,例如:
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: - )