1

我想为我的模型自定义 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',
    ),
),
)); ?>

有任何想法吗?

4

1 回答 1

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);
}",

在您看来,请在下面添加此 javascript:

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);

*感谢这个线程帮助我完成上述工作。

然后在您现有的控制器方法中 - 用于填充网格视图的方法 - 您需要检查是否已设置任何标志值,并相应地调整 $model->search 标准。

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

$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 页面,因为它解释了 mergeWith 并且还有其他方法,如 addInCondition() 和 addCondition() 可用于修改搜索条件。

让我知道事情的后续。

于 2013-02-22T20:50:40.317 回答