2012-02-21 7 views
0

私はいくつかのコントローラメソッドで、メソッド間で1つまたは2つの条件が変化するだけで結果をページ付けする必要があることを見出しています。私はまた、時々改ページしないという選択肢が必要でした。完全なプログラミングnewbとして、私はDRYを練習したいので、コントローラーをコーディングする前にページングの可能性をモデル化する方法を学ぶことに慣れました。私はthis Stack Overflow questionの答えに基づいて私のモデルで私のクエリを構築し始めました。残念ながら、質問をした人にはコードの最初の部分が含まれていなかったので、モデルクエリの最初の部分がどのように見えるかは本当に迷っています。以下のコードを使用すると、モデルに2つの不正なオフセットタイプエラーが発生します。私は個人的にあなたがこれをやろうとしている方法で、多くのオーバーヘッドがあると思い私のモデルをcakephpの結果にページ区切りを設定する

<?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 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 

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

+0

関数ごとに複数のことをしようとすると、コードが複雑になります。モデル関数は、渡した情報に基づいて2つのことをしようとしていました。それをやりたければ、実際にそれらを2つの関数に分割する必要があります。例えば、それらの名前を 'getAllListings'と' getPaginatedListings'とすることができます。名前だけに基づいて、それぞれの機能が何をしているのか、そしてあなたが返すデータは非常に明確です。しかし、おそらく複数のことをする機能を持たせるだけで、コードが不必要に複雑になってしまうのです。私の意見では。シンプルで清潔に保つことが私のモットーです。 –

+0

誰かが以前私がやっていたこととは反対の「太ったモデル/皮肉なコントローラー」を保つように私にアドバイスしました。なぜなら、Cakeのマニュアルはコントローラーのすべてをやっているからです。私の機能を正しく語ります。その洞察をいただきありがとうございます。私はあなたのようなより多くのメンターのタイプに就きたいと思っています! – huzzah

関連する問題