Błędy kierujesz po prostu do innego szablonu i modyfikujesz lekko widok, tak jak to robię:
$tmpl_id = $cache['tmpl']; //id szablonu pobrany z cache'u strony
}else{ //tu obsługa błędu
unset($tresc); //czyścimy widok $tmpl_id = 2; //id szablonu z błędem (może być inny np. dla 404)
$tresc['error'] = '<li>'.join("</li><li>",$error).'</li>'; //dodajemy do widoku listę błędów }
Oczywiście są to błędy typu: brak pliku .cfg, brak bazy, brak strony etc. Błędy poszczególnych modułów (np. brak artykułu) należy wyświetlać na podobnej zasadzie korzystając z szablonu tego modułu.
A co do tego:
Cytat
Czy jest inne wyjście niż napisanie dwóch niemalże identycznych szablonów?
- jest - ja wykorzystuje dziedziczenie, można teraz pójść dwutorowo:
1. Szablon defaultowy jest dziedziczony i dostępny wszędzie, natomiast dla wybranej kategorii typu 1/1.1/1.1.5 ustawiasz szablon x z inną stopką, który może być dziedziczony np. dla kategorii 1/1.1/1.1.5/1.1.5.2 lub nie, zależy jak ustawisz settings tego szablonu - jednak nie jest to optymalne (dublowanie kodu html, gdy zmienisz np. doctype to musisz zmieniać dwa szablony)
2. Lepiej stopkę zaimplementować jako coś, co ja nazywam "panelem" - panele tym się różnią od modułów, że ich treść jest generowana statycznie (są to po prostu fragmenty kodu html). Definiujesz nowy panel, nazywasz go "stopka default", włączasz mu dziedziczenie i includujesz w szablonie głównym jako {stopka}, natomiast dla kategorii x przypisujesz inny panel o tej samej nazwie zmiennej (każdy panel może mieć inną nazwę zmiennej wykorzystywaną w szablonie, w którym jest implementowany) - silnik strony jest tak pomyślany, że ważniejsze są zmienne przypisane bezpośrednio niż odziedziczone, w ten sposób stopka przypisana bezpośrednio nadpisze tą defaultową

Cytat
Czy wszystkie konstrukcje można kończyć w sposób endkonstrukcja czy tylko foreach, zamias {} używać słów?
- chodzi tylko o czytelność kodu i wyraźne oddzielenie PHP od HTML tak, aby laik edytujący tylko HTML nie wysypał nam strony