Yii自定义ajax在gridview中搜索不同的模型

时间:2013-02-21 13:31:11

标签: php ajax yii

我想自定义我的模型的yii gridview搜索,其中gridview上方的一些复选框不属于模型,但会影响搜索结果。这是关于应该由用户可以选择的标志修改的联系人搜索。我不知道如何执行ajax请求,以便在模型search()函数中可以使用复选框的值。

<?php
// print all flags
echo '<table class="flag_table"><tr>';
echo '<tr><th>Flags:</th></tr>';
foreach($flagRows as $key=>$value)
{
    echo '<td>';
    echo CHtml::tag('span', array(), "$value->flag:&nbsp;");
    echo CHtml::checkBox('flagId__'.$value->id, false, array('value'=>"$value->id"));
    echo '</td>';
}
echo '</tr></table>';

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'contact-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
//'cssFile'=>Yii::app()->request->baseUrl.'/css/grid_view.css',
'columns'=>array(
    'firm',
    'last_name',
    'forename',
    'street',
    'city',
    'mobile_number',
    'email',
    'search_word',
    array(
        'class'=>'CButtonColumn',
    ),
),
)); ?>

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我仍然没有完全了解旗帜,但我想我有足够的信息给你一个例子。在这里:

在您的视图中,在复选框周围添加一个表单:

echo CHtml::form('','post', array('id' => 'checkbox-form')); 
echo '<table class="flag_table"><tr>';
echo '<tr><th>Flags:</th></tr>';
foreach($flagRows as $key=>$value)
{
    echo '<td>';
    echo CHtml::tag('span', array(), "$value->flag:&nbsp;");
    echo CHtml::checkBox('flagId__'.$value->id, false, array('value'=>"$value->id"));
    echo '</td>';
}
echo '</tr></table>';
echo CHtml::endForm();

在您的视图中,将其添加到您的cgridview:

'beforeAjaxUpdate' => "function(id, options){
    options['data'] = getContactGridData(id);
}",

在您看来,请在下方添加以下内容:

Yii::app()->clientScript->registerScript('updateGrid', "

function getContactGridData(id)
{
   var inputSelector = '#'+id+' .filters input, '+'#'+id+' .filters select';
   var origData = $.param($(inputSelector));
   return $('#checkbox-form').serialize() + '&' + origData;
}

$(function(){

    $('#checkbox-form').change(function() {
        $.ajax({
            url: $(this).attr('action'),
            data: $(this).serialize(),
            type: 'get',
            success: function(data) {
               var id = 'emoticon-grid'; 
               $.fn.yiiGridView.update(id, {data: getContactGridData(id)});
            }
        }); 
        return false;
    });
});

", CClientScript::POS_END);

*感谢this thread帮助我解决上述问题。

然后在您现有的控制器方法(用于填充网格视图的方法)中,您需要检查是否已设置任何标记值,并相应地调整$ model-&gt;搜索条件。

我没有足够的信息来确切知道需要如何调整$ model-&gt;搜索条件,但您需要使用以下格式。以下格式只是一个随机示例,与您的代码没有直接关系。

$model = new ModelName('search');
$model->unsetAttributes();  // clear any default values

if(isset($_GET['cat_id'])){
    $model->getDbCriteria()->mergeWith(array(
        'condition' => 'cat_id = :cat_id',
        'params' => array(':cat_id' => 1),
     ));
 }

 $this->render('index',array(
     'model'=>$model,
 ));

您应该查看CDbCriteria page,因为它解释了mergeWith,还有其他方法,如addInCondition()和addCondition(),您可以使用它们来修改搜索条件。

让我知道它是怎么回事。