【问题标题】:yii update clistview by dropdownlistyii 通过下拉列表更新 clistview
【发布时间】:2012-07-17 11:34:19
【问题描述】:

我是 Yii 框架的新手。我想创建一个页面。即当下拉列表发生变化时,listview/gridview 会随着下拉值的变化而变化。

这是我的看法

<div class="row">
        <?php

        $records = Company::model()->findAll();
        $company_list = CHtml::listData($records, 'id', 'name');
        echo CHtml::dropDownList('company_id','', $company_list,
        array(
        'onchange'=>"$.fn.yiiListView.update('ajaxListView', {url: '".Yii::app()->createUrl('department/dynamicsectionlist')."?company_id='+$('#company_id option:selected').val()})",
        'prompt'=>'Please select a company',
        )); ?>
    </div>

<?php
$this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view_section',
    'id'=>'ajaxListView',
));
?>

这是模型

public function search()
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria=new CDbCriteria;

        $criteria->compare('id',$this->id);
        $criteria->compare('name',$this->name,true);
        $criteria->compare('p_id',$this->p_id);
        $criteria->compare('created',$this->created,true);
        $criteria->compare('updated',$this->updated,true);
        $criteria->compare('company_id',$this->company_id);

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

这是控制器

public function actionDynamicsectionlist()
    {       
        $company_id = $_POST['company_id'];
        $criteria=new CDbCriteria();
        $criteria->condition .= 't.id IN (SELECT t2.id, t2.name FROM department t2 WHERE t2.company_id = :company_id)';

        $criteria->params[':company_id'] = $company_id;
        $dataProvider = new CActiveDataProvider( 'Department', array( 'criteria' => $criteria, ) );
        $this->render( 'sectionlist', array( 'dataProvider' => $dataProvider ) );

    }

但它不起作用。请帮帮我。

问候 塔尔索

【问题讨论】:

  • 如果在控制器里把$company_id = $_POST['company_id'];改成$company_id = $_GET['company_id'];呢?
  • 检查 firebug 中的 Network 选项卡以查看发送到服务器的内容和/或尝试回显 $_POST$_GET 的内容。还要检查 js/php 错误。
  • 我已经试过了。但不工作。当我使用 firebug 进行跟踪时,company_id GET localhost/mmaig_ceo/ceo-control-system/… 没有参数。
  • 你能指定你看到的错误是什么吗? “但它不起作用”不是很有帮助。您提到您使用过萤火虫- onchange 事件会触发吗?它访问什么 URL? company_id 参数是否正确传递? 'sectionlist' 视图的渲染是否发生?

标签: yii


【解决方案1】:

我解决了。

这是控制器

// Initial view (department/depatmentlist)
public function actionDepartmentlist()
    {
        $model=new Department('search');        
        $model->unsetAttributes();  // clear any default values     
        $model->p_id = 0;

        // $dataProvider->getData() will return a list of Post objects
        // $dataProvider=new CActiveDataProvider('Department');
        $this->render('list_department',array(
            'model'=>$model,
        ));

    }

// when the user selected the company from dropdown list
public function actionDynamicsectionlist()
    {
        $model=new Department('dsearch');
        $model->unsetAttributes();  // clear any default values
        $model->p_id = 0;
        if(isset($_GET['company_id']))
            $model->company_id = $_GET['company_id'];

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

这是模型(没有变化)

public function search()
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria=new CDbCriteria;

        $criteria->compare('id',$this->id);
        $criteria->compare('name',$this->name,true);
        $criteria->compare('p_id',$this->p_id);
        $criteria->compare('created',$this->created,true);
        $criteria->compare('updated',$this->updated,true);
        $criteria->compare('company_id',$this->company_id);

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

这是视图 (list_department.php)

<h1>Departments List</h1>
<div class="row">
Company<br />
    <?php           
    $records = Company::model()->findAll();
    $company_list = CHtml::listData($records, 'id', 'name');
    echo CHtml::dropDownList('company_id','', $company_list,
    array('prompt'=>'Please select a company',)); ?>
</div>
<?php
/*
for ListView
$this->widget('zii.widgets.CListView', array(
    //'dataProvider'=>$dataProvider,
    'dataProvider'=>$model->search(),
    'itemView'=>'_view_section',
    'id'=>'ajaxListView',
));
*/
?>


<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'department-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'id',
        'name',
        //'p_id',
        'created',
        'updated',
        //'company_id',

    ),
)); 
?>


<?php    
Yii::app()->clientScript->registerScript('search',
    "$('#company_id').change(function(){
    var companyId = $('#company_id option:selected').val();                              
    $.fn.yiiGridView.update(
    'department-grid',  
    { type: 'GET', 
    url: 'http://localhost/mmaig_ceo/ceo-control-system/index.php?r=department/dynamicdepartmentlist&ajax=department-grid&company_id=' + companyId

    }
    );
    });
")
?>

【讨论】:

  • 您的解决方案有效,但对我来说它不是 yii-comfortable。我会说在您的下拉菜单输入的HTMLoption 属性中放置一个ajax 对象,并向您的dynamicDeparatmentList 操作触发ajax 请求,该操作只是回显DataProvider。在这种情况下,您将摆脱所有 jquery。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 2014-09-05
相关资源
最近更新 更多