更新yii listview onchange of dropdown

时间:2014-03-02 12:00:06

标签: php yii

我想使用下拉列表更改listview的页面大小。请帮我找到解决方案。 我读了很多文章,但没能做到这一点。你能找到我犯错误的地方

我正在使用以下代码。

index.php的代码(视图)

下拉列表代码

  <?php echo CHtml::beginForm(); ?>
            <?php echo CHtml::dropDownList('CategoryMst_pagesize','20',
                    array('10'=>'10','20'=>'20','50'=>'50','100'=>'100'
                    ),
                    array('class'=>'form-control',
                    /*'ajax'=>array(
                        'type'=>'GET',
                        'data'=>array('pagesize'=>'js:this.value'), 
                        'ajaxUpdate':()
                    ),*/
                ));
            ?>
            <?php echo CHtml::endForm(); ?> 

listview代码

 <?php $this->widget('zii.widgets.CListView',array(
            'id'=>'category_list',
            'dataProvider'=>$dataProvider,
            'itemView'=>'_view',
            'summaryText'=>'{start} - {end} of {count} results',                
       ));
 ?>



  <?php 
    Yii::app()->clientScript->registerScript('category_update',
        "$('#CategoryMst_pagesize').change(function(){
              $.fn.yiiListView.update('category_list', {
                   data: $(this).serialize(),
              }
          );
         });
         return false;",
    CClientScript::POS_READY);
?>
cotroller中的

代码

      public function actionIndex($pagesize=20)
{
    $dataProvider=new CActiveDataProvider('CategoryMst',array(
                'criteria'=>array(
                ),
                'pagination'=>array(
                    'pageSize'=>$pagesize,
                ),
            ));

    $this->render('index',array('dataProvider'=>$dataProvider));        
} 

1 个答案:

答案 0 :(得分:1)

您确实不应该使用$('#CategoryMst_pagesize').change代替https://api.jquery.com/on/

然后从我看到的你不记得任何地方的页面大小,在你改变它1次后,一旦你转到另一个页面它将恢复到你以前的状态。这就是我的做法:
1)首先使用一些东西来记住页面大小,因为现在你没有。我个人推荐这个http://www.yiiframework.com/extension/esaverelatedbehavior/因为它真的非常非常好。它还记得你的过滤器(无价)。 2)为您的控制器创建一个只保存页面大小的功能。

/**
 * Saves the new page size for this particular model
 */
public function actionPageSize($pagesize)
{
    \Yii::app()->user->setState($this->modelName() . '_pagesize', $pagesize);
}

3)创建pagesize的下拉列表,我使用Select 2,但您可以使用正常的下拉列表。同样的想法

    <?php $this->widget('MySelect2', array(
        'name' => 'pageSize',
        'data'=>array('10' => '10', '25' => '25', '50' => '50', '100' => '100'),
        'options'=>array('allowClear' => false, 'minimumResultsForSearch' => 30),
        'htmlOptions' => array(
            'data-ajax-dropdown' => $this->createUrl('pageSize'),
            'style' => 'width: 80px',
            'options'=>array(
                (Yii::app()->user->getState($this->modelName() . '_pagesize', Yii::app()->params['defaultPageSize']))=>array('selected'=>'selected')
    ))));?>

4)我像你一样自动提交页面大小的下拉列表,但是我将它们提交给上面的函数而不是索引页面

/*==========================
AUTOSUBMIT DROPDOWNS FOR THE PAGE SIZE
==========================*/
$('#pageSize').live('change',function(e){
    var element = $(this);
    jQuery.ajax({
        "type": "GET",
        "url": $(this).attr("data-ajax-dropdown"),
        "cache": false,
        "data":{pagesize: $(this).val()}
    })
    .success(function ( response ) {
        $.fn.yiiGridView.update(element.closest('.widget.table').find('div.grid-view').attr('id'));
        $.jGrowl("Pagination changed", { life: 2000 });
    });    
});

PS:我知道我不应该使用.live

5)在搜索模型时就像我一样

return new \CActiveDataProvider($this, array(
    'criteria'=>$criteria,
    'sort'=>array(
        'defaultOrder'=>$this->getTableAlias(false,false) . '.name asc',
    ),
    'pagination'=>array(
        'pageSize'=> \Yii::app()->user->getState(get_class($this) . '_pagesize', \Yii::app()->params['defaultPageSize']),
    ),                  
));