Latte verze 2.7: typy, našeptávání a sandbox režim

David Grudl
Nette Core | 8227
+
+41
-

Měsíc po vydání Latte 2.6, které přineslo optional chaining a custom functions, je za dveřmi Latte 2.7, které je na novinky ještě zajímavější.

Typování

Každým dnem vyjde přelomová verze Latte pluginu, za kterou patří neskonalé uznání @mesour. Klíčová vlastnost je napovídání v šablonách stejně jako když píšete PHP kód. Aby napovídání mohlo fungovat, musí plugin vědět, co je ve které proměnné za typ.

U standardních proměnných, jak je třeba $user nebo $presenter, to plugin ví, o těch ostatních mu to musíme říct. A na to existuje několik způsobů.

1) Jednotlivě {varType type $param} a {varPrint}

Typy jednotlivých parametrů (proměnných), které vstupují do šablony, můžete sdělit makrem {varType}. Takže třeba {varType ?Model\Article $article}.

A co dělá makro {varPrint}? Vygeneruje {varType ****} pro všechny lokální proměnné, aby vám psaní co nejvíc zjednodušilo.

2) Souhrnně {templateType MyTemplate} a {templatePrint}

Vytvoříte třídu, jejíž property budou odpovídat proměnným v šabloně, viz příklady.

class MyTemplate
{
	public \App\Module\Wiki\Presenters\ViewPresenter $presenter;
	public string $mediaPath;
	public array $langs;
	public string $lang;
	public \App\Module\Wiki\Model\Page $page;
	public array $sideBar;
}

Tato třída nemusí od ničeho dědit a představuje jakousi dokumentaci šablony. Kromě proměnných lze definovat i funkce, které potom budou v šabloně fungovat jako custom funkce.

A co dělá makro {templatePrint}? To se pokusí kód třídy vygenerovat, aby vám její psaní co nejvíc zjednodušilo.

3) Při vytváření proměnné {var type $x = ...} a {default type $x = ...}

Při implementaci této feature jsem narazil na historický relikt, a sice že tyto dvě makra podporují zápis proměnné bez $, takže funguje i {var x => 10}, což pak komplikuje parsování, protože nemusí být zcela jasné, jestli x je typ nebo proměnná. Z toho důvodu je tento historický zápis od Latte 2.7 označený jako deprecated. Zatím tedy funguje i nadále, ale vyhazuje chybovou hlášku.

Jednoduchý způsob jak prohledat své šablony, jestli tam tento starý zápis nemáte, je hledat regulární výrazy /\{var [^$]/ a /\{var [^}]*=>/.

Filter batch()

Na fóru se objevil požadavek na filtr, který by zjednodušil výpis tabulek z lineárních dat:

{var $items = ['a', 'b', 'c', 'd', 'e', 'f', 'g']}
<table>
{foreach ($items|batch:3:'No item') as $row}
    <tr>
        {foreach $row as $column}
            <td>{$column}</td>
        {/foreach}
    </tr>
{/foreach}
</table>

vygeneruje:

<table>
    <tr>
        <td>a</td>
        <td>b</td>
        <td>c</td>
    </tr>
    <tr>
        <td>d</td>
        <td>e</td>
        <td>f</td>
    </tr>
    <tr>
        <td>g</td>
        <td>No item</td>
        <td>No item</td>
    </tr>
</table>

Protože by se to mohlo hodit i více programátorům, přidal jsem ho přímo do Latte.

Otázkou zůstává, zda by nebylo lepší jej implementovat formou custom funkce:

{foreach batch($items, 3, 'No item') as $row}

Sandbox režim

Přesunuto do samostatného vlákna

Je toho ještě více…

…ale myslím, že prozatím stačí :-)

Latte 2.7 je nyní určeno čistě pro testování. Vůbec si nejsem jistý, jestli API pro sandbox je dobře použitelné. A bez zpětné vazby na to nikdy nepřijdu, protože sandboxovat nepotřebuju. Netuším, jestli práce s typy přinese kýžené pohodlí, nebo to bude opruz. Tohle všechno je potřeba vyzkoušet a doladit.

Až vznikne pocit, že všechno funguje jak má (nebo naopak něco bude lepší ještě odložit), vyjde ostrá verze.

David Grudl
Nette Core | 8227
+
+6
-

Protože Latte plugin už je schválený a venku, vydal jsem Latte 2.7.0-RC. Chybí v něm sandbox režim, ke kterému zatím nemám dostatečnou zpětnou vazbu. Jakmile bude, vyjde jako součást Latte 2.8.

David Grudl
Nette Core | 8227
+
+4
-

Latte 2.7 je venku:

Sandbox můžete testovat v dev-verzi Latte 2.8