2012-04-18 105 views
0

我在分頁搜索結果時遇到問題。我的設置如下。CakePHP:在模型中使用搜索邏輯進行分頁

我有一個myapp.com/searches/products與查看(搜索窗體).../app/views/searches/products.ctp的搜索表單。我正在使用Searches控制器,該控制器對此搜索查詢使用Product模型。 Product使用搜索邏輯($this->find(...))執行操作search()。搜索結果顯示在視圖中的表單下方。

我該如何去執行類似於$this->paginate()的操作,這通常是在控制器中完成的?另外,我想知道我的設置是否有問題,特別是包含表單和搜索結果的視圖。

回答

3

一個保持模型的搜索邏輯,並在控制器仍然分頁方法是做到這一點:

說明:

而是從模型返回的實際結果的,只要返回任何/全部找到選項,然後像通常那樣進行分頁。對於一些例子,如下面這個簡單的例子,它可能看起來有點過分,但它爲您的find(),如containorder,group,joins,conditions等等等等增加了更多的選擇空間。與「胖模型,瘦控制器」的口頭禪。

設置您的find() s這樣的選項也很好,因此它可以輕鬆地在整個網站中重複使用 - 只需傳遞不同的選項,您就可以輕鬆前往。

代碼:

/* CONTROLLER 
*/ 
$opts = array('paginate' => true, 'limit'=>20); 
$paginateOptions = $this->Event->getEvents($opts); 
$this->paginate = $paginateOptions; 
$data = $this->paginate('Event'); 

/* MODEL 
*/ 
public function getProducts($opts = null) { 

    $params = array(); 

    //limit 
    $params['limit'] = 50; //default 
    if(!empty($opts['limit'])) $params['limit'] = $opts['limit']; 

    //paginate option 
    $paginate = false; 
    if(isset($opts['paginate'])) { 
     if($opts['paginate']) $paginate = true; 
    } 

    //either return the options just created (paginate) 
    if($paginate) { 
     return $qOpts; 

    //or return the events data 
    } else { 
     $data = $this->find('all', $qOpts); 
     return $data; 
    } 
} 

有辦法寫的代碼,這個有點更薄/更小線 - 但是我喜歡這樣寫它,所以它是快速理解。

(似乎沒有要什麼不對您的整體結構。)

0

我通常用它來存儲在會話搜索參數和處理控制器動作裏面的一切。

function indexbystatus() { 
    $this->set('title_for_layout','List Assets by Status'); 
    $this->Session->write('sender',array('controller'=>'assets','action'=>'indexbystatus')); 
    $searchkey=$this->Session->read('Searchkey.status'); 
    $conditions=''; 
    if($searchkey) { 
     $conditions=array('Asset.status_id'=>$searchkey); 
    } 
    if(!empty($this->data)) { 
     // if user has sent anything by the searchform set conditions and 
     // store it to the session but if it is empty we delete the stored 
     // searchkey (this way we can reset the search) 
     if($this->data['Asset']['status_id']!='') { 
      $conditions=array('Asset.status_id'=>$this->data['Asset']['status_id']); 
      $this->Session->write('Searchkey.status',$this->data['Asset']['status_id']); 
     } else { 
      $this->Session->delete('Searchkey.status'); 
      $conditions=null; 
     } 
    } else if($searchkey) { 
     // if no data from the searchform we set the stored one 
     // from the session if any 
     $this->data['Asset']['status_id']=$searchkey; 
    } 
    $this->paginate=array(
         'limit'=>25, 
         'order'=>array('Asset.status_id'=>'asc'), 
         'conditions'=>$conditions, 
         ); 
    $this->set('assets',$this->paginate()); 
    $statuses=$this->Asset->Status->find('list'); 
    $this->set('statuses',$statuses); 
} 

我只是喜歡它更多地處理它在控制器的動作不是模型,所以我可以有通過行動不同的解決方案和邏輯。