Latte 3: největší vývojový skok v dějinách Nette

kukulich
Člen | 55
+
0
-

Hlásím první bug.

<a href="{$link->url|formatUrl}">

Property ->url obsahuje object Url a s tím počítá i filter formatUrl. Bohužel aktuálně se vygeneruje toto:

echo LR\Filters::escapeHtmlAttr(($this->filters->formatUrl)(LR\Filters::safeUrl($link->url)))

Tedy nejprve se to prožene přes safeUrl, které z toho udělá string a tím formatUrl zhavaruje.

Slevomat\Url\UrlFormatter::format(): Argument #1 ($url) must be of type Slevomat\Url\Url, string given

Myslím, že safeUrl má být poslední.

kukulich
Člen | 55
+
+1
-

Taky teda asi zlobí i fórum, protože tady vidím 500: https://forum.nette.org/…-application

David Grudl
Nette Core | 7769
+
0
-

Mělo by to být opravené.

mrfazolka
Člen | 22
+
0
-

Nevím jestli je to správný dotaz sem, každopádně – je možné s novou verzí latte, řešit problém použití různých view komponenty a předávání parametrů v šabloně, což se doposud muselo obcházet různými způsoby (viz. např diskuze zde https://forum.nette.org/…ontrol-small a spousta opakujících se dotazů na foru), jelikož při redrawControl() se volá pouze render() komponenty?

kukulich
Člen | 55
+
0
-

David Grudl napsal(a):

Mělo by to být opravené.

Potvrzuji. Na Slevomatu se mi povedlo aktuálně zkompilovat všech asi 2000 šablon a mám zelený build :) Pokud by vyšly u všech 4 repositářů nějaké RC verze, tak bych to i zkusil na produkci.

David Grudl
Nette Core | 7769
+
+1
-

@kukulich to je super!

@mrfazolka cílem Latte 3.0 je, aby fungovalo identicky s Latte 2. Ale jinak k používání toho co popisuješ uvnitř snippetů existuje právě ta snippetArea.

chemix
Nette Core | 1246
+
+1
-

Dokazete mi poradit jak L3 nainstalovat ?

    "require": {
        "php": ">= 8.0",
        "nette/application": "^3.1",
        "nette/bootstrap": "^3.1",
        "nette/caching": "^3.1",
        "nette/di": "^3.0",
        "nette/finder": "^2.5",
        "nette/forms": "^3.1",
        "nette/http": "^3.1",
        "nette/mail": "^3.1",
        "nette/robot-loader": "^3.4",
        "nette/security": "^3.1",
        "nette/utils": "^3.2",
        "latte/latte": "3.*",
        "tracy/tracy": "^2.8",
        "texy/texy": "^3.1",
        "nextras/orm": "^4.0",
        "nextras/migrations": "^3.1",
        "nextras/static-router": "^2.0.1",
        "contributte/console": "^0.9"
    },
    "minimum-stability": "beta"
 {dev} .../KreativniLaborator/posobota.cz$ composer upgrade -W
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - nette/forms[v3.1.0, ..., v3.1.6] conflict with latte/latte v3.0.0-beta2.
    - Root composer.json requires latte/latte 3.* -> satisfiable by latte/latte[v3.0.0-beta1, v3.0.0-beta2].
    - Root composer.json requires nette/forms ^3.1 -> satisfiable by nette/forms[v3.1.0, ..., v3.1.6].

Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.

Petr Parolek
Člen | 412
+
0
-

@chemix Ahoj, zkus dev verze nette/appliaation a nette/forms.

Editoval Petr Parolek (29. 4. 20:27)

chemix
Nette Core | 1246
+
0
-

Tak minimalni verze „dev“ pomohlo, a kdyz jsem odstranil dve komponenty (contributte/mailing a nextras/mail-panel) tak vse funguje Jdu psat @Felix a @Merxes o podporu pro 3.0-beta 🐣

"require": {
        "php": ">= 8.0",
        "nette/application": "^3.1",
        "nette/bootstrap": "^3.1",
        "nette/caching": "^3.1",
        "nette/di": "^3.0",
        "nette/finder": "^2.5",
        "nette/forms": "^3.1",
        "nette/http": "^3.1",
        "nette/mail": "^3.1",
        "nette/robot-loader": "^3.4",
        "nette/security": "^3.1",
        "nette/utils": "^3.2",
        "latte/latte": "^3.0",
        "tracy/tracy": "^2.8",
        "texy/texy": "^3.1",
        "nextras/orm": "^4.0",
        "nextras/migrations": "^3.1",
        "nextras/static-router": "^2.0.1",
        "contributte/console": "^0.9"

    },
    "minimum-stability": "dev"
