KnpMenuBundle Sonata

Відкриваємо консоль, переходимо до папки з планом і пишемо:#php app/console generate:bundle

Ім'я для бандла ви вільні віддати перевагу самі, я ж назвав його легко MenuBundle. Пізніше потрібно створити дві сутності. Якщо у вас не опинилося в папці з бандлом папки Entity, то зробіть її. Виходить, файл номер разів - Menu.php. Файл номер два - MenuType.php. Для чого потрібний 2-й файл, я поясню пізніше.

Наводжу початковий код файлу під номером:

Подивимося на файл під номером два:

Виходить, у нас написані 2 моделі, давайте згенеруємо гетери та сеттери для них?!# php
і
# php / doctrine:generate:entity Entity/MenuType

Якщо все пройшло благополучно ваші класи зобов'язані перетворитися і отримати у своє розпорядження свої гетери та сеттери.

Пізніше необхідно створити самі таблиці в БД.
# php app/console doctrine:schema:update –force

Виходить у нас дві таблиці, пов'язані одна з одною зв'язком ManyToOne. Тобто, по суті, таблиця РАЗ може мати безліч зв'язків з таблиці ДВА.

Маленьке відходження. Давайте проговоримо зв'язки в моделях, для тих хто не знає.

Нижче рядки з файлу РАЗ.

Говорять нам, що багато рядків з файлу MyFolder\MenuBundle\Entity\Menu можуть відноситися тільки до одного рядка з файлу MyFolder\MenuBundle\Entity\MenuType про що нам чемно інформує інструкція з файлу ДВА

Таким чином, це один із методів встановлення зв'язків між сутностями в Symfony.

Повертаємось до коду. Виходить, по суті ми підготували, БД зробили. Переходимо до адмінної частини.

Для того, щоб запропонувати зробити 1-й тип меню. Для цього переходимо у вкладку"Меню Тип" і тиснемо кнопку з плюсиком. Так все має бути легко. Одне поле – title (Заголовок). Таким чином ми можемо зробити Типи Меню до яких пізніше зуміємо прив'язати Пункти меню. Я зробив два Типи Меню (“Головне Меню” та “Меню у підвалі”). Пізніше переходимо до самого Меню і додаємо нове. Ось тут цікавіше.

Один момент. Для створення кастомного маршруту довелося застосувати такий JS код.

Тобто при натисканні на пункт Static маршрут перетворюється, якщо ви написали скажемо about-us то він стає /custom/about-us.

Як додати свій js в адмін частину сонати не розписуватиму, це виходить за межі області, що розглядається, якщо є потреба, підкажу, тільки запитайте

Я створив 7 пунктів меню

Як бачите Route приблизно у всіх ідентичний крім останнього пункту. Прив'язано це лише до Основного Меню. Власне, з цією частиною ми завершили. Переходить до KNPMenuBundle.

У мене встановлена ​​версія бандла 1.1 не дивлячись на те, що вже є 2.2 проте подружити 2.2 з Сонатою у мене не вийшло, але і в Сонаті в requirements стоїть версія KNPMenuBundle 1.1 тому ми нічого не порушуємо.

Продовжуємо. У папці з нашим бандлом створюємо папку Menu у ній файл Builder.php. Ось його код:

Тут кілька моментів. Так як сам Builder успадковує ContainerAware то у нас очевидно є можливість використовувати $this->container->get(), а якщо так, то ми можемо швидко написати сервіс на вибірку необхідних пунктів меню. Сказано зроблено.

У папці бандла створюємо папку Service, а в ній один файл MenuService.php. Перед тим почати писати в нього код, давай ті зробимо сервіс доступним, тобто відредагуємо файл MyFolder/MenuBundle/Resources/config/services.yml таким чином, щоб у нас вийшлонижченаведене:

Власне зараз код файлуMyFolder/MenuBundle/Service/MenuService

Нагадаю один рядок з Menu.php сутності
* ORM\Entity(repository > Це означає, що в папці з сутністю зробіть файл MenuRepository.php і код у ньому виглядає так:

власне це і є та сама вибірка, яка поверне нам усі пункти меню, які відносяться лише до “Головного Меню” типу.

Закінчуємо: зараз для відображення нашого меню, у шаблонізаторі twig досить прописати такий рядок:

CSS клас active буде у значення, яке в даний момент енергійно. Якщо ви робили меню, як я, то ви можете зробити в одному з ваших контролерів такий спосіб

Цей код не є панацеєю, легко як приклад. А ось для останнього пункту меню, вам потрібно буде зробити свій власний спосіб.