Założenie jest proste. Cała strona jest podzielona na kafelki(boxy, kontenery, moduły – jak zwał tak zwał). Do każdego kafelka można przypisać kolejne kafelki. Poziom zagnieżdżania kafelek jest dowolny. Występują dwa rodzaje kafelków. Kafelek rodzic, który jest pusty i tylko przechowuje dzieci i kafelek który ma przypisany moduł który realizuje specyficzną funkcjonalność np. wygeneruje 2 ostanie newsy.
Do testów nie tworzymy admina, tabel w bazie danych, jedynie model który zwróci prosty dwupoziomowy przypadek w postaci.
parent1
-kid1
-kid2
parent2
-kid3
-parent_kid
- kid4
- kid5
Najporstsza tabela reprezentująca ten układ w bazie danych to:
- tail_id,
- tail_parent_id,
- tail_name,
- tail_module_name,
- tail_html_class_name,
- tail_index,
Dodatkowo tabela reprezentująca strony w serwisie która:
- page_id,
- page_parent_id,
- page_name,
- page_url,
Oraz tabela wiążąca kafelki ze stronami:
- page_id,
- tail_id,
tail_module_name – może przyjąć wartość NULL Wówczas realizuje się tylko jako kontener bez funkcjonalności.
Jak wykonać flow żeby wygenerować drzewiasty układ kafelkowy?
Po pierwsze model realizujący pobieranie stron, zwykły statyczny do testowania który zwróci po podaniu adresu url stronę w raz z układem kafelek do niej przypisanym – metaoda get($url).
Druga ważna metoda to zapamiętanie pobranej strony w rejestrze – metoda save($page).
Bazujemy na koncepcji actionStack plugin z zend, który tworzy kolejkę controlerów przez który należe przejść. W przypadku generacji drzewa sprawa się nieco komplikuje ze względu na to że trzeba generować content zaczynając od elementów które nie posiadają dzieci czyli od końca, a następnie tworzyć rodziców, żeby osiągnąć efekt:
<div id=”parent1″>
<div id=”kid1″>Content kid 1</div>
<div id=”kid2″>Content kid 2</div>
</div>
Nazwy id oraz class poszczególnych kafelek:
<div id=”tail_{wartość tails_id}” class=”tail module_controller_action tail_html_class_name”></div>
Co może przyjąć wartości:
<div id=”tail_1″ class=”tail default_error_index my_special_error_tail”></div>
W tym momencie powinniśmy mieć już wygenerowaną stronę. Dale warto było by stworzyć plik konfiguracyjny modułu, który by np. określał czy można przypisać moduł kilkakrotnie do jednego układu kafelek, do różnych układów kafelek, a może tylko raz we wszystkich układach kafelek.
Który hook pluginu wykorzytać do podawania kolejnego controlera do wykonania?
Predispatch. Rejestracja pluginu z niskim numerem. Dlatego że router nie ustawi pierwszego controlera do wykonania. To ten plugin musi to zrobić. Generacja jak zwykłego menu, w tych wypadkach problematyczne jest zamykanie i otwieranie rodzica.