filbar
Člen | 12
+
0
-

Narazil jsem ještě na nové chování u {_ makra pro překlad. Ve staré verzi Latte mi fungovalo

{_ 'MOD_CONTENT_IMAGE_RESOLUTION',$config->get('list_width',520),$config->get('list_height',390)}

s tím, že věci za čárkou se předávaly jako parametry do translate funkce. V současné verzi Latte ale hlásí chybu

Unexpected ',' (in '.../content/editAdmin.media.latte' on line 12 at column 90) search►
dakur
Člen | 351
+
0
-

@DavidGrudl Na latte 2.11.2:

{* původně *}
{* výsledek: Put variables in curly brackets, replace 'timeAgo-$feedback->encodedId' with 'timeAgo-{$feedback->encodedId}' (or wrap whole expression in double quotes) *}
{control timeAgo-{$feedback->encodedId}:withTooltip, $feedback->postedAt}

{* jak jsem myslel, že to bude fungovat *}
{* výsledek: Component name must be non-empty alphanumeric string, 'ZDFhNmNmN2ItNjczZC00MTZhLWI0MjctY2MxODM3NTA0Yjc1:withTooltip' given. *}
{control 'timeAgo-' . $feedback->encodedId . ':withTooltip', $feedback->postedAt}

{* jak to teda funguje *}
{control timeAgo-{$feedback->encodedId}:withTooltip, $feedback->postedAt}

Pokud tam ale není ten render param, tak běžný concatenation funguje: {control 'xyz-' . $var}

Mít curly braces v curly braces mi však přijde divný, nejde to nějak jen s uvozovkami?

Editoval dakur (2. 5. 12:58)

David Grudl
Nette Core | 7769
+
0
-

@filbar opraveno

David Grudl
Nette Core | 7769
+
+2
-

Ještě zvažuju jednu interní úpravu, a sice že bych opakující se

/** @var array<ArgumentNode|VariadicPlaceholderNode> */
public array $args = [];

obalil třídou a tak zaměnil na public ArgumentListNode $args

Kašlu na to :)

David Grudl
Nette Core | 7769
+
+1
-

Latte beta 4: ještě jsem

  • vylepšil sandbox
  • přidal možnost určovat prioritu n:attributů
  • mírně vylepšil nody v Latte\Compiler\Nodes\Php

Na TODO listu mám poslední věc a to nějak se zbavit Latte\Runtime\Filters::$dateFormat.

David Grudl
Nette Core | 7769
+
0
-

@dakur dvojtečka nepatří do uvozovek, to je oddělovač dvou parametrů, podobně jako čárka.

kukulich
Člen | 55
+
0
-

@DavidGrudl

Beta4 vyhazuje chybu:

Attempt to read undeclared property TemplateSlevomatCsTemplatesLayout::$blocks.

