как создать динамическое меню навигации cakephp

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

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

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


person user1080247    schedule 05.12.2011    source источник
comment
Похоже, вы ищете кого-то, кто запрограммирует для вас ваше меню, и вряд ли на этот вопрос вы получите ответ здесь. Это похоже на вопрос «Как мне создать инструмент администратора?».   -  person Dave    schedule 05.12.2011


Ответы (1)


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

Честно говоря, я даже не уверен, что понимаю, что вы пытаетесь сделать. Вторая предоставленная вами ссылка — признаюсь, я просмотрел только первый фрагмент кода — не использует таблицу базы данных. Если вы хотите, чтобы ваше меню было динамичным, например, основанным на действиях контроллера, это имеет смысл. Если вы хотите, чтобы он был «динамическим», например, с динамическим контролем над элементами меню, к которым вы хотите иметь доступ 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) unsigned NOT NULL auto_increment, name varchar(255) NOT NULL default '', controller varchar(255) NOT NULL, action varchar(255) NOT NULL, created datetime NOT NULL, modified datetime по умолчанию NULL , ПЕРВИЧНЫЙ КЛЮЧ (id) ) ENGINE = InnoDB НАБОР ШИМОВ ПО УМОЛЧАНИЮ = 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) по желанию.

ХТН. Поваренная книга — ваш друг.

person OpenSorceress    schedule 05.12.2011
comment
спасибо, Satywilder, это не работает, я пробую что-то другое, и это работает хорошо - person user1080247; 11.12.2011
comment
Люди просто говорят, что не работает, то работает... Ненавижу таких людей. - person Vishal Kumar Sahu; 23.06.2017