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 буде у значення, яке в даний момент енергійно. Якщо ви робили меню, як я, то ви можете зробити в одному з ваших контролерів такий спосіб
Цей код не є панацеєю, легко як приклад. А ось для останнього пункту меню, вам потрібно буде зробити свій власний спосіб.