Ваша первая ссылка не работает.
Честно говоря, я даже не уверен, что понимаю, что вы пытаетесь сделать. Вторая предоставленная вами ссылка - я признаю, что только посмотрел на первый фрагмент кода - не использует таблицу базы данных. Если вы хотите, чтобы ваше меню было динамичным, например, в зависимости от действий контроллера, это имеет смысл. Если вы хотите, чтобы он был «динамическим», как если бы вы имели динамический контроль над пунктами меню, к которым вы хотите иметь доступ CRUD (вы знаете, что такое CRUD, верно?), Это другая (действительно очень простая) история. .
Это самый простой пример, который можно себе представить. Я буквально ударил это вместе за пятнадцать минут в моей песочнице Cake 1.3.12. Я почти уверен, что мне поменяли все названия для конвенций Cake 2, однако может потребоваться некоторая настройка. Я попытался свести его к абсолютным основам и сделать код как можно более четким. Постройте его так, как вам удобно. Обратитесь к кулинарной книге и не забывайте всегда следовать правилам торта.
- Создать таблицу с именем вроде
menus
.
- Создайте модель с именем
menu.php
.
- Создать
MenusController.php
.
Создайте каталог /Views/Menus
и /views/Elements/Menus
.
CREATE TABLE menus
(
id
int (11) без знака NOT NULL auto_increment,
name
varchar (255) NOT NULL по умолчанию '',
controller
varchar (255) NOT NULL,
action
varchar (255) НЕ NULL,
created
datetime НЕ NULL,
modified
дата и время по умолчанию NULL,
ПЕРВИЧНЫЙ КЛЮЧ (id
)
) ENGINE = InnoDB 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 требует [имя действия] .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>
Теперь создайте /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).
НТН. Поваренная книга - твой друг.