【问题标题】:cakephp one view for many types of resultscakephp 一种查看多种类型的结果
【发布时间】:2012-01-31 06:44:01
【问题描述】:

我有一些控制器逻辑:

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 上的视图文件吗?

说实话,我所有的结果页面都在此基础上有所不同。我告诉 cake 对某些模型的数据进行分页(通常包含),然后将其粘贴到与所有其他页面几乎相同(带有一个或两个图标)的视图中。我正在建立一个网站,它是“在 x 海滩小镇可以做和看到的事情”之一,所以我有餐馆、住宿地点、购物场所、夜总会、高尔夫球场等(到处都是)。

我的老板给了我这个庞大的网站来构建,我真的不太了解任何编程逻辑。我想在这里坚持 DRY 概念,这样我才能真正了解这些东西。

更新

好的,我确保我的路线在文件中有这个:

Router::connect('/restaurants/:action', array('controller'=>'restaurants'));

我保留了我的seafood.ctp 文件,然后取出了我的seafood() 函数并将其插入:

 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 cake 的页面时,告诉我我的控制器缺少方法 seafood()。我错过了什么?

【问题讨论】:

  • 我认为您在尝试更改路由时搞砸了。 Router::connect('/restaurants/:action', array('controller'=>'restaurants')); 你告诉它把餐馆后面的任何东西都当作一个动作,而实际上restaurants 是动作,后面是参数,所以现在它很自然地告诉你它找不到函数名称@ 987654326@
  • 我删除了 router::connect 规则,但它仍然给我控制器错误中缺少的 seafood()。
  • 错误指向的控制器名称是什么,您的实际控制器名称是什么?我认为您只是对如何定义 URL 有疑问。它应该类似于 www.mysite.com/controllername/actionname/parameter。这就是 cake 在解析该 URL 时所寻找的内容。
  • 说问题出在 RestaurantsController 中。
  • 而我的实际控制人是餐馆

标签: controller cakephp-2.0 cakephp-model


【解决方案1】:

试试这个:

Router::connect('/restaurants/:restaurantType', array('controller'=>'restaurants', 'action' => 'restaurants'));

找不到它的原因是您仍在使用标准的 :action 参数。你只需要改变它,让动作保持不变,这样它就会作为参数传递到动作中。

【讨论】:

  • 好的,在我的控制器中摆弄了很多之后,使用这个就是票。谢谢!
【解决方案2】:

你为什么不给控制器动作一个通用名称,比如

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

}

然后您的链接 URL 将显示为 http://www.whatever.com/restaurant/seafood

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-21
    • 2016-09-20
    • 2013-05-13
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多