我的控制器逻辑中有许多功能,对于每一个我都有一些逻辑可以为“特色”单元提取数据。这些单位有几页。我如何将这一个逻辑提供给需要它的所有4个视图?
作为参考,这是我的控制器逻辑的一部分:
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);
}
...
我还有两个其他功能可以设置视图可用的“特色”变量。我确定有更好/更有效的方法来做到这一点?
答案 0 :(得分: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));