yii使用下拉列表对CListView进行排序

时间:2012-04-19 19:40:04

标签: php javascript jquery ajax yii

所以我有一个CListView,我可以使用我在sortableAttributes中设置的属性进行排序,当它只是ASC和DESC排序时这很好。但我也想按类别对CListView进行排序。在我的模型中,我有一个类别,范围从0到8。我做了一个下拉选择,显示了类别。

我想要做的是在选择下拉列表中的选项时更新我的​​CListView,我可以为此编写自己的jQuery代码,但我猜测有一些聪明的方法可以做到这一点。

由于

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$model->search(),
    'sortableAttributes'=>array('views','create_time','release_time'),
    'id'=>'#videos',
    'itemView'=>$view,
    'pager'=>array('cssFile'=>'/css/pager.css'),
)); ?>

2 个答案:

答案 0 :(得分:2)

经过多次辛苦工作:

你必须做两件事。首先,我们需要来自服务器的修改数据, 为此,您可以修改模型的搜索功能,因为这是为CListView提供数据提供者的功能。

因此,在模型的search()函数中,您可以添加if条件来修改数据提供者的$criteria,例如:

public function search() {

     // Warning: Please modify the following code to remove attributes that
     // should not be searched.

     $criteria=new CDbCriteria;

     // added the following if condition to modify the criteria to include only videos of a certain category
     if (isset($_GET['category']))
           $criteria->compare('category',$_GET['category'],true);// my category is string, hence the third attribute
     else
           $criteria->compare('category',$this->category,true);// we need the else part, coz the search function is used for actual searching also, for instance in gridview filters/search

     $criteria->compare('id',$this->id);
     // your other attributes follow    

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

注意:我不确定在比较之前是否绝对有必要清理$ _GET ['category']。

其次,我们需要更新CListView,我们可以使用它的函数$.fn.yiiListView.update。例如:

<div id="categoryupdating">
<?php 
    echo CHtml::dropDownList('dropit', '', 
     array('1'=>'Cateogry1','2'=>'Category2','3'=>'Category3','4'=>'Category4'),
     array('onchange'=>"$.fn.yiiListView.update('videos', {url: '".Yii::app()->createUrl('controller/action')."?category='+$('#dropit option:selected').val()})"));
?>
</div>

在这里,您应该使用CHtml::listData等函数动态填充下拉列表的数据,控制器/操作应该是CListView的控制器/操作。

查看 jquery.yiilistview.js 文件,了解更多yii的listview小部件的javascript函数。

注意:$ .fn.yiiListView.update将列表视图的idurl作为参数调用更新。

修改:还添加了else条件,因为搜索功能用于在gridview和其他地方进行实际搜索。

答案 1 :(得分:2)

为了将来参考,我最终会这样做。

Yii::app()->clientScript->registerScript('category', "
$('#category').change(function(){
    $.fn.yiiListView.update('videos', {
        data: $(this).serialize()
    });
    return false;
});
");

重要的部分是dropDownList的htmlOptions中的id,因为你不能使用“Video [category]”作为$ .fn.yiiListView.update函数的id。但它需要作为选择的名称,以便能够使用已有的搜索能力。

<?php echo CHtml::dropDownList(
    'Video[category]',
    0,
    Lookup::items('VideoCategory'),
    array('id' => 'category')
); ?>