Latte 3.1 – pojďte otestovat betaverzi!
- David Grudl
- Nette Core | 8282
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é
- 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ězceFOO
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ěnnouEngine::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.
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
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 | 1206
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.
- Lumeriol
- Generous Backer | 68
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 | 68
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 | 59
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)