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

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
  1. 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.

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.

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.

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.

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