2012-02-21 44 views
0

我發現在我的一些控制器方法中,我必須對只有一個或兩個條件在不同方法之間變化的結果進行分頁。我還需要選擇不分頁。作爲一個完整的編程新手,我想練習DRY,並學習瞭如何在代碼控制器之前爲我的模型準備可能的分頁。我根據this Stack Overflow question中的答案開始在我的模型中構建查詢。不幸的是,問這個問題的人並沒有包含他們代碼的第一部分,所以我對他們的模型查詢的第一部分看起來真的很感慨。當我使用下面的代碼時,Model上會出現兩個非法的偏移類型錯誤。下面是我的模型代碼:準備我的模型在cakephp中分頁結果

<?php class Unit extends AppModel { 
public $name='Unit'; 
public $actsAs = array('Containable'); 
public $belongsTo=array(
'User', 
'Complex', 

'Location', 
); 

public $hasOne=array(
    'Image' 
    ); 
function getListings() { 
    $paginate=array(); 
     $qOptions=array(); 
    $this->contain(array(
        'User'=>array('id'), 
        'Location', 
        'Complex', 
        'Image' 
        ) 
      ); 
    if($paginate) { 
     return $qOptions; 
     } 
    else { 

     $data= $this->find('all', $qOptions); 
     return $data; 
    } 
} 
} 
?> 

這裏是我的控制器方法:

<?php 
class LodgingsController extends AppController { 
    public $name='Lodgings'; 

    public $layout='pagelayout'; 
    public $uses=array('User', 'Unit', 'Location'); 
    public $helpers=array('Text','Html','Js','GoogleMapV3'); 

    public $paginate=array(); 


public function debug() { 

    $qOptions=array('conditions'=>array('Unit.active'=>1, 'Unit.type'=>'condo'), 'limit'=>9, 'order'=>array('Unit.id'=>'asc')); 
    $opts['paginate'] = true; 
    $paginateOptions=$this->Unit->getListings($opts); 
    $this->paginate=$paginateOptions; 
    $stuff=$this->paginate('Unit'); 
    $this->set('units', $stuff); 



} 

} 
?> 

回答

1

我個人認爲有很多你正在嘗試做這樣的方式開銷。該模型足夠簡單,可以從控制器調用分頁。我的第一選擇是將其保存在控制器中。如果邏輯更復雜,我會說移動它。但是你在做什麼是直截了當的。這是我將如何在控制器中完成的。

<?php 

function yourFunction() { 
    $this->Model->recursive = -1; 
    if ($paginate == 'true') { 
     $this->set('models', $this->paginate(set_options_here)); 
    } else { 
     $this->set('models', $this->Model->find('all', array(set_options_here)); 
    } 
} 
?> 
+0

謝謝。我認爲這樣做會更簡單,但我相信你的建議,從你的堆棧溢出點來判斷!實際上,從每個控制器方法來做,我不需要做if語句,因爲我知道我將會或不會在每種方法中進行分頁。所以我想我會繼續像我一樣繼續做我的控制器方法。你能否向我解釋一下爲什麼我試圖做的是大量的開銷? – huzzah 2012-02-21 21:13:03

+0

當您嘗試爲每個函數執行多個操作時,代碼變得複雜。你的模型函數試圖根據你傳遞的信息做兩件事。如果你想這樣做,你應該真的把它們分成兩個功能。例如,您可以將它們命名爲getAllListings和getPaginatedListings。根據名稱,每個函數的作用和您要返回的數據都非常清楚。但是有一個函數可能做多件事情,只會讓代碼不必要的複雜......在我看來。保持簡單和乾淨是我的座右銘。 – 2012-02-22 01:44:41

+0

有人建議我以前保持與我一直在做的相反的「肥胖模型/瘦身控制器」,主要是因爲Cake手冊在控制器中做了所有事情,並且因爲我正確地傳遞了參數,所以我似乎很不穩定正確地說出我的功能。謝謝你的洞察力。我希望能夠像你一樣在你身上碰到更多的導師類型! – huzzah 2012-02-22 14:58:35