Invenzzia »

Open Power Libraries

PHP5 libraries

Open Power Libraries » Porady: Open Power Template

Porady: Open Power Template

Jak wyświetlić np. kategorie oraz przypisane do każdej z nich elementy?

Wykorzystaj dwie sekcje, które umieszczasz wewnątrz siebie:

Lista kategorii

{$kategorie.nazwa}

Lista elementów przypisanych do tej kategorii:

{$element.nazwa}

{$element.opis}

Obie sekcje zostaną automatycznie połączone ze sobą tak, jak chcesz. Wystarczy, że przygotujesz odpowiednio dane, z tym że możesz to zrobić na dwa sposoby.

$tpl -> sectionStructure = OPT_SECTION_MULTI; // wybieramy pierwszy sposob - jest to domyslne ustawienie OPT

$kategorie = array(0 => array('nazwa' => 'Kategoria 1'), array('nazwa' => 'Kategoria 2'), );

$elementy = array(0 => // Tu ida elementy dla pierwszej kategorii array(0 => array('nazwa' => 'Element 1', 'opis' => 'Jakiś opis'), array('nazwa' => 'Element 2', 'opis' => 'Jakiś opis'), ),

// A tu dla drugiej. array(0 => array('nazwa' => 'Element 3', 'opis' => 'Jakiś opis'), array('nazwa' => 'Element 4', 'opis' => 'Jakiś opis'), ) ); $tpl -> assign('kategorie', $kategorie); $tpl -> assign('elementy', $elementy);

Tutaj przygotowujemy dla każdej sekcji osobną tablicę, z tym że w przypadku elementów musimy zrobić trochę więcej zagnieżdżeń. Bezpośrednio w $elementy mamy mniejsze tablice, których indeksy zgadzają się z indeksami kategorii. Dopiero tam umieszczamy interesujące elementy. Gdybyśmy chcieli zrobić jeszcze trzecią podsekcję, całość zagłębiłaby się jeszcze bardziej.

Drugi sposób to upakowanie tego w jednej tablicy:

$tpl -> sectionStructure = OPT_SECTION_SINGLE; // wybieramy drugi sposob

$kategorie = array(0 => array( 'nazwa' => 'Kategoria 1', 'elementy' => array(0 => // elementy dla pierwszej kategorii array('nazwa' => 'Element 1', 'opis' => 'Jakiś opis'), array('nazwa' => 'Element 2', 'opis' => 'Jakiś opis'), ),
), array( 'nazwa' => 'Kategoria 2', 'elementy' => array(0 => // elementy dla drugiej kategorii array('nazwa' => 'Element 3', 'opis' => 'Jakiś opis'), array('nazwa' => 'Element 4', 'opis' => 'Jakiś opis'), ) ), ); $tpl -> assign('kategorie', $kategorie);

Tym razem przygotowujemy jedną wielką tablicę, a tablicę z elementami dla danej kategorii umieszczamy tuż obok jej bloków z danymi. Wybierz sposób, który bardziej odpowiada strukturze Twojego skryptu i działaj!

Jak usunąć znaczniki OL, gdy sekcja generująca listę nie dostanie danych?

Wystarczy użyć instrukcji opt:show:

  1. {$lista.costam}

Zauważmy, że przy tej okazji wszystkie atrybuty lecą do znacznika opt:show, zaś opt:section pozostaje pusty.

Mam zagnieżdżone dwie sekcje, ale nie chcę ich łączyć. Jak to zrobić?

Użyj atrybutu datasource i podaj inną lokalizację danych dla sekcji zagnieżdżonej:

{$sekcja1.dane}

{$sekcja2.dane}

Teraz obie sekcje działają całkowicie niezależnie od siebie.

Jak szybko wykonać pasek nawigacyjny na stronie?

Wiele stron internetowych zaopatrzonych jest w paski nawigacyjne w stylu:

Strona główna / Artykuły / Kategoria / Tekst, który właśnie czytasz

Ich wygenerowanie w OPT jest niezwykle proste. Wystarczy wykorzystać sekcje oraz separatory:

<p><opt:section name="nawigacja" str:separator=" / "><a parse:href="$nawigacja.adres">{$nawigacja.nazwa}</a></opt:section></p>

Pora na krótkie omówienie zasady działania. Do sekcji przekazujemy tablicę z adresami oraz nazwami linków. W obrębie znaczników opt:section pokazujemy, jak ma zostać wyświetlony każdy jej element - w tym wypadku chcemy go zamienić na adres URL. Zauważmy, że ponieważ adres jest blokiem OPT, to aby osadzić go w atrybucie “href”, musimy dodać przed niego przestrzeń nazw parse. Jest to typowe postępowanie przy tego typu operacjach. Ponadto, w znaczniku opt:section dodajemy atrybut “separator” określający, czym będą odseparowane poszczególne elementy. Przestrzeń nazw “str” pojawia się przed nim dlatego, że parser domyślnie oczekuje tu jakiegoś wyrażenia, czyli np. nazwy bloku lub operacji matematycznej, a pisanie cudzysłowu i za nim apostrofu jest nie tylko niewygodne, ale też i nieczytelne:

<opt:section name="..." separator="' / '">

Do takiej sekcji musimy także wygenerować dane. Oto przykładowa tablica:

$tpl -> assign('nawigacja', array(0 =>
    array('adres' => 'index.php', 'nazwa' => 'Strona główna'),
    array('adres' => 'artykuly.php', 'nazwa' => 'Artykuły'),
    array('adres' => 'artykuly.php?id=53', 'nazwa' => 'Jakiś artykuł')
));

Teraz wystarczy już tylko odpalić szablon i mamy działającą nawigację.

Jak wyświetlić coś np. 5 razy bez ręcznego kopiowania?

Przypuśćmy, że na naszej stronie chcemy umieścić sekcję reklamową i przygotowaliśmy tam kilka miejsc na banner. Każda podstrona ma przypisaną własną ilość reklam, które mają się wyświetlić, a OPT ma po prostu przygotować dla nich miejsce i pozwolić systemowi bannerów wygenerować odpowiedni kod. Pomoże nam tu instrukcja opt:repeat:

{generujBanner()}

Gdybyś potrzebował informacji o aktualnym stanie licznika, skorzystaj z bloku $opt.repeat. Poda Ci on wartość licznika instrukcji opt:repeat, wewnątrz której został umieszczony. Nie zapomnij, że liczenie zaczyna się od zera i kończy na liczbie o jeden mniejszej od podanej. Tzn. jak zechcesz wyświetlić coś pięć razy, poszczególne iteracje będą mieć numery: 0, 1, 2, 3, 4.

Jak odwołać się do funkcji/klasy w przestrzeni nazw po stronie szablonu?

Open Power Template ukrywa w szablonie istnienie przestrzeni nazw, nowego elementu języka PHP. Jednak nic nie stoi na przeszkodzie, aby zarejestrować w OPT funkcję lub klasę umieszczoną w takiej przestrzeni:

$tpl -> register(OPT_FUNCTION, ‘foo’, ‘przestrzen_nazw::funkcja’);

Twoja funkcja będzie teraz widziana w szablonie pod nazwą foo(). W ten sposób możesz także rejestrować pojedyncze statyczne metody klas jako funkcje.

Jak sprawić, aby znacznik opt:parent we fragmentach nie wczytywał mi domyślnej treści instrukcji opt:insert?

Dodaj do instrukcji opt:insert atrybut ignoredefault ustawiony na “yes”:

Tutaj domyślna treść

Jak wyescape’ować kod JavaScript i otoczyć go komentarzem, a nie sekcją CDATA?

Użyj instrukcji opt:literal i wybierz rodzaj otoczenia. Właściwy kod JS nadal escape’ujesz w szablonie sekcją CDATA, lecz znaczniki ją zamykające i otwierające nie trafiają już do przeglądarki: