Latte 3.1 – pojďte otestovat RC

David Grudl
Nette Core | 8295
+
+16
-

Už jsou to neuvěřitelné tři roky od vydání Latte 3.0. Tehdy jsem knihovnu přepsal úplně odznova, obsahuje sofistikovaný PHP a HTML lexer, parser a kompilátor.

Časem se nashromáždilo několik věcí, které bych rád změnil, upravil nebo odstranil, a proto přišel čas na vydání verze 3.1.

Předesílám, že změny se týkají okrajových záležitostí a měla by být zachována plná kompatibilita, tj. na úpravy Latte upozorní jen vyhozením informační notice.

Jestli jsou vaše šablony kompatibilní se dá jednoduše ověřit pomocí Linteru. Já jsem třeba ve všech svých šablonách ve všech projektech musel udělat jen dvě drobné úpravy.

Takže co bych chtěl do verze 3.1 dát:

Nové features:

  • chytré HTML atributy – viz https://forum.nette.org/…eji-do-latte
  • n:attr kontroluje, jestli jsou názvy atributů platné
  • přidáno n:elseif
  • přidána syntax <div n:if={$foo}> (jako alternativa <div n:if="$foo">), kde je možné používat uvnitř hodnoty dvojité a jednoduché uvozovky
  • přidán nullsafe filter $foo?|upper
  • content-type based on file extension – content type šablony se detekuje z přípony, viz dále

Změny:

  • strictTypes is enabled by default: tedy že šablony začnou declare(strict_types=1) (dá se to samozřejmě vypnout, i v konfiguraci)
  • globální konstanty bez lomítka jako FOO je potřeba psát \FOO, tím se přehledně odliší od řetězce FOO
  • komplexní výrazy ve značkách jako include, embed apod psát v závorkách: {include ($a ? 'a.latte' : 'b.latte')}

Zrušení:

  • používání proměnných $this a $__* v šablonách – jsou vyhrazené pro systémové věci
  • undefined unsafe operator ??-> – beru jej jako historický relikt vzniklý před nullsafe ?-> operátorem
  • Latte\Runtime\Filters::$dateFormat – vadí mi, že jde o statickou proměnnou
  • Engine::addFilterLoader() is deprecated – beru to jako historický relikt, žádná jiná oblast v Latte nemá loader

A ještě pár komentářů:

ad n:attr a nevalidní názvy atributů: tady Latte rovnou vyhodí výjimku, nicméně vím, že to třeba rozbíjí Ublaboo Datagrid, který používá <input n:attr="'rowspan=2' => $bool">, tj. jako název atributu uvádí celý atribut i s hodnotou. Tím ale využívá sideefekt, správný zápis by měl být <input n:attr="rowspan => $bool ? 2"> a pak lze název rowspan validovat. Bohužel tyto dynamické věci se nedají kontroloval pomocí Linteru.

Mimochodem, s chytrými atributy zmizí potřeba používat na takové věci n:attr a bude stačit <input rowspan="$bool ? 2">

S návrhem odlišit globální konstanty přišel @mesour, protože mu to zjednoduší parser v PhpStorm, ale musím říct, že to je pomoc i pro mě, protože si sám nejsem úplně jistý, co Latte chápe jako řetězec a co jako konstantu. Když se napíše \FOO, je to jasné.

Rozlišovat content-type podle přípony souboru znamená, že když vykreslím šablonu foo.xml.latte, tak bude automaticky parsovaná jako XML, bez nutnosti uvést {contentType ...} na začátku. Ale taky to znamená, že můžu v šabloně napsat <script>{include script.js}</script> a script.js se bude chápat jako čistý text a vůbec se v něm nebude parsovat Latte. (tohle nechám do další verze)


Všechny featury jsou implementované a bude fajn, když aktuální verzi vyzkoušíte. Minimálně si Linterem projeďte své šablony. Protože nic není dáno a než vyjde verze 3.1 lze cokoliv změnit. Ale na pozdější reklamace nebude brán zřetel :-)

composer require latte/latte:^3.1.x-dev
schaabez
Člen | 3
+
0
-

Nevím, jestli se jedná o bug, nebo zamýšlené chování, ale při použití s překladačem dostávám:

⚠️ User Deprecated: Expression should be placed in parentheses:
(‚hp.precistvice|Přečíst více‘)

Používám následující zápis v Latte:

{_'hp.precistvice|Přečíst více'}

Problém je mezera mezi slovy.

Editoval schaabez (8. 8. 10:53)

Pavel Kravčík
Člen | 1207
+
0
-

Zkusil jsem na větším projektu a kromě data-attribute={$boolValueFromPHP} vše v pohodě. Dává to smysl si to přetypovat, než to přijde do Latte.

David Grudl
Nette Core | 8295
+
+1
-

@schaabez opraveno

schaabez
Člen | 3
+
0
-

Ještě jsem narazil na jedno nešťastné chování

{ifset $data[$key.'_sum']} ... {/ifset} --> OK
{ifset $data[$key . '_sum']} ... {/ifset} --> vyhodí User Deprecated

Editoval schaabez (8. 8. 15:42)

Lumeriol
Generous Backer | 69
+
0
-

Podařilo se mi to úspěšně rozbít za použití multiplieru, knihovny Select2 a ajaxu, kdy mi vyskočil Fatal error, že v metodě highlightFile() argument 2 ($line) musí být int, ale dostal null. Tracy v2.10.10.

Viz Tracy: https://postimg.cc/7CgCRZPK

Lumeriol
Generous Backer | 69
+
+1
-

