CakePHP中的动态布局

时间:2010-01-31 21:31:21

标签: model-view-controller cakephp layout

对于问题标题感到抱歉,但我找不到更合适的方式来表达这一点。

我目前正在构建一个支持CakePHP的网站,我不太确定如何解决以下问题。该网站看起来像下面的样式:

Website Mockup http://i49.tinypic.com/157mn7.jpg

灰色区域是布局的一部分,因为它们的内容在视图之间不会改变。在侧边栏中,我有一组链接到多个模型的广告。我需要控制器逻辑来确定与广告相关联的图片。此外,广告列表必须是动态的。我应该把构建侧边栏的逻辑放在哪里?

我想过:

  • 将逻辑放入AppControllerbeforeFilter / afterFilter) - 问题是我无法使用我需要的控制器逻辑(其他控制器继承自AppController },我不确定如何在那里使用它们。
  • 制作组件 - 是否可以构建依赖控制器的组件?
  • 在所有呈现视图的控制器中复制侧边栏代码 - 这对我来说似乎有些愚蠢。

什么是 Cake方式


更新

经过一些阅读和实验,我已经完成了大部分的重构。

我通过在模型中移动用于构建广告的逻辑(消除了检索图片的组件)而不是使用requestAction来获得最佳性能。它几乎快三倍,代码看起来好多了。

4 个答案:

答案 0 :(得分:5)

我猜答案是requestAction,以防结果可以缓存:

http://book.cakephp.org/view/434/requestAction

答案 1 :(得分:4)

我为数据驱动导航做了类似的事情。我把我的逻辑放在AppController::beforeRender中并且没有任何问题。我不确定我理解你对控制器继承的关注。我通过以下方式检索我的菜单:

$menus = $this->NavMenuItem->groupByMenu();
$this->set( compact( 'menus' ) );

然后我创建了一个呈现菜单的元素。它由布局执行:

<?php echo $this->element( 'navigation', array( 'id' => 'secondary', 'menu' => $menus['SECONDARY'] ) ) ?>

如果这没有帮助,也许您可​​以在评论中进一步解释控制器继承的问题。

答案 2 :(得分:2)

可以这样做:

  1. 创建有助于布局广告块的元素
  2. 创建一个或多个控制器,以生成呈现块所需的数据
  3. 使用 requestAction 从模型和元素中获取数据。
  4. 检查蛋糕书,有一个元素的示例,其中来自Post Model的数据用于显示最新/最新的5个帖子。我觉得你的要求与它非常相似。

答案 3 :(得分:2)

亚历,

您收到SQL错误,因为build()函数必须位于补充工具栏模型中,而不是控制器。此外,您不一定需要使用$ user = array('Sidebar');您可以在所有模型中调用Sidebar:

$Sidebar = ClassRegistry::init('Sidebar');然后$Sidebar->find();$Sidebar->build();

或者,如果您只需要从补充工具栏模型中调用build()函数,则可以执行以下操作:

  $sidebar = ClassRegistry::init('Sidebar')->build();
  $this->set('sidebar', $sidebar);

干杯。