Dělá to kód:

 if ($this->global->snippetDriver?->renderSnippets($this->blocks[self::LayerSnippet], $this->params)) {

Vypadá to, že je třeba poladit UIExtension. Když jsem se UIExtension::snippetRenderingPass() zbavil, tak vše funguje, takže jsem našel jen tuto chybu.

filbar
Člen | 12
+
0
-

Ještě jsem narazil na jeden problém s (explode) chováním. V šabloně používám cca

"{plink nejaka_akce (explode)$presenter->getRequest()->getParameters()}":null

ale v nové verzi končím na

Cannot unpack array with string keys

Taky mám ještě dotaz zda-li půjde vlastní makra přidávat přes config.neon, tak jak to je teď, nebo se to bude muset dít přes addExtension v base presenteru?

David Grudl
Nette Core | 7769
+
0
-

@kukulich sakra, měl jsem za to, že jsem změnil Template::$blocks na protected, ale asi jsem to nepushul… Už by to tam mělo být.

@filbar to už by mělo být opraveno, jaký přesně to generuje kód v šabloně?

ad config: jo, akorát místo macros: to bude extensions:

Petr Parolek
Člen | 412
+
0
-

David Grudl napsal(a):

Latte beta 4: ještě jsem

  • vylepšil sandbox
  • přidal možnost určovat prioritu n:attributů
  • mírně vylepšil nody v Latte\Compiler\Nodes\Php

Na TODO listu mám poslední věc a to nějak se zbavit Latte\Runtime\Filters::$dateFormat.

Paráda, vše mi funguje dobře na mém IS.

kukulich
Člen | 55
+
0
-

@DavidGrudl Potvrzuju, už to funguje.

David Grudl
Nette Core | 7769
+
+6
-

Ještě jsem si vzpomněl, že bych rád dal pryč Engine::addFilter(null, $dynamicFilter), ve prospěch efektivnějšího Engine::addFilterLoader($filterLoader) (viz dokumentace).

Rozdíl je v tom, že zatímco $dynamicFilter měl za úkol rovnou zavolat filtr s předanými parametry a vrátil výslednou hodnotu (nebo null jako odmítnutí), $filterLoader jen vrací samotný filtr jako callable. Díky tomu není potřeba při každém volání opětovně iterovat všemi $dynamicFilter callbacky, autoloadovaný filtr může korektně vracet i null a lze takto autoloadovat i blokové filtry.

(Mrzuté je, že takhle to v Latte ještě v době Nette 2.2 fungovalo, a pak jsem udělal blbé rozhodnutí)

filbar
Člen | 12
+
0
-

@DavidGrudl Potvrzuju, funguje.

dakur
Člen | 351
+
0
-

David Grudl napsal(a):

@dakur dvojtečka nepatří do uvozovek, to je oddělovač dvou parametrů, podobně jako čárka.

@DavidGrudl Když zkusím kteroukoliv z těchto možností, dostanu syntax error, unexpected token ":"

{control 'timeAgo-' . $feedback->encodedId:withTooltip, $feedback->postedAt}
{control "timeAgo-" . $feedback->encodedId:withTooltip, $feedback->postedAt}
{control 'timeAgo-' . $feedback->encodedId:'withTooltip', $feedback->postedAt}
{control "timeAgo-" . $feedback->encodedId:"withTooltip", $feedback->postedAt}
{control 'timeAgo-' . $feedback->encodedId . '':'withTooltip', $feedback->postedAt}
{control "timeAgo-" . $feedback->encodedId . "":"withTooltip", $feedback->postedAt}

Tak to asi nejde.

Editoval dakur (5. 5. 16:09)

David Grudl
Nette Core | 7769
+
+1
-

Mě fungujou úplně všechny. Asi jsem mám lepší Latte :-)

Ještě můžeš přidat

{control "timeAgo-{$feedback->encodedId}":withTooltip, $feedback->postedAt}

Nežádoucí jev „curly braces v curly braces“ tam nevnímám, protože jsou uvnitř řetězce.

Marek Bartoš
Nette Blogger | 692
+
0
-

@DavidGrudl Narazil jsem na to, že Latte nezvládá PascalCase konstanty, interpretuje celou expression jako string. S UPPER_CASE je vše v pořádku.

Toto hlásí Expression 'OriCMF\Admin\Presenter\BaseAdminPresenter::LayoutPath' should be wrapped in double quotes.

{layout OriCMF\Admin\Presenter\BaseAdminPresenter::LayoutPath}

Toto nehlásí nic

{layout OriCMF\Admin\Presenter\BaseAdminPresenter::LAYOUT_PATH}

Editoval Marek Bartoš (6. 5. 23:29)

David Grudl
Nette Core | 7769
+
+6
-

Tak už jdeme do finále!

