Latte 3: největší vývojový skok v dějinách Nette
- kukulich
- Člen | 58
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 | 58
Taky teda asi zlobí i fórum, protože tady vidím 500: https://forum.nette.org/…-application
- mrfazolka
- Člen | 24
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?
- David Grudl
- Nette Core | 8227
@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 | 1310
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 | 455
@chemix Ahoj, zkus dev verze nette/appliaation a nette/forms.
Editoval Petr Parolek (29. 4. 2022 20:27)
- chemix
- Nette Core | 1310
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 | 13
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 | 493
@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. 2022 12:58)
- David Grudl
- Nette Core | 8227
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 | 8227
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 | 8227
@dakur dvojtečka nepatří do uvozovek, to je oddělovač dvou parametrů, podobně jako čárka.
- kukulich
- Člen | 58
@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 | 13
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 | 8227
@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 | 455
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.
- David Grudl
- Nette Core | 8227
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í)
- dakur
- Člen | 493
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. 2022 16:09)
- David Grudl
- Nette Core | 8227
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 | 1273
@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. 2022 23:29)
- David Grudl
- Nette Core | 8227
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 | 455
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:
- kukulich
- Člen | 58
@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 | 493
@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. 2022 11:34)
- David Grudl
- Nette Core | 8227
@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.
- dakur
- Člen | 493
@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. 2022 15:48)
- David Grudl
- Nette Core | 8227
@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 | 8227
@kukulich ještě tam doplním %node čistě pro Nody, to %raw mi prostě nesedí…
- Marek Bartoš
- Nette Blogger | 1273
@IJVo Musíš si nainstalovat verze knihoven kompatibilní s novým Latte, MacroSet v Latte 3 už neexistuje
- IJVo
- Člen | 38
Marek Bartoš napsal(a):
@IJVo Musíš si nainstalovat verze knihoven kompatibilní s novým Latte, MacroSet v Latte 3 už neexistuje
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 | 8227
@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í.
- nightfish
- Člen | 517
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 | 57
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áš vcomposer.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 | 1273
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
- David Grudl
- Nette Core | 8227
K těm problémům s Composerem jsem založil samostatné vlákno https://forum.nette.org/…s-composerem