2012-01-31 51 views
0

我的控制器邏輯中有許多函數,每個函數都有一些邏輯可以爲一組「特色」單元提取數據。這些單位有好幾頁。我該如何着手讓所有需要它的4個視圖都可以使用這一邏輯?在我的cakephp控制器中,我不斷重複每個函數中的邏輯,以查看代碼

作爲參考,這是我的控制器邏輯的一部分:

public function index() { 
     $this->set('title', 'All accommodations available in and near Gulf Shores, AL'); 


$this->Unit->Behaviors->attach('Containable'); 
    $this->Unit->contain(
     array(
     'User'=>array(
      'id'), 
     'Location', 
     'Complex'=>array('location_id'), 
     'Image'=>array(
      'logo','img1' 
      ) 
     ) 
     ); 
    $c=$this->Unit->find('all', 
     array(

     'limit'=>3, 
     'conditions'=>array(
      'active'=>1, 
      'featured'=>1 
     ) 
     ) 
    ); 
    $this->set('featured', $c); 





$this->paginate['Unit']=array(
     'limit'=>9, 
     'order' => 'RAND()', 
     'contain'=>array(
       'User'=>array('email'), 
       'Complex'=>array('location_id','complex_website'), 
       'Location', 
       'Image' 
       ), 
     'conditions'=>array(

       'Unit.active'=>1) 
    ); 
$data = $this->paginate('Unit'); 
$this->set('allaccommodations', $data); 

    } 
    public function houses() { 

$this->set('title', 'Home rentals available in Gulf Shores'); 

$this->Unit->Behaviors->attach('Containable'); 
    $this->Unit->contain(
     array(
     'User'=>array(
      'id'), 
     'Location', 
     'Complex'=>array('location_id'), 
     'Image'=>array(
      'logo','img1' 
      ) 
     ) 
     ); 
    $c=$this->Unit->find('all', 
     array(

     'limit'=>3, 
     'conditions'=>array(
      'active'=>1, 
      'featured'=>1 
     ) 
     ) 
    ); 
    $this->set('featured', $c); 






$this->paginate['Unit']=array(
     'limit'=>9, 
     'order' => 'RAND()', 
     'contain'=>array(
       'User'=>array('email'), 
       'Location', 
       'Image' 
        ), 
     'conditions'=>array(
       'Unit.type'=>array('house', 'rentalco'), 
       'Unit.active'=>1) 
    ); 
$data = $this->paginate('Unit'); 
$this->set('allhouses', $data); 



} 
... 

我有設置一個「功能的」變量,它是提供給視圖其它兩個功能。我相信有這樣一種更好/更有效的方法嗎?

回答

1

是的,這個想法是讓你的模型中有所有的數據交互,並讓你的控制器清晰易懂。胖模型,瘦身控制器。有自定義發現你可以使用:http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#creating-custom-find-types

但我更喜歡只是做一個模型函數,因爲他們更容易在IDE中使用代碼完成和文檔。所以對於功能的找到您繼續使用,你可以做一些你的單位的模型,如:

public function getFeatured($limit) { 
    $results = $this->find('all', array(
     'limit' => $limit, 
     'conditions' => array(
      'active' => 1, 
      'featured' => 1 
      ) 
     ) 
    ); 

    return $results; 
} 

然後在UnitController:

$this->set('featured', $this->Unit->getFeatured(3)); 
+0

這工作就像一個魅力!我也在玩這個模型中的paginate方法,但是a)我正在閱讀模型中的分頁是不好的2)我不能讓它在任何情況下工作3)它取決於單元是什麼「類型」(我認爲我可以傳遞一個名爲$ type的變量,所以,現在,我將所有的代碼都留在我的控制器中,即使絕大多數的位都是重複的) – huzzah 2012-01-31 04:44:26

+0

是的,您可以將查詢移動到模型中以減少控制器的數量,'$ this-> Paginator-> settings = $ this-> Unit-> getQuery();',然後獲得結果'$ r = $ this- > Paginator-> paginate($ this-> Unit);' – Wylie 2012-01-31 08:29:06

+0

這是爲分頁結果還是Paginator幫助程序顯示分頁結果的鏈接?而且這段代碼是否進入控制器?另外,當我嘗試移動分頁時代碼到模型中我不確定我的語法是否正確 – huzzah 2012-01-31 20:48:00

相關問題