Vypustil jsem RC pro Latte a navazující Application, Caching a Forms. Bude super, pokud se je pokusíte nasadit a otestovat.

	"require": {
		"nette/application": "^3.1-RC",
		"nette/caching": "^3.1-RC",
		"nette/forms": "^3.1-RC",
		"latte/latte": "^3.0-RC",

Petr Parolek
Člen | 412
+
-2
-

Ahoj, hlásím bug https://github.com/…ailPanel.php#L121:

Latte\CompileException: Unexpected tag {link} (in '.../src/MailPanel.latte' on line 61 at column 16) in /var/www/html/vendor/latte/latte/src/Latte/Compiler/TemplateParser.php:317
Stack trace:
David Grudl
Nette Core | 7769
+
+3
-

Pár poznámek pro autory doplňků používajících Latte.

https://latte.nette.org/…-from-latte2#…

kukulich
Člen | 55
+
0
-

@DavidGrudl

Mám tento kód:

$code[] = $context->format(
	<<<'CODE'
		printf(
			'<link href="%s" rel="stylesheet" media="all" integrity="%s" crossorigin="anonymous">',
			%0.raw::escapeHtmlAttr(($this->filters->staticUrl)($compiledCss->getPath())),
			%0.raw::escapeHtmlAttr($this->global->compiledAssetContentManager->getDigest($compiledCss->getPath())),
		);
	CODE,
	Filters::class,
);

V betách to fungovalo, v RC to havaruje:

Thrown exception 'Unhandled match case 's''

Vygeneruje si to tento kus kódu:

printf(
    '<link href="%0.s" rel="stylesheet" media="all" integrity="%1.s" crossorigin="anonymous">',
    %0.raw::escapeHtmlAttr(($this->filters->stati … h())),
);'

Vlastně to dává smysl, ale nějakým způsobem bych potřeboval zapsat %s. Zkoušel jsem %%s, ale to nezabralo. Je nějaký způsob?

dakur
Člen | 351
+
0
-

@DavidGrudl

Mě fungujou úplně všechny. Asi jsem mám lepší Latte :-)

Je možné, že bez mezer to funguje a s mezerami ne? Latte 2.11.3.

{control 'timeAgo-'.$feedback->encodedId:withTooltip, $feedback->postedAt} {* 👍 *}
{control 'timeAgo-' . $feedback->encodedId:withTooltip, $feedback->postedAt} {* => syntax error *}

Ještě můžeš přidat

{control "timeAgo-{$feedback->encodedId}":withTooltip, $feedback->postedAt}

Nežádoucí jev „curly braces v curly braces“ tam nevnímám, protože jsou uvnitř řetězce.

To je docela fajn varianta. 👍

Editoval dakur (9. 5. 11:34)

David Grudl
Nette Core | 7769
+
0
-

@kukulich ono to předtím ignorovalo neznámé placeholdery jako např. %s, ale došlo mi, že bych tím zavřel cestu k možnému přidání nového placeholderu bez BC breaku, kdyby bylo potřeba. Escapování tam doplním, třeba jako to %%s. Byť teda zrovna v tomhle případě by šlo použít

$code[] = $context->format(
	<<<'CODE'
		printf(
			%raw,
			%raw::escapeHtmlAttr(($this->filters->staticUrl)($compiledCss->getPath())),
			%raw::escapeHtmlAttr($this->global->compiledAssetContentManager->getDigest($compiledCss->getPath())),
		);
	CODE,
	'<link href="%s" rel="stylesheet" media="all" integrity="%s" crossorigin="anonymous">',
	Filters::class,
);

@dakur to mě fakt nenapadlo, že ve vlákně o Latte 3 řešíš Latte 2.

David Grudl
Nette Core | 7769
+
0
-

@kukulich nebo mě napadá ignorovat jednoznakové placeholdery…

kukulich
Člen | 55
+
0
-

David Grudl napsal(a):

@kukulich nebo mě napadá ignorovat jednoznakové placeholdery…

Se bojím, že to nebude stačit pro zápisy typu %1$s.

David Grudl
Nette Core | 7769
+
0
-

Bralo by to %[a-z]{3,} a %\d+\.[a-z]{3,}

kukulich
Člen | 55
+
0
-

David Grudl napsal(a):

Bralo by to %[a-z]{3,} a %\d+\.[a-z]{3,}

To vypadá asi dobře. Nebo je asi taky možnost, že by to bylo třeba %latte.raw Ale jasně je to více psaní. Ale zas jen pro lidi, co píšou tyhle „interní“ věci.

dakur
Člen | 351
+
0
-

@DavidGrudl No psal jsi tu, že je to přechodový můstek, tak jsem čekal, že se to bude chovat stejně jako na v3. 🤷‍♂️🙂 Trojku testovat nemůžu kvůli tomu routingu.

Editoval dakur (9. 5. 15:48)

David Grudl
Nette Core | 7769
+
0
-

@dakur ten můstek je jednosměrný, v2 nemusí rozumět tomu, čemu rozumí v3. Jak souvisí Latte 3 s routingem?

