使用Yii搜索结果的分页

时间:2013-12-22 16:11:55

标签: php search yii pagination

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

以下是我的搜索和分页代码段:

$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链接不会执行任何操作。

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

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

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

我认为你可能会使这个过程过于复杂。您可以更轻松地使用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' => 'Предишна',
    )
));

答案 1 :(得分:0)

您可以通过将此文件放在您的扩展文件夹中来扩展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小部件。