Yii基于下拉选择更新CGridView

时间:2014-05-18 16:27:30

标签: php ajax yii

找到解决方案检查此帖子的结尾

我已经为此工作了4个星期,但我还没有取得任何进展。我在网上找到了大量类似的例子,但我尝试过的一切都无法上班。所以我不得不为社区带来另一个问题。

我有一个名为tbl_symptoms / Symptoms的模型/表,它有7列/属性: id,symptomCode,title,shortTitle,inclusions,exclusions,symptomCategory。

我使用了一个下拉选择(从服务器上的一个表中填充了一列中的症状类别)。

虽然我可以让gridview填充所有症状,但我不能让它只填充与下拉列表相同的类别症状。

这是我尝试的最后一个解决方案(现在它甚至没有呈现gridview,但即使它确实存在其他问题,所以我只是发布代码,所以你们有一个关于潜在解决方案的参考点):

Symptoms.php搜索功能:

public function search()
{
    $criteria=new CDbCriteria;


    $criteria->compare('symptomCategory',$this->symptomCategory,true);


    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

SiteController.php函数我使用:

//returns symptom categories that the user can choose to pick a symptom
public static function getSymptomCategories()
{
    return CHtml::listData(Yii::app()->db->createCommand()->select('category')->from('tbl_symptomcategory')->queryAll(), 'category', 'category');
}

public function actionLoadSymptoms()
{
    $symptomsModel = new Symptoms;

    if (isset($_POST)){
        $symptomsModel->attributes = $_POST;
        $dataProvider = $symptomsModel->search();
        $this->renderPartial('_searchSymptomsView', array('dataProvider' => $dataProvider));
    }
}

查看文件_seachSymptomsView:

    <?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'searchSymptomsGrid',
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        'symptomCode',
        'title',
        'inclusions',
        'exclusions',
        'symptomCategory',
        )
        ));
        ?>

search.php功能:

<!-- Select symptom category dropdown menu -->
<div class="search-form">
        <?php 
            echo $form->labelEx($model, 'symptomCategory'); 
            echo $form->dropDownList($model, 'symptomCategory', 
                    $this->getSymptomCategories(),
                    array( 'id'=>'symptomSelectDropdown',
                           'ajax'=>array('type'=>'POST',
                                        'url'=>CController::createUrl('SiteController/loadSymptoms'),
                                        'replace'=>'#symptomSelectDiv'
                            )));

           ?>

           <!-- select symptom -->
<div class="row" id="symptomSelectDiv">

</div>

此代码基于此处提出的类似问题,但我无法像我尝试的其他所有内容一样工作。 非常感谢任何帮助,谢谢。

解决方案I CAME UP (供将来参考)

症状模型搜索功能:几乎是默认构造的函数,但我注释掉除了我想要搜索的之外的症状类别的所有内容。

搜索视图文件:(重要的东西)

   Yii::app()->clientScript->registerScript('search', "
        $('#symptomSelectDiv').hide();
        $('#categorySelectDropDown').change(function(){
            $('#symptomSelectDiv').show();
            $('#symptoms-grid').yiiGridView('update', {
                data: $(this).serialize()
            });
            return false;
        });
 "); 
    ?>
     <h1>Welcome to the search for symptoms page </h1>

    <div class="form">
    <?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'search-form',
'enableClientValidation'=>true,
'clientOptions'=>array(
    'validateOnSubmit'=>true,
),
    )); ?>



 <p class="note">Fields with <span class="required">*</span> are required.</p>
<!-- Select symptom category dropdown menu -->
<div class="search-form">
        <?php        $this->renderPartial('_searchCategory',array('model'=>$model)); ?>
</div>


           <!-- select symptom -->
<div class="row" id="symptomSelectDiv" >
    <?php $this->widget('zii.widgets.grid.CGridView', array(
            'id'=>'symptoms-grid',
            'dataProvider'=>$model->search(),
            'columns'=>array(
                'symptomCode',
                'title',
                'inclusions',
                'exclusions',
                'symptomCategory',

            ),
    )); ?>
</div>



<div class="row buttons">
    <?php  echo CHtml::submitButton('Search');  ?>
</div>



   <?php $this->endWidget(); ?>

_searchCategory.php查看:

  <php $form=$this->beginWidget('CActiveForm', array(
'action'=>Yii::app()->createUrl($this->route),
'method'=>'get', 
  )); ?>
<!-- form is automatically submitted when dropdown selection changes -->
<div class="row">
    <?php echo $form->label($model,'symptomCategory'); ?>
    <?php echo $form->dropDownList($model, 'symptomCategory',
                                            $this->getSymptomCategories(),
                                            array('submit'=>'',
                                                  'id'=>'categorySelectDropDown',
                                                  'prompt'=>"Select Symptom Category")); ?>

</div>


   <?php $this->endWidget(); ?>

1 个答案:

答案 0 :(得分:1)

您找到的解决方案打破了MVC结构。顺便说一句(跳过该解决方案),您没有在filter中使用gridView

默认情况下,CGridView使用标头处的文本输入来执行过滤。如果您想使用dropDown,则必须更改列的过滤器,如下所示:

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'searchSymptomsGrid',
'dataProvider'=>$dataProvider,
'columns'=>array(
    'symptomCode',
    'title',
    'inclusions',
    'exclusions',
    array(
         'name'=>'symptomCategory',
         'type' => 'raw',
         'filter' => array('KEY'=>'VALUE','KEY1'=>'VALUE1'), //Note 1
         'value'=>'$data->symptomCategory' //Note 2
    )
    )
    ));

评论中的注1

此数组将在dropdown列标题中以symptomCategory格式显示。您可以使用自己的数组(使用特定键和值)替换它

注释中的注释2

它显示symptomCategory列的值。您可以使用自己的方式进行更改(例如格式化或其他方式)

Yii 拥有强大而全面的文档。建议您查看CGridView以了解更多信息。如果你看一下,你肯定能够进行更多的自定义。

CGridView Documents