下拉列值更改时更新CGridView

时间:2010-04-22 02:44:01

标签: php jquery ajax yii

我有一个CGridView,其中包含表"product" => {'product_id','category_id',...}中的列 我有另一张桌子"category" => {'category_id','category_name'}

category_idproduct表格中的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呢?

如果上述方法不正确,请提出另一种方法。

2 个答案:

答案 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: - )