0

我正在 cakephp 中创建一个简单的网站。

我在“元素”中保留了页眉和页脚,但我的问题是页眉菜单来自数据库,在我调用函数之前它不可用。

我希望一旦控制器被调用,菜单的功能就应该被自己调用。

4

2 回答 2

3

在您的 AppController 中添加以下内容:

function beforeFilter(){
    $this->set('menu', $this->YourModel->findById('Id of your menu data row in database'));
}

然后,在视图中,可以通过调用来访问菜单echo $menu['yourModel']['menu'];

于 2012-11-28T11:29:51.990 回答
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');
}

然后,在您的元素中,只需使用 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

于 2012-11-28T15:28:45.873 回答