如何创建动态导航菜单cakephp

时间:2011-12-05 13:27:28

标签: cakephp cakephp-1.3 cakephp-1.2

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

http://mysite/categories/view/1/2

我尝试过菜单构建器1.01,但它仅适用于acl用户。 我也读了这个tutorial,但没有帮助。

1 个答案:

答案 0 :(得分:23)

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

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

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

  1. 创建一个名称为menus
  2. 的表格
  3. 创建名为menu.php的模型。
  4. 创建MenusController.php
  5. 创建/Views/Menus目录和/views/Elements/Menus

    CREATE TABLE menus(     id int(11)unsigned NOT NULL auto_increment,     name varchar(255)NOT NULL default'',     controller varchar(255)NOT NULL,     action varchar(255)NOT NULL,     created datetime NOT NULL,     modified datetime默认为NULL,     主要关键(id) )ENGINE = InnoDB DEFAULT CHARSET = utf8;

  6. 型号代码 - Menu.php:

    <?
    class Menu extends AppModel {
        var $name = 'Menu';
    }
    

    控制器代码 - 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.
    
    }
    

    每个MenusController操作都需要/view/menus/中的 [操作名称] .ctp文件。

    因此,请创建/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> 
    

    现在,创建/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>
    

    最后,将元素放在布局中,使其显示在每个页面上,无论视图如何。如果您使用的是默认蛋糕布局,则表示您应该编辑/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... -->
    

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

    HTH。 The cookbook是你的朋友。