Šablonovací systém
Použitý šablonovací systém využívá upravený RainTPL 3 a CMS nadstavbu pro engine. Třída Template dědí z třídy BaseTemplate.
RainTPL
RainTPL je jednoduchý a snadno rozšiřitelný template engine. V našem CMS ho používáme pro:
- Přiřazování proměnných do šablon (
{$variable}) - Parsování .tpl souborů
- Řetězení šablon a partiálů
Detailní popis všech RainTPL tagů a příkazů je v sekci RainTPL.
use Petrovo\Template\Template;
$tpl = new Template();
echo $tpl->draw(__DIR__ . '/templates.tpl', true);
Veřejné metody
-
data()- přijímá název proměnné a její hodnotu, využívá interní metodurainAssign()pro přiřazení této hodnoty proměnné -
draw(string $handle, bool $last = false, ?string $lang = null)– Vyrenderuje šablonu ze souboru $handle- cesta k .tpl souboru$last-truepokud je to poslední krok v řadě vykreslování (spustíafter()s post-processing)-
$lang- (volitelně) jazyk pro renderování šablony. Pokud není zadán, použije seLANGkonstanta -
drawString(string $handle, bool $last = false, ?string $lang = null)– Stejné jakodraw(), ale místo názvu souboru přijímá řetězec šablony $lang- (volitelně) jazyk pro renderování
Třídu je možné volat jen s přísnými typy, protože na začátku souboru se používá deklarace declare(strict_types=1);.
Dynamický jazyk ($lang parametr)
Parametr $lang umožňuje vyrenderovat šablonu v libovolném jazyce, aniž by se změnila globální konstanta LANG. Výchozí chování zůstává zachováno – pokud není parametr zadán, použije se LANG.
Příklady:
use Petrovo\Template\Template;
$tpl = new Template();
$tpl->data('user_name', 'John');
// Použije výchozí LANG (např. 'cs')
echo $tpl->draw('/app/templates/email.tpl', true);
// Vyrenderuje v německém jazyce, i když LANG='cs'
echo $tpl->draw('/app/templates/email.tpl', true, 'de');
// Vyrenderuje šablonu jako řetězec v angličtině
echo $tpl->drawString('{S Hello}, {$user_name}!', true, 'en');
Praktické použití – email v cizím jazyce:
// V controlleru máte aktuálně nastaveno LANG='cs',
// ale potřebujete poslat email uživateli s jazykem 'de'
$tpl = new Template();
$tpl->data('user_name', $user['name']);
$tpl->data('action_url', $actionUrl);
// Vyrenderuje email v němčině
$emailContent = $tpl->draw('/app/templates/email/notification.tpl', true, 'de');
// Pošle email
mail($user['email'], $emailSubject, $emailContent);
Jak to funguje na pozadí:
$lang se propaguje skrz všechny post-processing etapy:
- HtmlBlock::make() – používá
$langpro filtrování bloků podle jazyka - Translate::make() – používá
$langpro překladový cache a získávání překladů - Url::make() – používá
$langpro generování URL s jazykovým prefixem
Backward compatibility:
Všechny existující volání zůstávají funkční – $lang je zcela volitelný:
// Stará volání fungují jako dřív (fallback na LANG)
$tpl->draw($file, true); // Funguje
$tpl->drawString($str, false); // Funguje
// Nová volání s $lang parametrem
$tpl->draw($file, true, 'de'); // Nové
$tpl->drawString($str, true, 'en'); // Nové
Metoda after
Lze ji rozšířit o další činnosti pro změnu výsledné šablony. Metoda se volá v draw() / drawString() s parametrem $lang, který se propaguje do všech post-processoru.
private function after(string $code, bool $last, ?string $lang = null): string
{
if ($last) {
$code = HtmlBlock::make($code, $lang);
$code = Translate::make($code, $lang);
$code = Url::make($code, $lang);
if (!defined('ADMIN') || !ADMIN) {
$code = Image::make($code);
}
//$code = Conversion::back($code);
if ($this->calls) {
bdump($this->calls, 'Called tags ' . $this->handle);
}
}
return $code;
}
Parametr $lang je optional – pokud není zadán, všechny post-procesory použijí globální LANG konstantu.
Syntax tagů
Bloky {+ ...}
Přidá do šablony částečný kus kódu bloku (podšablonu).
{+ templates/_first-block}
{+ templates/_second-partial}
Pozn.: Bloky se načítají rekurzivně najednou, nezáleží na parametru step. Cesta je relativní k šabloně, která je vkládána do metody draw().
Nezobrazení {- ...}
K nezobrazení prvku šablony použijte znak mínus.
{- templates/second-partial}
Kostky {C ...}
HTML bloky nahradí zobrazení konkrétní kostky.
{C id:41 !page="page2" debug step="3" development}
Tento prvek zavolá tag T cubes/one id="41".
Překlady {S ...}
Prvek překladový řetězec (string). Spouští se až v konečné fázi parsování v metodě after(). Vše řeší core/Template/Translate.php.
{S Good Morning}
{S Testovací překladový | text}
Plurální překlady
{$piv=3;$alcohol='zelenou';}
{S Vypil ## a ### piv|{$alcohol}|{$piv}}
##- běžná náhrada###- plurální varianta
Adresy {U ...}
Prvek (url) formátuje či konvertuje adresy URL. Spouští se až v konečné fázi parsování v metodě after().
{U /templates/second-partial}
{U /}
{U home}
{U /catalog}
Modifikátory stavu {@ ...}
Během vývoje byl požadavek na nekompilování. Např. při zobrazení šablony v administraci.
{@ NO_COMPILE_START}
{@ NO_COMPILE_END}
Má vazbu i na třídu Form, která používá a automaticky obaluje textarea dle yaml no_compile: 1.
Tagy {T ...}
PHP skripty (tagy). Běží každý sám za sebe a neovlivňují další tagy. Nesdílí s nimi proměnné.
{T directory/file}
{T languages/hreflangs step="2" parameter="value"}
Podmíněné parametry (Conditional Parameters)
Tagy podporují parametry, které řídí, kdy se tag spustí:
Pagační parametry:
- page="page1,page2" - Tag se spustí POUZE na specifikovaných stránkách
- !page="page1,page2" - Tag se NESPUSTÍ na specifikovaných stránkách
- Priorita: page má přednost před !page
Prostředí parametry:
- production - Tag se spustí POUZE v produkčním prostředí (APP_ENV=prod)
- development - Tag se spustí POUZE ve vývojovém prostředí (APP_ENV=dev)
- !production - Negace production
- !development - Negace development
Krokování (Compilation Steps):
- step="2" - Tag se spustí až v kroku kompilace #2 (defaultně krok 0)
Ostatní:
- iff="functionName('arg')" - Tag se spustí POUZE pokud vrátí funkce true
- debug - Tag se zobrazí v HTML komentáři i v produkci (pro debugging)
Příklady:
{T my-tag page="home"} <!-- Pouze na home -->
{T my-tag !page="admin,settings"} <!-- Všude MIMO admin a settings -->
{T my-tag production} <!-- Pouze v produkci -->
{T my-tag development} <!-- Pouze ve vývoji -->
{T my-tag step="2"} <!-- V kroku #2 a později -->
{T my-tag page="home" development step="1"} <!-- Kombinace: home STRÁNKA + VÝVOJ + krok 1+ -->
{T my-tag iff="isAdmin()"} <!-- Pokud isAdmin() vrátí true -->
Logika zpracování (viz BaseTemplate::isValidPageParams()):
- Pokud je
page=""a!page=""→ tag se spustí - Pokud je
pagevyplněn → musí obsahovat aktuálníPAGEkonstantu - Pokud je
!pagevyplněn apage=""→PAGENESMÍ obsahovat - Pokud
production/developmentnesedí → tag se nespustí - Pokud
iff="func()"vrátífalse→ tag se nespustí
Proměnné vstupující do tagu
$handle(string) - cesta k tagu$params(array) - parametry tagu (zadané ve složených závorkách v šablonách)$BOX(object) - sdílený kontejner mezi tagy$calls(array) - pole spuštěných tagů (jen při vývoji)
Pokud je třeba proměnná $_CMS, je třeba ji definoval globálně v tagu pomocí global $_CMS.
Základ tagu s výpisem pomocí šablony
declare(strict_types=1);
use Petrovo\Template\Template;
$params = $params ?? [];
$BOX = $BOX ?? (object)[];
$tpl = new Template();
$tpl->data('variable', 'value');
echo $tpl->draw(__DIR__ . '/tagTemplate.tpl');
Metody draw() a drawString()
Do draw() vstupuje cesta tpl šabloně a do drawString() textový obsah šablony. Obě mají druhý parametr (bool) $last, určující, zda-li je to poslední výstup z kompilování šablony a je třeba spustit metodu after().
true- nastaveno v základním spuštění vbootstrap.phpa pak všude, kde se požaduje finální výstupfalse- v tagu třeba, vyřeší ho globální šablona
Dočasné prvky (deprecation)
- H (HTML bloky) - bude odstraněno, používejte
{+ partial} - B (bloky) - nahrazeno
{+ partial} - V (proměnné) - odstraněno
Assets
Systém bude dále řešit vkládání obrázků a souborů.