1

モデルに属していないが検索結果に影響を与えるいくつかのチェックボックスをグリッドビューの上に配置して、モデルの yii グリッドビュー検索をカスタマイズしたいと考えています。これは、ユーザーが選択できるフラグによって変更する必要がある連絡先検索に関するものです。チェックボックスの値がモデルの search() 関数で利用可能になるように ajax リクエストを行う方法がわかりません。

<?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 に答える