6. Odpowiedzi
W pierwszym postawionym problemie chodziło o określenie, jak OPT zrozumie format danych StaticGenerator/Objective/Array. Patrzymy od lewej strony. Lista pobierana jest z generatora, który zwraca ją w postaci obiektu, zaś poszczególne elementy listy reprezentowane są przez tablice.
Nieco dalej pytaliśmy o zalety wyrzucenia z szablonów szczegółów implementacyjnych i przeniesienie ich ustawiania do skryptu. Temat ma charakter otwarty, aczkolwiek można z łatwością wymienić kilka głównych zalet:
- Szablon może powstawać wcześniej niż skrypt, lub równolegle do niego. W dodatku twórca szablonów może to robić dużo szybciej, ponieważ nie musi tracić czasu na dodatkową implementację oraz spędzać dużej ilości czasu na testowaniu połączenia.
- Szablony mogą zostać wykorzystane jako makieta dla klienta lub dla programistów odpalana przez najprostszy kod PHP wypełniający ją przykładowymi statycznymi danymi. Dzięki temu można zapoznać się ze strukturą serwisu, a szablony bez żadnych modyfikacji później przenosić do właściwej wersji. Wystarczy jedynie zmienić formaty danych.
- Uproszczony refactoring kodu. Dane dostarczane są w postaci tablic i obiektów. Zdarza się, że w wyniku optymalizacji lub rozbudowy jakiegoś kawałka kodu chcemy zmienić tablice na obiekty (lub na odwrót). W OPT nie wymaga to przepisania szablonów – wystarczy zmienić format danych i przekompilować wszystko, co zajmuje chwilkę.
W ćwiczeniu trzecim zajmujemy się formatami danych współpracującymi z sekcjami zagnieżdżonymi. Chcemy, by lista wpisów była obiektem, pojedynczy wpis tablicą, a tagi dla wpisu były pobierane przez generator:
$view->setFormat('entries', 'Objective/Array'); $view->setFormat('tags', 'StaticGenerator/Array');
Format StaticGenerator w przypadku sekcji zagnieżdżonych poszukuje obiektu generatora w elemencie sekcji nadrzędnej, dokładnie tak, jak w SingleArray. Po ukośniku musimy dorzucić jeszcze format określający, czym są zwracane przez generator elementy.
Ostatnie ćwiczenie poświęcone jest współpracy sekcji z opt:show.
<opt:show name="top"> <opt:section name="middle" parent="top"> Element. </opt:section> <opt:section> Element listy. </opt:section> </opt:show>
Pytaliśmy, czy dany kod zadziała... i dlaczego nie. Właściwa sekcja obejmuje wyłącznie blok kodu, który podlega powtarzaniu. Znacznik opt:show definiuje jedynie otoczenie sekcji, dlatego nasza sekcja middle nie może być do niego podłączona. Ma to sens praktyczny – z jakim elementem sekcji top mamy ją związać, kiedy nie rozpoczęliśmy jeszcze nawet pobierania i wyświetlania elementów? Aby poprawić ten kod, należałoby usunąć atrybut parent (wtedy sekcja będzie traktowana jak niezagnieżdżona), albo przenieść middle do wnętrza pustych znaczników opt:section, gdyż tylko tam OPT może utworzyć powiązanie.