2011-07-22 115 views
1

我想制作一个记住搜索表单输入的CListView。我的应用程序将每个搜索输入(以及用户查看的当前页面)保存到用户会话中,并将搜索ID添加到分页参数中。在Yii CLinkPager首页链接中显示“page = 1”参数

$pagination = array(
    'pageVar' => 'page', 
    'currentPage' => $currentPage - 1, 
    'params' => array(
     'search' => $searchId, 
    ) 
); 

但由于在CLinkPager第一页的链接不显示页面= 1“参数,每次我点击其他网页的链接(比如2页),应用程序会认为我需要的电流'搜索'(当前页面值为2)。

为了解释这个问题,有没有什么办法让CLinkPager在第一页的链接显示param'page = 1'?或者你对这个处理另一个建议:)

感谢

编辑

我总体的代码如下。如果你想给一个更好的建议,请做:)

public function actionIndex() { 

      $model = new User(); 
      if (isset($_POST['User'])) { 
        $model->setAttributes($_POST['User']); 
      } else { 
        if (isset($_GET['search'])) { 
          $searchId = $_GET['search']; 
          //Just getting a variable stored in the session 
          //array(
          //  $searchId => array(
          //   'model' => $model //the search model 
          //   'pageSize' => $pageSize //current pagination page size 
          //   'currentPage' => $currentPage //the search model 
          // ) 
          //); 
          $search = Yii::app()->user->getSearch($searchId); 
          $model->setAttributes($search['model'], false); 
          $currentPage = $search['currentPage']; 
          $pageSize = $search['pageSize']; 
        } else { 
          //create default search 
        } 
      } 

      //Managing pageSize parameter 
      if (isset($_GET['pageSize'])) { //Check whether there is pageSize in $_GET parameters 
        if (in_array($_GET['pageSize'], $this->getPageSizes())) { 
          $pageSize = $_GET['pageSize']; 
        } else { 
          $pageSize = self::DEFAULT_SEARCH_PAGESIZE; 
        } 
      } else if (!isset($pageSize)) { //Check whether pageSize is already defined before 
        $pageSize = self::DEFAULT_SEARCH_PAGESIZE; 
      } 
      //Managing currentPage parameter 
      if (isset($_GET['page'])) { //Check whether there is page parameter in $_GET parameter 
        $currentPage = $_GET['page']; 
      } else if (!isset($currentPage)) { //Check whether page is already defined before 
        $currentPage = self::DEFAULT_CURRENT_PAGE; 
      } 

      //Saving all into new session 
      $newSearch = array(
        'model' => $model->getAttributes(), 
        'currentPage' => $currentPage, 
        'pageSize' => $pageSize, 
      ); 
      //Check whether if there is a search before and if it exists check whether the two search is the same 
      if (!isset($search) || (serialize($search) != serialize($newSearch))) { 
        //Saves into session 
        $searchId = Yii::app()->user->saveSearch($newSearch); 
      } //else use the old search id 

      //----------------------------------------------------- 
      //Building the search 
      //Setting criteria 
      $criteria = new CDbCriteria(array(
            'select' => array(
              '*', //just to simplify things 
            ), 
          )); 


      //Appending criteria to search model used 
      $criteria = $model->search($criteria); 

      //Appending pagination to current variables 
      $pagination = array(
        'pageSize' => $pageSize, 
        'pageVar' => 'page', 
        'currentPage' => $currentPage - 1, 
        'params' => array(
          'search' => $searchId, //include the search ID in the link pager request URL 
        ) 
      ); 

      //Creating dataProvider for the search 
      $dataProvider = new CActiveDataProvider('Property', array(
            'criteria' => $criteria, 
            'pagination' => $pagination, 
          )); 
      //Rendering 
      $this->render('index', array(
        'dataProvider' => $dataProvider, 
        'pageSize' => $pageSize, 
        'model' => $model, 
        'searchId' => $searchId, 
      )); 
} 

回答

2

你也许可以通过修改createPageUrl方法延长CPagination和删除/修改if($page>0)条件永远是正确的。 (或者更好的是,添加一个附加参数来打开/关闭该行为。)

+0

我在考虑扩展CPagination。我正在研究是否有更好的方法。但我很高兴有一个人也这么认为。谢谢。 :) –

+1

没有写你自己的寻呼机,我没有看到,因为这个逻辑是硬编码的功能。您可以提交功能请求以修改其将来的工作方式。 – ldg

+0

扩展类非常简单,工作得很好。 :) http://pastebin.com/DJzYp6Sv –