如何从类别和子类别构建导航菜单,如下所示:
http://mysite/categories/view/1/2
我尝试了菜单构建器1.01,但它仅适用于ACL用户。
我也阅读了这个tutorial,但是它没有帮助。
最佳答案
您的第一个链接无效。
坦白说,我什至不确定我是否了解您要执行的操作。您提供的第二个链接-我承认我只看了第一个代码段-不使用数据库表。如果您希望菜单是动态的(例如基于控制器的动作),那是有道理的。如果您希望它是“动态的”,就像对希望具有CRUD访问权限的菜单项进行动态控制(您确实知道CRUD代表什么,对吗?),那就是另一回事了(真的很简单) 。
这是可想象的最基本的准系统示例。在我的沙盒Cake 1.3.12安装中,我用十五分钟的时间将它们拍了拍。我很确定我已经为Cake 2约定更改了所有名称,但是可能需要进行一些调整。我试图将其简化为绝对基础,并保持代码尽可能清晰。根据您的需要进行构建。请参考食谱,并始终记住遵守Cake惯例。
menus
的表。 menu.php
的模型。 MenusController.php
。 /Views/Menus
目录和/views/Elements/Menus
。创建表
menus
(id
int(11)unsigned NOT NULL auto_increment,name
varchar(255)NOT NULL默认值'',controller
varchar(255)NOT NULL,action
varchar(255)NOT NULL,created
datetime NOT NULL,modified
datetime默认为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/
中的[操作名称] .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是您的朋友。