【问题标题】:Yii cgridview last page pagination issueYii cgridview 最后一页分页问题
【发布时间】:2017-03-07 06:27:15
【问题描述】:

我有带分页的简单 Yii cgridview 代码。分页工作正常,但在最后一页我遇到了一个问题。

例如,如果我在 DB 表中有 13 条记录,并将分页设置为每页 10 页,那么对于第一页它将显示 "1 - 10 of 13 results" 但是当我点击然后第二页链接将显示 "4 - 13 of 13" 而不是 "11 - 13 of 13"

这是我的代码。

1) 控制器:

function actiontransactionHistory(){
        $creditTransactionObj = new CreditTransaction();

        $this->render('history',array(
            'creditTransactionObj'=>$creditTransactionObj,
        ));
    }

2) 型号:

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,true);
        $criteria->compare('fkasmtGroupId',$this->fkasmtGroupId);
        $criteria->compare('fkgroupSurveyUserId',$this->fkgroupSurveyUserId,true);
        $criteria->compare('fkasmtId',$this->fkasmtId);
        $criteria->compare('transaction_type',$this->transaction_type);
        $criteria->compare('credit_type',$this->credit_type,true);
        $criteria->compare('credit_qty',$this->credit_qty);
        $criteria->compare('transaction_date',$this->transaction_date,true);
        $criteria->compare('isDelete',$this->isDelete);
        $criteria->compare('status',$this->status);
        $criteria->compare('created_at',$this->created_at,true);
        $criteria->compare('modified_at',$this->modified_at,true);

        $sort = array(
            "defaultOrder" => "transaction_date DESC",
        );

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

3) 视图:

<?php
        $this->widget('zii.widgets.grid.CGridView', array(
            'id' => 'history-grid',
            'dataProvider' => $creditTransactionObj->search(),
            'loadingCssClass' => '',
            'enableSorting' => true,
            'itemsCssClass' => 'my-teams',
            'summaryText' => "Displaying {start} - {end} of {count} results.",
            "emptyText" => "There is no transaction history available.",
            'columns' => array(
                array('name' => 'transaction_date', 'header' => 'Date', 'type' => 'raw', 'value' => 'date("d-M-Y",strtotime($data->transaction_date))', 'htmlOptions' => array('class' => '')),
                array('name' => 'credit_qty', 'header' => '# of Credits', 'sortable'=>false, 'type' => 'raw', 'value' => '($data->transaction_type == 1) ? - $data->credit_qty : $data->credit_qty', 'htmlOptions' => array('class' => '')),
                array('name' => 'credit_type', 'header' => 'Type', 'type' => 'raw', 'value' => '$data->credit_type', 'htmlOptions' => array('class' => '')),
                array('name' => 'transaction_type', 'header' => 'Activity', 'type' => 'raw', 'value' => '($data->transaction_type == 0) ? "Purchased" : (($data->transaction_type == 1) ? "Spent" : "Refunded")', 'htmlOptions' => array('class' => '')),
                array('name' => 'fkasmtGroupId', 'header' => 'Group Name', 'type' => 'raw', 'value' => array($this,'getGroupName'), 'htmlOptions' => array('width' => '35%')),
            )
        ));
    ?>

我还附上了两个页面的截图。