David Grudl
Nette Core | 7769
+
0
-

@kukulich ještě tam doplním %node čistě pro Nody, to %raw mi prostě nesedí…

kukulich
Člen | 55
+
+1
-

David Grudl napsal(a):

@kukulich ještě tam doplním %node čistě pro Nody, to %raw mi prostě nesedí…

To bych řekl, že je skvělý. To mi při prvním testování trvalo, než jsem pochopil.

kukulich
Člen | 55
+
+3
-

@DavidGrudl

Zkoušel jsem teď dev-master a vypadá, že funguje %s i %node. Dnešním dnem jsme ve Slevomatu zaokrouhlili počet Latte šablon na 2000 a všechny se mi teď povedlo zkompilovat :)

Tak snad se do RC2 už nic nerozbije a budu to moct konečně zkusit na produkci :D

IJVo
Člen | 37
+
0
-

@DavidGrudl hlásí mi to tuto chybu:

Error: Class "Latte\Macros\MacroSet" not found  in Bridges\ApplicationLatte\UIMacros.php(27)
Marek Bartoš
Nette Blogger | 692
+
0
-

@IJVo Musíš si nainstalovat verze knihoven kompatibilní s novým Latte, MacroSet v Latte 3 už neexistuje

https://forum.nette.org/…jinach-nette?p=2

IJVo
Člen | 37
+
0
-

Marek Bartoš napsal(a):

@IJVo Musíš si nainstalovat verze knihoven kompatibilní s novým Latte, MacroSet v Latte 3 už neexistuje

https://forum.nette.org/…jinach-nette?p=2

Díky za radu, jenže v nette/application v3.1.6-RC1 pořád v souboru Bridges\ApplicationLatte\UIMacros.php odkaz na ten MacroSet je.

David Grudl
Nette Core | 7769
+
0
-

@IJVo to že je odkaz v nette/application je v pořádku, protože umí pracovat s oběma verzemi Latte.

Ale nette/application samo o sobě UIMacros nevolá, pokud používáš Latte 3. To dělá nějaká jiná knihovna, která s Latte 3 kompatibilní není.

mkoula
Backer | 50
+
0
-
	"require": {
		"nette/application": "^3.1-RC",

Mi pořád instaluje poslední nette/application (3.1.1) a umírá na Latte\Compiler, a funguje to až když jsem to změnil vysloveně na:

"nette/application": "^v3.1.6-RC1",
nightfish
Člen | 263
+
0
-

mkoula napsal(a):
Mi pořád instaluje poslední nette/application (3.1.1) a umírá na Latte\Compiler, a funguje to až když jsem to změnil vysloveně na:

"nette/application": "^v3.1.6-RC1",

@mkoula
Nemáš v composer.json nastaveno "prefer-stable": true? https://getcomposer.org/…04-schema.md#…

mkoula
Backer | 50
+
0
-

nightfish napsal(a):

mkoula napsal(a):
Mi pořád instaluje poslední nette/application (3.1.1) a umírá na Latte\Compiler, a funguje to až když jsem to změnil vysloveně na:

"nette/application": "^v3.1.6-RC1",

@mkoula
Nemáš v composer.json nastaveno "prefer-stable": true? https://getcomposer.org/…04-schema.md#…

Mám, ale pokud to přepnu, tak mi to hodí do dev úplně všechny balíčky a pak už nefunguje vůbec nic :-D
Každopádně díky za pomoc :-)

Marek Bartoš
Nette Blogger | 692
+
0
-

Composer by nejspíš měl preferovat RC verzi, i když je zapnuto prefer-stable, v případě že je RC verze vyžadovaná explicitně. Já to většinou obcházím přes „^3.1.x-dev“ (stáhne se poslední commit z 3.1 větve)

@mkoula Zkus do minimum-stability dát RC

dakur
Člen | 351
+
0
-

David Grudl napsal(a):

Jak souvisí Latte 3 s routingem?

Hm, myslel jsem, že nette/application už v té nové RC verzi vyžaduje i nový nette/routing, ale špatně jsem si přečetl/domyslel error z composeru..

Editoval dakur (11. 5. 12:43)

David Grudl
Nette Core | 7769
+
0
-

K těm problémům s Composerem jsem založil samostatné vlákno https://forum.nette.org/…s-composerem