Jak działają systemy szablonów w CMSach (Joomla, Drupal...)?

Odpowiedz Nowy wątek
2011-08-11 17:48
json
0

Witam, stworzyłem sobie bazę danych i odpowiednie klasy do stworzenia czegoś ala' CMS:

strona -ma wiele-> komponentów
szablon -ma wiele-> regionów
region -ma wiele-> komponentów
w sumie to powiązania trochę inne ale chodzi o ideę

No i wszystko ładnie działa mam jednak problem z dodaniem systemu szablonów na wzór joomli / drupala.

Nie mam pojęcia jak się zabrać do czegoś takiego. Nie wchodzi w grę dodawanie odrębnego pliku dla każdego komponentu bo wymusi to tworzenie dziesiątek takich małych szabloników.
Generuję kod html przy pomocy php i nie wiem w jakim stopniu pozwoli to na tworzenie szablonów bez zaglądania do kodu php.

Obecnie mam taki pomysł:

1) main.php - ogólny szablon strony, zawiera regiony
2) [nazwa_regionu].php? - szablon dla regionu (prawie na pewno niepotrzebne, może być w main.php)
3) Dla komponentów dwie opcje:

  • component.php - szablon pojedynczego komponentu
  • [nazwa_regionu]_component.php - szablon dla komponentu znajdującego się w danym regionie
    4) Nie wiem co jeszcze.

Zaimplementowałem możliwość dodania atrybutów (class, id...) do komponentów w zależności od szablonu, jednak nadal mam problem, ile html'a mogę sztywno wygenerować w php a ile (i jak) ma zależeć od szablonu.

Proszę o jakieś wskazówki, linki do tekstów itp.
Pozdrawiam.

PS. Planuję użyć Twig'a, żeby było jeszcze bardziej user friendly.

Pozostało 580 znaków

2011-08-11 18:10
0

Nie za bardzo chwytam hierarchię, którą opisałeś, ale i tak wydaje mi się to lepszym rozwiązaniem niż to co jest w Wordpressie tzn. funkcje typu getpost(), getheader(), itd. ;) Osobiście preferuję pseudoznaczniki, które później jakiś skrypt parsuje i zmienia na co trzeba, tak jak w tym Twigu (chyba?) i Smarty, może byś pomyślał o implementacji czegoś takiego u siebie? Jeżeli zrobisz dobrą dokumentację to będzie te bardzo uniwersalne i przydatne w kolejnych projektach.

Pozostało 580 znaków

2011-08-11 18:58
json
0

Wczytywanie komponentów działa w sposób następujący:
1) Użytkownik wczytuje podstronę, np. 'homepage'.
2) Klasa Page ładuje aktualny szablon i pobiera jego regiony.
3) Dla każdego regionu wyświetlane są komponenty w nim umieszczone.

Napisałem wzór pliku main.php (obsługiwany Twig'iem):

<!DOCTYPE html>
<html>
<head>
        {{meta}} <!-- meta z config -->
        <title>{{pagename}} | {{sitename}}</title> <!-- nazwa podstrony | nazwa witryny -->
        {{styles}} <!-- style css -->
        {{scripts}} <!-- skrypty -->
</head>
<body>
<!-- jakis naglowek -->
{% if region.left is defined %}
        <div class="region_left">{{region.left}}</div>
{% endif %}
{% if region.center is defined %}
        <div class="region_left">{{region.center}}</div>
{% endif %}
{% if region.right is defined %}
        <div class="region_left">{{region.right}}</div>
{% endif %}
<!-- jakas stopka -->
{{additional_script}}
</body>
</html>
Przykład tego, co zwraca komponent news:
```html
<section component="news" <!-- dodatkowe atrybuty -->>
        <div>
                <header>Tytuł</header>
                <article>Tekst newsa. Może zawierać kod html.</article>
                <footer>W sumie nie wiem co</footer>
        </div>
        <div>
                <header>Tytuł</header>
                <article>Tekst newsa. Może zawierać kod html.</article>
                <footer>W sumie nie wiem co</footer>
        </div>
</section>

Zostanie to dodane do jednego z regionów. Myślę, że newsy są stosunkowo łatwe do kustomizacji.
Doszedłem do wniosku, że taki jeden plik wystarczy do zbudowania szablonu strony, przez to, że komponenty zwracają własny kod html - nie ma sensu dodawać kolejnego szablonu.
Czy taki system jest wystarczający do tworzenia elastycznych szablonów na wzór joomli / drupala? W końcu jakiś kod musi być generowany na sztywno. Twórca szablonu będzie miał możliwość zedytowania wszystkiego przez CSS, będzie mógł dodać własne klasy do komponentów i będzie wiedział co zwracają komponenty.

Pozostało 580 znaków

2011-08-12 16:03
0
function template($array, $template){
    $tpl=file_get_contents("style/tpl/$template.tpl");
    foreach($array as $t => $content){
        $tpl=str_replace("{\$".strtoupper($t)."\$}", $content, $tpl);
    }
    $tpl=preg_replace('({\$(.*?)\$})', "", $tpl); //czyszczenie pozostałości
    return $tpl;
}

Mój stary skrypt obsługi szablonów

Przekazuje mu sie tablicę asocjacyjną klucz => treść i nazwę szablonu. Szablony w folderze /style/tpl/*.tpl są ładowane i wszystkie {$NAZWA_KLUCZA$} są zamieniane na ich wartości, a nieznalezione odwołania są usuwane. Funkcja zwraca szablon z uzupełnionymi danymi.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0