KnpMenuBundle Соната
Отворете конзолата, отидете в папката с плана и напишете:#php app/console generate:bundle
Можете сами да изберете името на пакета, но аз лесно го нарекох MenuBundle. По-късно трябва да направите 2 обекта. Ако не сте имали папката Entity в папката с пакета, направете я. Оказва се, че файлът брой пъти е Menu.php. Файл номер две е MenuType.php. Защо е необходим вторият файл, ще обясня по-късно.
Давам началния код на файла под брой пъти:
Нека да разгледаме файл номер две:
Оказва се, че сме написали 2 модела, да генерираме геттери и сетери за тях?!# php app/console doctrine:generate:entities MyFolder/MenuBundle/Entity/Menuи# php app/console doctrine:generate:entities MyFolder/MenuBundle/Entity/MenuType
Ако всичко е минало добре, вашите класове трябва да бъдат трансформирани и да получат своите гетери и сетери на свое разположение.
По-късно трябва да направите самите таблици в базата данни.# php приложение/конзола doctrine:schema:update --force
Оказва се, че имаме 2 маси, свързани една с друга чрез връзка ManyToOne. Тоест, всъщност таблицата ONCE може да има много връзки с таблицата TWO.
Малко заминаване. Нека поговорим за връзките в моделите, за тези, които не знаят.
По-долу има ред от файла TIME.
Те ни казват, че много редове от файла MyFolder\MenuBundle\Entity\Menu могат да се отнасят само до един ред от файла MyFolder\MenuBundle\Entity\MenuType, за което учтиво ни информира анотацията от файла TWO
По този начин това е един от методите за установяване на връзки между обекти в Symfony.
Връщаме се към кода. Оказва се, че сме подготвили обектите, направили сме базата данни. Да преминем към административната част.
Да предложа направата на 1-ви тип меню. За да направите това, отидете на раздела„Тип меню“ и натиснете бутона плюс. Така че всичко трябва да е лесно. Едно поле - заглавие (Title). По този начин можем да създадем типове менюта, към които по-късно да обвържем елементи от менюто. Направих два типа менюта („Главно меню“ и „Меню в долния колонтитул“). По-късно отиваме в самото меню и добавяме ново. Ето още забавление.
Един момент. При необходимостта да създам персонализиран маршрут, трябваше да приложа такъв JS код.
Тоест, когато щракнете върху статичния елемент, маршрутът се обръща, ако сте написали, да речем, about-us, тогава той става /custom/about-us.
Няма да описвам как да добавя собствен js към административната част на сонатата, това излиза извън обхвата на разглежданата област, ако има нужда, ще ви кажа, просто попитайте
Създадох 7 елемента от менюто
Както можете да видите, Маршрутът е почти идентичен за всички, с изключение на последния елемент. Всичко това е обвързано само с Главното меню. Свършихме с тази част. Отива на KNPMenuBundle.
Имам инсталирана версия 1.1 на пакета, въпреки факта, че вече има 2.2, но не успях да се сприятеля със Sonata 2.2, а в изискванията на Sonata има версия 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 клас ще бъде на стойността, която е активна в момента. Ако сте направили меню като мен, тогава можете да направите това в един от вашите контролери
Този код не е панацея, само като пример. Но за последния елемент от менюто ще трябва да направите свой собствен път.