我正在 cakephp 中创建一个简单的网站。
我在“元素”中保留了页眉和页脚,但我的问题是页眉菜单来自数据库,在我调用函数之前它不可用。
我希望一旦控制器被调用,菜单的功能就应该被自己调用。
我正在 cakephp 中创建一个简单的网站。
我在“元素”中保留了页眉和页脚,但我的问题是页眉菜单来自数据库,在我调用函数之前它不可用。
我希望一旦控制器被调用,菜单的功能就应该被自己调用。
在您的 AppController 中添加以下内容:
function beforeFilter(){
$this->set('menu', $this->YourModel->findById('Id of your menu data row in database'));
}
然后,在视图中,可以通过调用来访问菜单echo $menu['yourModel']['menu'];
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');
}
然后,在您的元素中,只需使用 arequestAction
来检索该特定元素所需的数据:
/**
* MainMenu element
*/
$menu = $this->requestAction('menus/get_menu_main/');
/**
* FooterMenu element
*/
$menu = $this->requestAction('menus/get_menu_footer/');
旁注:为了更恰当一点,您可以使用$this->Html->url()
而不是将 URL 硬编码到操作中。
旁注: 当您不需要时,其中一些代码可能看起来像添加额外的代码,但是通过将它们分解为正确的 MVC 位置,您的代码将更清洁、更灵活/可升级......等等等等。当事情开始变得更加复杂时,养成做这样的事情的习惯会让你的生活更轻松。(实际上,上面的代码添加了几行代码,但就复杂性而言,我认为它比在 AppController 中为元素加载变量的查询更容易理解。/endrant