Prosím o otestování Latte 3.0.8

David Grudl
Nette Core | 8218
+
+4
-

Prosím o otestování Latte 3.0.8 RC

composer require latte/latte:^3.0.8-RC1

Je to sotva pár dnů, co jsem tu popisoval verzi 3.0.7 a už mám připravenou další :-) Opět hromada vylepšení se ukrývá pod kapotou, ale přináší také zajímavé novinky:

Striktní režim

Latte zavádí nový experimentální striktní režim parseru. Zapíná se pomocí:

$latte = new Latte\Engine;
$latte->setStrictParsing();

nebo v linteru:

vendor/bin/latte-lint <cesta> --strict

Striktní parser upozorní, když v šabloně použijete $this, na tzv. tag soup:

<p>          // neuzavřená značka
<p>...<p>    // chybějící /
<p>...</x>
{if x}<a>{/if} </a>

A také vyžaduje mezeru mezi názvem tagu a Latte značkou:

<foo{foo}>  // špatně
<foo {foo}> // dobře

V budoucnu se zřejmě okruh věcí, na které upozorní, rozšíří. Naopak zákaz $this bych rád časem dal do standardního režimu.

Variable tag name

<{$tag} title=foo>...</{$tag}>

Tento zápis bylo možné používat i dříve, Latte tomu nijak nebránilo. Nyní je oficiálně podporován, což třeba znamená, že Latte kontroluje validitu názvu tagu. Tagy jsou vždy párové a uzavírací značka vypíše stejný název tagu, jako otevírací, i když se hodnota $tag změní. A navíc je možné používat n:atributy.

Marek Bartoš
Nette Blogger | 1260
+
0
-

zakazuje použití $this

Bylo by možné mít funkci hasBlock? ifset s více parametry dělá && a v layoutech se mi často hodí ||, který teď afaik nejde jednoduše zapsat {if $this->hasBlock('title') || $this->hasBlock('action-buttons') || $this->hasBlock('breadcrumb')} nebo {var $hasActionsColumn = $this->hasBlock("row-actions") || isset($form['filter'])}

Další případ, co používá $this je nextras datagrid https://github.com/…blocks.latte Tam to ale nejspíš bude řešitelné? (případně se pro tenhle edge case dá striktní parsing lokálně vypnout)

David Grudl
Nette Core | 8218
+
0
-

Udělej na hasBlock issue na githubu pls

Marek Bartoš
Nette Blogger | 1260
+
0
-

David Grudl napsal(a):

Udělej na hasBlock issue na githubu pls

https://github.com/…e/issues/345

Gappa
Nette Blogger | 207
+
+1
-

Linter je fajn věc, díky :)

Mám dotaz – když potřebuji přidat nějaká vlastní Latte extension, tak musím nejprve ručně přidat všechny standardní extension, jako to dělá základní Linter:

Nešlo by to nějak oddělit/vymyslet, že by se dal získat takto defaultně nakonfigurovaný Engine a jen se doplnil o custom Extension? IMHO to bude nejčastější scénář.

Nebo to nějak jde a jen špatně hledám? :)


Dále jsem narazil na problém v dokumentaci a vytvořil na to issue:

Marek Bartoš
Nette Blogger | 1260
+
0
-

Engine si můžeš předat v konstruktoru. A nakonfigurovaný z aplikace ho získáš přes TemplateFactory->getTemplate()->getLatte(). Jen si pak musíš sám nastavit strict parsing a php linter.

Editoval Marek Bartoš (31. 8. 2023 9:10)

David Grudl
Nette Core | 8218
+
+1
-

Přidal jsem tam metodu Linter::getEngine(), tím by se to mělo vyřešit.

Tomáš Vodička
Člen | 28
+
+1
-

Začal jsem si trochu hrát s Linterem a došel jsem k problému, kdy mám extension, která přidává vlastní značku, ale má více dynamických závislostí s nastavením z configu.

Byla by možnost například nastavit pro linter ignorování nějaké značky? Zrovna u téhle mě syntaktická správnost úplně tolik nezajímá.

Případně jestli někoho nenapadá, jak tyhle případy řešit – vytvářet celý kontejner, nebo simulovat DI a vytvářet extension ručně mi nepřijde jako správná cesta.

David Grudl
Nette Core | 8218
+
0
-

A nemužeš si to Latte nechat přímo sestavit kontejnerem (tj. vytáhnout Nette\Bridges\ApplicationLatte\LatteFactory), nebo z něj alespoň vytáhnout ty extensions?

Tomáš Vodička
Člen | 28
+
0
-

Ta možnost tu je, jen jsem chtěl zjistit, jestli není ještě nějaká jiná cesta

Pokud budu chtít spouštět Lint v CI, budu si muset pro sestavení kontejneru commitovat do repozitáře nějaký fejkový config s lokálními daty. Ale asi tedy není jiná možnost než si sestavit extension ručně, nebo vygenerovat celý kontejner a vytáhnout si extension z něj

Gappa
Nette Blogger | 207
+
0
-

David Grudl napsal(a):

Přidal jsem tam metodu Linter::getEngine(), tím by se to mělo vyřešit.

Díky, to je přesně ono :)