Latte verze 2.7: typy, našeptávání a sandbox režim
- David Grudl
- Nette Core | 8218
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 | 8218
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.