如何创建动态导航菜单cakephp

use*_*247 3 cakephp cakephp-1.3 cakephp-1.2

如何从类别和子类别构建导航菜单,如下所示:

HTTP:// mysite的/类别/视图/ 1/2

我尝试过菜单构建器1.01但它只适用于acl用户.我也阅读了本教程,但没有用.

Ope*_*ess 23

您的第一个链接不起作用.

坦率地说,我甚至不确定我理解你要做什么.你提供的第二个链接 - 我承认我只查看了第一个代码片段 - 不使用数据库表.如果您希望菜单是动态的,就像在基于控制器的操作中一样,这是有意义的.如果你希望它是"动态的",就像动态控制你希望能够拥有CRUD访问权限的菜单项一样(你知道CRUD代表什么,对吧?),这是一个不同的(真的很简单)的故事.

这是可以想象的最基本,最简单的例子.在我的沙盒Cake 1.3.12安装中,我在十五分钟内将它们拼凑在一起.我很确定我已经更改了Cake 2约定的所有名称,但是可能需要进行一些调整.我试图将其削减到绝对基础,并尽可能保持代码清晰.根据自己的需要进行构建.请参阅食谱并记住始终遵循蛋糕惯例.

  1. 创建一个名称类似的表menus.
  2. 创建一个名为的模型menu.php.
  3. 创建一个MenusController.php.
  4. 创建/Views/Menus目录,然后/views/Elements/Menus.

    CREATE TABLE menus( idint(11)unsigned NOT NULL auto_increment, namevarchar(255)NOT NULL default'', controllervarchar(255)NOT NULL, actionvarchar(255)NOT NULL, createddatetime NOT NULL, modifieddatetime default NULL,PRIMARY KEY(id))ENGINE = InnoDB DEFAULT CHARSET = utf8;

型号代码 - Menu.php:

<?
class Menu extends AppModel {
    var $name = 'Menu';
}
Run Code Online (Sandbox Code Playgroud)

控制器代码 - MenusController.php:

<?
class MenusController extends AppController {
var $name = 'Menus';

function index() {
    if (isset($this->params['requested']) && $this->params['requested'] == true) {
        $menus = $this->Menu->find('all');
        return $menus;
    } else {
        $this->set('menus', $this->Menu->find('all'));
    }
}

function add() {
    if (!empty($this->data)) {
        if ($this->Menu->save($this->data)) {
            $this->Session->setFlash(__('The menu item has been saved', true));
        }
    }
}

    // Build out additional CRUD functionality, 
    // for example edit / view / delete, as desired.

}
Run Code Online (Sandbox Code Playgroud)

每个MenusController操作都需要一个[action name] .ctp文件/view/menus/.

所以创造/views/menus/index.ctp/views/menus/add.ctp.您放在/views/menus/index.ctp中的内容甚至不是非常重要,而/views/menus/add.ctp是您将用于根据需要添加新菜单项的表单:

<div class="menus form">
<?php echo $this->Form->create('Menu');?>
    <fieldset>
        <legend><?php __('Add Menu Item'); ?></legend>
<?php
    echo $this->Form->input('name');
    echo $this->Form->input('controller');
    echo $this->Form->input('action');
?>
    </fieldset>
    <?php echo $this->Form->end(__('Submit', true));?>
</div> 
Run Code Online (Sandbox Code Playgroud)

现在,创建/views/elements/menus/main.ctp:

<ul class="header main-menu">
<? if (!isset($menus) || empty($menus)) :
        $menus = $this->requestAction('/menus/index');
    endif; 
    foreach($menus as $menu) : 
?>
    <li>
    <?="<a href='".DS.$menu['Menu']['controller'].DS.$menu['Menu']['action']."'>".$menu['Menu']['name']."</a>"; ?>
    </li>
<? endforeach; ?>
</ul>
Run Code Online (Sandbox Code Playgroud)

最后,将元素放在布局中,使其显示在每个页面上,而不管视图如何.如果您使用的是默认蛋糕布局,则表示您应该进行编辑/views/layouts/default.ctp.您可能希望将此项目放在合适的位置,例如<div id="header">元素.element()按如下方式插入呼叫:

<div id="header">
    <!-- whatever markup, code, etc. you may have in the header is fine. -->
    <?= $this->element('menus/main'); ?>
</div>
<!-- ...the rest of your layout continues... -->
Run Code Online (Sandbox Code Playgroud)

可能需要在元素中添加样式以使其可读.根据需要将样式添加到您可能具有的任何样式表(默认为cake.generic.css).

HTH.这本食谱是你的朋友.