如何从类别和子类别构建导航菜单,如以下所示:
http://mysite/categories/view/1/2
我尝试了菜单生成器1.01,但它只适用于acl用户。我也读过这个教程,但没有帮助。
您的第一个链接不起作用。
坦率地说,我甚至不确定我是否理解你的意图。你提供的第二个链接——我承认我只看了第一个代码片段——没有使用数据库表。如果你希望你的菜单是动态的,比如在基于控制器的操作中,这是有意义的。如果你希望它是"动态的",比如对你希望能够访问CRUD的菜单项进行动态控制(你知道CRUD代表什么,对吧?(,那就另当别论了(真的很简单(。
这是可以想象到的最基本、最简单的例子。在我的沙盒Cake 1.3.12安装中,我真的在15分钟内完成了这一切。我很确定我已经为Cake 2惯例更改了所有名称,但可能需要进行一些调整。我试着把它简化为绝对的基础,并尽可能保持代码的清晰。把它打造成适合你的样子。参考食谱,记住始终遵守蛋糕惯例
- 创建一个名称类似
menus
的表 - 创建一个名为
menu.php
的模型 - 创建
MenusController.php
-
创建
/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。食谱是你的朋友。