Našel jsem další změnu chování, nevím zda záměrnou – pokud použiju filtr dataStream, tak se mi nevykreslí obrázek, a to ani v případě, že budu mít vygenerovaný base64 kód v proměnné. Teprve s použitím filtru nocheck to projde. To dosud nedělalo. Bez něj to vyhodí pouze prázdné src nad img tagem.

kukulich
Člen | 64
+
0
-

Narazil jsem aktuálně na toto:

1. Počítám, že tohle by mělo normálně fungovat, protože ta třída má implementován __toString().

User Warning
Ramsey\Uuid\Rfc4122\UuidV1 value in 'data-slevomat-faq-item-id' attribute is not supported

2. Tohle vzniklo tak, že občas si obsah nějakého attributu „předgenerováváme“ pomocí {capture} do proměnné. Každopádně je to asi totéž, co 1.

User Warning
Latte\Runtime\Html value in 'srcset' attribute is not supported

3. Také nám havarují tyto zápisy a nevím, zda správně či ne:

<input n:name="sprintf('images-%s-top', $key)">
{input sprintf('images-%s-internalNote', $key)}
{formContainer sprintf('type%d', $type->value)}

Editoval kukulich (20. 8. 14:50)

David Grudl
Nette Core | 8295
+
+1
-

Zapracoval jsem váš feedback a překopal implementaci chytrých atributů.

Latte 3.1 je z mého pohledu hotové.

Poprosím vás tedy ještě o otestování před vydáním stable verze. Díky!

SamuelThorn
Člen | 38
+
0
-

Skvělá práce. Otestoval jsem na menším webu. Jediné upozornění byl warning na konstantu. Přidal jsem lomítka a jede to.
Zkusím to ještě dál a když tak dám vědět.

SamuelThorn
Člen | 38
+
0
-

Testuji na dalším webu.

Linter mi hlásí „Unexpected tag {asset}, did you mean {ifset}?“ To je v pořádku?

SamuelThorn
Člen | 38
+
0
-

A pak mi to vypsalo ještě varování ve vendor složce:

[ERROR] .\vendor\nette\application\src\Bridges\ApplicationTracy\panel.latte:1:1 Unexpected tag {use} (on line 1 at column 1)
[ERROR] .\vendor\nette\application\src\Bridges\ApplicationTracy\tab.latte:1:1 Unexpected tag {use} (on line 1 at column 1)
[ERROR] .\vendor\nette\di\src\Bridges\DITracy\panel.latte:1:1 Unexpected tag {use} (on line 1 at column 1)
[DEPRECATED] .\vendor\nette\http\src\Bridges\HttpTracy\panel.latte:21 Using unqualified constant ‚DATA‘ is deprecated. Use ‚\DATA‘ with a leading backslash on line 21 at column 36

Application mám 3.2.8
DI mám 3.2.5
HTTP mám 3.3.3

SamuelThorn
Člen | 38
+
0
-

Když použiju filter noescape u makra s překladem:

{_contact.text|noescape}

Latte 3.1 vyhodí:
Filter ‚noescape‘ is not defined or not allowed here, did you mean ‚escape‘?

S Latte 3.0 to fungovalo.

Problém je v tom, že „contact.text“ obsahuje HTML řetězec. Jak na to prosím? Možná to používám špatně.

Edit Toto funguje:
{=contact.text|translate|noescape}

Edit2 Ještě jsem zkusil:
{_'contact.text'|noescape}
a to také nefunguje.

Editoval SamuelThorn (27. 11. 10:55)

dms
Člen | 100
+
0
-

Stejný problém také u nás při použití {_$page->getTitle()|noescape} Používáme Contributte Translation

SamuelThorn
Člen | 38
+
0
-

Marek Bartoš napsal(a):

Here
https://github.com/…xtension.php#L82
https://github.com/…xtension.php#…

Omlouvám se, ale jsem trochu ztracený. Znamená to, že je potřeba, aby proběhla nějaká změna v Contributte/Translation, nebo musím udělat něco u sebe v aplikaci?

David Grudl
Nette Core | 8295
+
+2
-

Ne, do Contribute jsem poslal patch, tak počkej až vydají verzi.

SamuelThorn
Člen | 38
+
+1
-

David Grudl napsal(a):

Ne, do Contribute jsem poslal patch, tak počkej až vydají verzi.

Děkuju.

Edit: Koukám, že včera vyšla verze 2.0.6, kde je tato oprava. A už to funguje. Děkuju.

Editoval SamuelThorn (1. 12. 15:24)

dms
Člen | 100
+
0
-

Ještě jedna věc nám vyskočila jako fatal a linter jí nenajde

<a href="{$var|nocheck}{if true}?subject=x{/if}"></a>

Hodí tohle: LogicException Filter ‚nocheck‘ is not defined or not allowed here

Dříve bylo ok. To je záměrně takto změněné?

Editoval dms (8. 12. 14:35)

David Grudl
Nette Core | 8295
+
0
-

Upravil jsem Linter, aby dokázal najít chyby ve filtrech.

Latte 3.1 nekontroluje URL, pokud se v atributu nachází nějaká další obsah jako třeba ono {if true}?subject=x{/if}. Proto tam teď filtr |nocheck nepatří.

Myslím, že tohle upravené chování má logiku: když už se v atributu mixuje statický text s podmínkami, je jasné, že si stavíš URL „ručně“ a bereš odpovědnost na sebe. Uživatelé můžou použít filtr |checkurl explicitně, pokud jej chtějí.