我正在cakephp中创建一个简单的网站。
我在“元素”中保留了页眉和页脚,但我的问题是标题菜单来自数据库,在我调用函数之前它不可用。
我希望一旦控制器被调用,菜单的功能就应该被自己调用。
答案 0 :(得分:3)
在AppController中添加:
function beforeFilter(){
$this->set('menu', $this->YourModel->findById('Id of your menu data row in database'));
}
然后,在视图中,可以通过调用echo $menu['yourModel']['menu'];
答案 1 :(得分:1)
<强> TLDR:强>
不是每次加载整个控制器(或所有控制器)时调用该函数,最好在加载element
时调用该函数。这使您可以更加灵活地前进。例如,登录屏幕可能不需要菜单 - 或者你最终可能会添加一个具有不同菜单的管理工具......等等。
CakePHP使用requestAction()
使这非常容易 - 请在此处阅读更多内容:http://book.cakephp.org/2.0/en/views.html#passing-variables-into-an-element
旁注:将所有查询保留在模型中,而不是直接从控制器中调用它们也是理想的(MVC模式和许多其他原因)。
示例代码:
/**
* MenusController (or any other controller you want)
*/
public function get_menu_main() {
$this->set('menu', $this->Menu->getMenuMain());
}
public function get_menu_footer() {
$this->set('menu', $this->Menu->getMenuFooter());
}
/**
* Menu model
*/
public function getMenuMain() {
return $this->findById('12345');
}
public function getMenuFooter() {
return $this->findById('67891');
}
然后,在您的元素中,只需使用requestAction
来检索该特定元素所需的数据:
/**
* MainMenu element
*/
$menu = $this->requestAction('menus/get_menu_main/');
/**
* FooterMenu element
*/
$menu = $this->requestAction('menus/get_menu_footer/');
旁注:要更合适一点,您可以使用$this->Html->url()
代替对操作的网址进行硬编码。
旁注:有些代码可能看起来像是在你不需要它时添加额外的代码,但是通过将它们分解到正确的MVC位置,你的代码会更加清晰更灵活/可升级......等等。养成这样做的习惯会让事情变得更容易,当事情开始变得更加复杂。 (实际上,上面的代码添加了几行,但就复杂性而言,我认为比在AppController中加载一个元素的变量更容易理解./ endrant