如何创建动态导航菜单cakephp



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

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

我尝试了菜单生成器1.01,但它只适用于acl用户。我也读过这个教程,但没有帮助。

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

坦率地说,我甚至不确定我是否理解你的意图。你提供的第二个链接——我承认我只看了第一个代码片段——没有使用数据库表。如果你希望你的菜单是动态的,比如在基于控制器的操作中,这是有意义的。如果你希望它是"动态的",比如对你希望能够访问CRUD的菜单项进行动态控制(你知道CRUD代表什么,对吧?(,那就另当别论了(真的很简单(。

这是可以想象到的最基本、最简单的例子。在我的沙盒Cake 1.3.12安装中,我真的在15分钟内完成了这一切。我很确定我已经为Cake 2惯例更改了所有名称,但可能需要进行一些调整。我试着把它简化为绝对的基础,并尽可能保持代码的清晰。把它打造成适合你的样子。参考食谱,记住始终遵守蛋糕惯例

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

    创建表menus(CCD_ 7 int(11(unsigned NOT NULL auto_,name varchar(255(NOT NULL默认值",CCD_ 9 varchar(255(NOT NULL,CCD_ 10 varchar(255(NOT NULL,CCD_ 11日期时间不为空,CCD_ 12日期时间默认为NULL,主键(id()ENGINE=InnoDB DEFAULT CHARSET=utf8;

型号代码-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/中的[action name].ctp文件。

因此创建/views/menus/index.ctp/views/menus/add.ctp。你在/views/menus/index.ctp中输入的内容甚至并不重要,/views/enus/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。食谱是你的朋友。

最新更新