任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: php pagination yii1.x


    【解决方案1】:

    花了很多时间后,我终于找到了解决这个问题的方法。 实际上问题出在 fetchData() 函数中 yii/framework/web/CActiveDataProvider.php 框架类文件。

    fetchData() 方法中,未正确计算最后一页分页的限制。所以我进行了更改以计算正确的限制。

    旧代码:

    protected function fetchData()
    {
        $criteria=clone $this->getCriteria();
    
        if(($pagination=$this->getPagination())!==false)
        {
            $pagination->setItemCount($this->getTotalItemCount());
            $pagination->applyLimit($criteria);
        }
    
        $baseCriteria=$this->model->getDbCriteria(false);
    
        if(($sort=$this->getSort())!==false)
        {
            // set model criteria so that CSort can use its table alias setting
            if($baseCriteria!==null)
            {
                $c=clone $baseCriteria;
                $c->mergeWith($criteria);
                $this->model->setDbCriteria($c);
            }
            else
                $this->model->setDbCriteria($criteria);
            $sort->applyOrder($criteria);
        }
    
        $this->model->setDbCriteria($baseCriteria!==null ? clone $baseCriteria : null);
        $data=$this->model->findAll($criteria);
        $this->model->setDbCriteria($baseCriteria);  // restore original criteria
        return $data;
    }
    

    新代码:

    protected function fetchData()
    {
            $criteria=clone $this->getCriteria();
    
            if(($pagination=$this->getPagination())!==false)
            {
                    $pagination->setItemCount($this->getTotalItemCount());
                    $pagination->applyLimit($criteria);
                    // update limit to the correct value for the last page 
                    $limit=$pagination->getLimit();
                    $offset=$pagination->getOffset();
                    if ( $offset+$limit > $pagination->getItemCount() )
                            $criteria->limit = $pagination->getItemCount() - $offset;
    
            }
            $baseCriteria=$this->model->getDbCriteria(false);
    
            if(($sort=$this->getSort())!==false)
            {
                    // set model criteria so that CSort can use its table alias setting
                    if($baseCriteria!==null)
                    {
                            $c=clone $baseCriteria;
                            $c->mergeWith($criteria);
                            $this->model->setDbCriteria($c);
                    }
                    else
                            $this->model->setDbCriteria($criteria);
                    $sort->applyOrder($criteria);
            }
    
            $this->model->setDbCriteria($baseCriteria!==null ? clone $baseCriteria : null);
            $data=$this->model->findAll($criteria);
            $this->model->setDbCriteria($baseCriteria);  // restore original criteria
            return $data;
    }
    

    但是请记住,永远不要更新框架的核心类文件。所以我只是在我的模型文件中扩展这个方法并编写下面的代码。

    我的模型文件中的最终代码,框架文件中没有更改:

    class CustomActiveDataProvider extends CActiveDataProvider
    {
            /**
             * Fetches the data from the persistent data storage.
             * @return array list of data items
             */
            protected function fetchData()
            {
                    $criteria=clone $this->getCriteria();
    
                    if(($pagination=$this->getPagination())!==false)
                    {
                            $pagination->setItemCount($this->getTotalItemCount());
                            $pagination->applyLimit($criteria);
                            // update limit to the correct value for the last page 
                            $limit=$pagination->getLimit();
                            $offset=$pagination->getOffset();
                            if ( $offset+$limit > $pagination->getItemCount() )
                                    $criteria->limit = $pagination->getItemCount() - $offset;
    
                    }
                    $baseCriteria=$this->model->getDbCriteria(false);
    
                    if(($sort=$this->getSort())!==false)
                    {
                            // set model criteria so that CSort can use its table alias setting
                            if($baseCriteria!==null)
                            {
                                    $c=clone $baseCriteria;
                                    $c->mergeWith($criteria);
                                    $this->model->setDbCriteria($c);
                            }
                            else
                                    $this->model->setDbCriteria($criteria);
                            $sort->applyOrder($criteria);
                    }
    
                    $this->model->setDbCriteria($baseCriteria!==null ? clone $baseCriteria : null);
                    $data=$this->model->findAll($criteria);
                    $this->model->setDbCriteria($baseCriteria);  // restore original criteria
                    return $data;
            }
    
    }
    
    // Used this custome active data provider as shown in below.
    public function search()
    {
        $criteria=new CDbCriteria;
    
        $criteria->compare('id',$this->id,true);
        $criteria->compare('isDelete',$this->isDelete);
        $criteria->compare('status',$this->status);
        $criteria->compare('created_at',$this->created_at,true);
        $criteria->compare('modified_at',$this->modified_at,true);
    
        $sort = array(
            "defaultOrder" => "transaction_date DESC",
        );
    
        return new CustomActiveDataProvider($this, array(
            "criteria"=>$criteria,
            "sort" => $sort,
            "pagination" => array('pageSize' => (isset($_REQUEST['pageSize'])?$_REQUEST['pageSize']:10))
        ));
    }
    

    进行此更改后,最后一页分页工作完全正常。 谢谢!

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多