2012-01-31 2 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

+0

Да, вы можете переместить запрос в модель, чтобы уменьшить размер контроллера. '$ this-> Paginator-> settings = $ this-> Unit-> getQuery();', затем получить результаты, $ r = $ this- > Paginator-> paginate ($ this-> Unit); ' – Wylie

+0

Является ли это для постраничных результатов или помощником Paginator для отображения ссылок на разбитые на страницы результаты? И этот код входит в контроллер? Плюс, когда я пытался переместить страницу код в модель Я не был уверен, что у меня правильный синтаксис. – huzzah