W poprzednim rozdziale pt: „KNPMENUBUNDLE” opisałem podstawy dotyczące tworzenia statycznego menu. Poszczególne sekcje wprowadzaliśmy manualnie do metody MyMenu w klasie Builder. Teraz zmodyfikujemy klasę tak, aby można było tworzyć menu dynamicznie, czyli generowane z tabeli w bazie danych. Do tego będą nam potrzebne jeszcze dwie klasy np: Menu i MenuRepository.

Zakładam, że masz przygotowaną bazę danych (np: MySQL) i skonfigurowany dostęp do niej, a jak nie, to otwórz plik .env znajdujący się w katalogu głównym frameworka i edytuj zmienną środowiskową DATABASE_URL :

Następnie wygeneruj bazę z wiersza poleceń:

Jeśli nie instalowałeś jeszcze KnpMenuBUndle, to zrób to teraz:

Zaktualizuj plik bundles.php (config/bundles.php):

Dla przypomnienia – konfiguracja KnpMenuBundle w pliku services.yaml (config/services.yaml) ma postać:

Budowę dynamicznego menu zaczniemy od utworzenia klasy Menu.php (/src/Entity/Menu.php). Pola jakie będą nam potrzebne to:

  • id – unikatowy klucz / identyfikator
  • parent_id – id rodzica, kategorii głównej / nadrzędnej
  • category – nazwa kategorii
  • slug – link do strony
  • enabled – stan kategorii (widoczna – 1 lub niewidoczna na stronie – 0)

Aby slug generował się automatycznie doinstaluj zachowanie sluggable.

Pole parent_id zawiera id klucza głównego, tak, że kategoria podrzędna tworzy relację ManyToOne z kategorią nadrzędną. Przedstawia to poniższy obrazek. Kolorami zaznaczyłem relacje:

Źródło klasy Menu.php:

Zwróć uwagę na budowę relacji ManyToOne pomiędzy id i parent_id za pomocą procedury JoinColumn:

Z gotowej klasy generujemy automatycznie tabelę w bazie danych:

Oczywiście możesz to zrobić manualnie np. za pomocą aplikacji PhpMyAdmin, ale po co marnować cenny czas? 😉

Stwórz MenuRepository.php (/src/Repository/MenuRepository.php):

W repozytorium dodałem funkcję findAll, która pobierze wszystkie elementy menu, które (andWhere) są włączone, czyli mają stan enabled = 1.

Na koniec zaktualizujmy zawartość Buildera (src/Menu/Builder.php) dołączając metodę findAll z repozytorium:

Wprowadź kilka rekordów do tabeli i wyrenderuj menu w szablonie strony:

I to wszystko. Więcej informacji o KnpMenuBundle znajdziesz pod adresem: https://symfony.com/doc/current/bundles/KnpMenuBundle/index.html