как создать динамическое меню навигации - PullRequest
3 голосов
/ 05 декабря 2011

Как мне построить навигационное меню из категорий и подкатегорий, например:

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

Я пробовал сборщик меню 1.01, но он работает только для пользователей acl. Я также прочитал этот учебник , но он не помог.

1 Ответ

23 голосов
/ 06 декабря 2011

Ваша первая ссылка не работает.

Честно говоря, я даже не уверен, что понимаю, что вы пытаетесь сделать. Вторая предоставленная вами ссылка - я признаю, что только посмотрел на первый фрагмент кода - не использует таблицу базы данных. Если вы хотите, чтобы ваше меню было динамичным, например, в зависимости от действий контроллера, это имеет смысл. Если вы хотите, чтобы он был «динамическим», как если бы вы имели динамический контроль над пунктами меню, к которым вы хотите иметь доступ CRUD (вы знаете, что такое CRUD, верно?), Это другая (действительно очень простая) история. .

Это самый простой пример, который можно себе представить. Я буквально ударил это вместе за пятнадцать минут в моей песочнице Cake 1.3.12. Я почти уверен, что мне поменяли все названия для конвенций Cake 2, однако может потребоваться некоторая настройка. Я попытался свести его к абсолютным основам и сделать код как можно более четким. Постройте его так, как вам удобно. Обратитесь к кулинарной книге и не забывайте всегда следовать правилам торта.

  1. Создать таблицу с именем вроде menus.
  2. Создайте модель с именем menu.php.
  3. Создать MenusController.php.
  4. Создайте каталог /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).

НТН. Поваренная книга - твой друг.

...