2013-02-21 52 views
1

我想自定義我與那些不屬於模式,但會影響搜索結果在GridView上面一些複選框模型警予gridview的搜索。這是關於應由用戶可以選擇的標誌修改的聯繫人搜索。我不知道如何執行ajax請求,以便在模型搜索()函數中可以使用複選框的值。Yii的自定義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', 
    ), 
), 
)); ?> 

任何想法?

+0

你說複選框不屬於模型,但會影響搜索結果。複選框值如何影響搜索結果呢?他們是否連接到模型的關係?如果你能夠顯示你的代碼的一部分,這將是有幫助的,因爲如果沒有它,我的回答將是模糊的。基本思想是你必須將複選框值發送給控制器,讓該控制器返回新數據,然後更新網格視圖。 – frostyterrier 2013-02-21 19:19:59

+0

@frostyterrier嘿Frosty,我有一個額外的MySQL數據庫標誌映射到聯繫ID。這個表應該不會影響我的聯繫AR搜索如果選擇標誌複選框,我不知道我怎樣才能改變這種狀況是由search()函數返回的CActiveDataProvider「的數據返回新CActiveDataProvider($此,陣列( \t \t \t'criteria'=> $ criteria, 'pagination'=> array( 'pageSize'=> 25, ), \t \t));'' – Objective 2013-02-22 17:13:42

回答

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

*感謝this thread幫助我解決上述問題。

然後在您現有的控制器方法 - 一種用於填充GridView控件 - 你需要相應地檢查,看看是否有任何標誌值已設置,並調整$模型 - >搜索條件。

我沒有足夠的信息來知道$模型 - >搜索條件的需要究竟是如何進行調整,但您將需要使用以下格式。下面的格式只是一個隨機的例子,與您的代碼沒有直接關係。

$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(),你可以用它來修改搜索條件。

讓我知道它是怎麼回事。

+1

ajax更新沒有爲我工作,但我得到了一個renderPartial的工作解決方案,我每次在新的用戶搜索輸入已經完成並且dataProvider已經更新時渲染網格。 – Objective 2013-02-25 10:30:28

+0

太好了,那也可以。實際上,我在我的一個個人項目中是這樣做的,但這似乎是更「Yii」的方式。 – frostyterrier 2013-02-25 11:05:30