我有一些控制器逻辑:
public function seafood() {
$this->set('title', 'Seafood restaurants in and near Gulf Shores, AL');
$this->paginate['Restaurant']=array(
'limit'=>9,
'order' => 'RAND()',
'conditions'=>array(
'Restaurant.active'=>1,
'Restaurant.seafood'=>'Seafood'
)
);
$data = $this->paginate('Restaurant');
$this->set('seafood', $data);
}
这会重复13次,有13个不同的视图页面标有“海鲜,海滨,牛排馆”等。视图完全相同,真实情况相同,除了控制器必须通过特定类型的餐厅找到。有人可以向我解释如何制作一个可以在www.site.com/restaurants/seafood上显示的视图文件吗?
说实话,我的所有结果页面都有一些变化。我告诉蛋糕分页(并且通常包含)某些模型的数据,然后将其粘贴到与所有其他页面几乎相同(带有图标或两个差异)的视图中。我正在建设一个网站,这是“在x海滩小镇做的事情之一”,所以我有餐厅,住宿地点,购物,夜总会,高尔夫球场等(这里到处都是)。
我的老板给了我这个庞大的网站来构建,我真的不太了解任何编程逻辑。我想在这里坚持DRY概念,这样我才能真正学到这些东西。
更新
好的,我确保我的路线在文件中有这个:
Router::connect('/restaurants/:action', array('controller'=>'restaurants'));
我保存了我的seafood.ctp文件,然后取出了我的海鲜()函数并将其插入:
public function restaurants($restaurantType) {
$this->set('title', $restaurantType.' restaurants in and near Gulf Shores, AL');
$this->paginate['Restaurant']=array(
'limit'=>9,
'order' => 'RAND()',
'conditions'=>array(
'Restaurant.active'=>1,
'Restaurant.seafood'=>$restaurantType
)
);
$data = $this->paginate('Restaurant');
$this->set($restaurantType, $data);
}
当我访问www.site.com/restaurants/seafood的页面时,蛋糕告诉我,我的控制器缺少方法海鲜()。我错过了什么?
答案 0 :(得分:1)
为什么不给控制器操作一个通用名称,如
public function restaurant($restaurantType) {
// Pass the parameter in via the URL for the restaurant type and use that parameter
// as your find condition as well as the value for the title of the page
}
然后,您链接的网址就会显示出来 http://www.whatever.com/restaurant/seafood
答案 1 :(得分:1)
试试这个:
Router::connect('/restaurants/:restaurantType', array('controller'=>'restaurants', 'action' => 'restaurants'));
它找不到它的原因是因为你仍在使用标准:action参数。您只需要更改它以使操作保持不变,这样就可以将其作为参数传递给操作。