2013-12-22 170 views
0

我有一個搜索表單,它返回一堆圖像。由於他們的人數可能很高,我寧願使用分頁顯示結果。但是,我似乎無法讓它正常工作。我已將所有內容都移到了視圖中,以儘可能簡化事情。使用Yii搜索結果分頁

這裏是我的搜索和分頁代碼片段:

$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() - > findAll()的數據。

如何說明分頁控件與搜索結果之間的關係...?

謝謝你的時間。

+1

[在這個網站採取lokk](http://www.yiiframework.com/forum/index.php/topic/25901-pagination-solution-simple-and-complex-ways/) –

+0

這不完全是我在找什麼,但是我從鏈接中獲得了一些靈感,並設法解決了我的問題。真誠的謝謝! 訣竅是從$ model-> search()獲取查詢條件,然後在該條件下使用$ model-> findAll()。 – NovaLogic

回答

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' => 'Предишна', 
    ) 
)); 
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部件直接這樣。