【问题标题】:Pagination For Search Results using Yii使用 Yii 对搜索结果进行分页
【发布时间】:2013-12-22 16:11:55
【问题描述】:

我有一个搜索表单,它返回一堆图像。因为它们的数量可能很高,所以我更喜欢使用分页显示结果。但是,我似乎无法让它正常工作。我已将所有内容移至视图以使事情尽可能简单。

这是我的搜索和分页代码sn-p:

$searchData = $model->search(); // this is the result of the search
$pages = new CPagination($searchData->itemCount); 
$searchData->setPagination($pages); 
$pages->applyLimit($searchData->criteria); 
$pages->pageSize = 2; 

然后,我使用“foreach”语句显示结果:

foreach($searchData->getData() as $data)
{
// results displayed here
}

最后,我有了 CLinkPager 小部件:

 $this->widget('CLinkPager', array(
    'pages' => $pages,
    'header' => 'Отиди на страница: ',
    'nextPageLabel' => 'Следваща',
    'prevPageLabel' => 'Предишна',
                     )); `

问题是:小部件和显示的结果之间没有关系。 例如,如果我得到 4 个结果,则小部件正确显示有 2 个页面。但是,结果不会显示在两个页面中,都显示在一个页面中,单击 CLinkPager 链接什么也不做。

我以前成功地完成了分页,但是对于所有数据使用 模型()->查找所有()。

如何说明分页小部件和搜索结果之间的关系...?

感谢您的宝贵时间。

【问题讨论】:

  • 这不是我想要的,但我从链接中获得了一些灵感并设法解决了我的问题。谢谢你,真诚的!诀窍是从 $model->search() 获取查询条件,然后将 $model->findAll() 与该条件一起使用。

标签: php search yii pagination


【解决方案1】:

我认为您可能使该过程过于复杂。您可以更轻松地使用 CListView 小部件通过分页显示结果。

你的控制器可能有这个;

public function actionIndex(){
    $model = new Model;
    $this->render('index', array('model' => $model);
}

你的模型需要有一个返回 CActiveDataProvider 实例的搜索方法,例如

public function search() {
        $criteria = new CDbCriteria;
        $criteria->compare('id', $this->id, true);
        $criteria->compare('title', $this->title, true);
        $criteria->order = 'sortOrder';
        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

然后在你的视图文件中你就可以使用这段代码了;

$this->widget('widgets.CListView', array(
    'dataProvider' => $model->search(),
    'itemView' => '_list',
    'template' => '{pager}{items}',
    'pager' => array(
        'nextPageLabel' => 'Следваща',
        'prevPageLabel' => 'Предишна',
    )
));

【讨论】:

    【解决方案2】:

    您可以通过将其放入您的扩展文件夹来扩展 CListView,并在那里更改页面大小。

    <?php
    Yii::import('zii.widgets.CListView');
    
    class CustomListView extends CListView {
        public function init() {
            if ($this->dataProvider !== null)
                $this->dataProvider->pagination->pageSize = 30;
    
            $this->dataProvider->pagination->nextPageLabel => 'Следваща';
            $this->dataProvider->pagination->prevPageLabel => 'Предишна';
            parent::init();
        }
    }
    

    然后,使用 CustomListView 如下:

    <?php $this->widget('CustomListView', array(
        'dataProvider'=>$dataProvider,
        'itemView'=>'_view',
    )); ?>
    

    您不需要通过这种方式直接使用CLinkPager 小部件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-28
      • 2021-05-22
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      相关资源
      最近更新 更多