Pojďte otestovat Nette 2.4 RC
- finwe
- Člen | 58
Úplně správně by to mělo být try_files $uri $uri/ /index.php$is_args$args;
A je to jako best practice někde u quickstartu nebo obecně v dokumentaci? Nebo v nějakym ukázkovym konfigu jako součást repozitáře? (Nenašel jsem, předpokládám, že není. Commitnul som)
Informaci o té změně a potenciální nefunkčnosti bych pak taky rád viděl v nějakých poznámkách k vydání, prosím.
- kukulich
- Člen | 58
mrtnzlml napsal(a):
Tak zatím nevím o co s tou rychlostí jde, ale podle Tracy se stránka načítá normálně rychle. Jen TTFB je třeba 15 sekund. Nedávno řešil někdo něco podobného, pokud si dobře vzpomínám. Je tomu tak?
Nemas zapnuty Session panel? Nam stranku hrozne zpomalovala Tracy data, ktera se v nem vykreslovala. Chtel jsem poslat pull request, aby se ta data ignorovala, ale jeste jsem to nestihl :(
- medhi
- Generous Backer | 255
Po nasazení 2.4 dostávám chybu
Call to a member function getControl() on null
tam, kde generuji
v šabloně ručně checkboxy. Checkboxy jsou v containeru
domeny
, proto ta pomlčka v jejich názvu:
Vygenerovaná šablona:
<?php
1072: $iterations = 0;
1073: foreach ($dalsiDomeny as $domena) {
1074: list($domenabez, $koncovka) = explode('.', $domena, 2);
1075: if ($koncovka != $objednavka->koncovka) {
1076: ?> <div class="checkbox">
1077:
1078: <?php echo end($this->global->formsStack)["domeny-$koncovka"]->getControl() /* line 169 */ ?>
Chyba je na řádku 1078.
Vůbec netuším, kde pátrat. Dle error.log je
$this->global->formsStack
NULL.
Editoval medhi (31. 5. 2016 13:49)
- kukulich
- Člen | 58
Tak jak jsem slíbil, tak zde pár tipů a zkušeností, jak jsme aktualizovali na Slevomatu na Nette 2.4:
- Pokud jste s aktualizací ještě nezačali, tak jako první doporučuju vypnout na začátku zobrazení DEPRECATED chyb. Nejdřív vyřešte ostatní chyby a až na závěr řešte ty DEPRECATED.
- Koukněte na všechny vaše závislosti, které používají ve svých závislostech Nette. Je pravděpodobné, že některé z nich bude třeba minimálně aktualizovat, případně i udělat pull request (nebo aspoň dočasný fork).
- Koukněte se u sebe na cokoliv z Nette, co si nějak upravujete nebo máte
úplně vlastní implementaci. U nás jsme museli opravit
Configurator
,TemplateFactory
,Latte\Engine
, vlastní formulářové komponenty, většinu vlastních maker. Nejlepší je podívat se na diff, co se dělo v původních implementacích přímo v Nette, aby vám něco důležitého neuteklo.
Když se dívám na seznam commitů, tak nakonec jednoznačně nejvíc času
zabralo řešení DEPRECATED chyb. Další v pořadí bylo řešení
{block|filter}
, tedy že nově jako první parametr do filtrů
chodí Latte\Runtime\FilterInfo
. To jsme nakonec vyřešili tak,
že {block|filter}
jsme přestali úplně používat. Napsali jsme
si pár dalších vlastních maker. I to vypadá lépe :)
Celkově můžu říct, že mi upgrade na Nette 2.4 zabral mnohem více času, než jsem čekal. Jak jsem psal výše, tak to ale primárně bylo způsobeno DEPRECATED chybami. Doufám, že upgrade na Nette 3.0 bude díky tomu rychlovka :) Navíc můžu potvrdit, co už tady někdo psal, že ve většině případů jsem z Nette dostal dost podrobné vysvětlení, co mám upravit.
Davide, dobrá práce!
- kukulich
- Člen | 58
@DavidGrudl Metoda Form::beforeRender()
mi zní jako
dobrý nápad. Zrovna minulý týden jsme ve Slevomatu řešili, jak do všech
formulářů hromadně v některých situacích přidat nějaké prvky. Tohle
by nám pomohlo.
Jestli to pomůže tomu replicatoru, se nějak nemůžu rozhodnout. Zdrojáky
jsem viděl poprvé, když jsem se ho snažil minulý týden patchnout :)
Primární problém byl v tom, že se moc brzo volalo
receiveHttpData()
, takže se nevykonal kód v
if ($action instanceof Link) {
a formuláři se pak vygenerovala
nesmyslná action
.
- David Grudl
- Nette Core | 8227
@kukulich @SendiMyrkr přidal jsem do formuláře metodu beforeRender() a teď už by to mělo fungovat snad dobře.
BTW navíc je nyní ve formuláři i event $onRender.
- romiix.org
- Člen | 343
Ajax Tracy je úplne skvelý nástroj, ale je možné ju pre niektoré dotazy
pozastaviť Tracy?
Periodicky cez JS kontrolujem notifikácie a zakaždým sa nanovo generuje
aj Tracy.
- Felix
- Nette Core | 1245
Jenom takovy postreh z aktualizace Componette na 2.4.
Latte aktualne hlasi, ze promena $template
je deprecated a nema
se pouzivat. Mel jsem na componette filter zaregistrovany pres neon, ktery jsem
chtel mit ve vsech sablonach. Byla to spis funkce nez klasicky filtr.
V sablone jsem mel pak:
<a n:tag-if="!$template->isPhpDependency($name)">
Neni problem nahradit $template
za $control
a
pridat metodu co to bude delegovat. Jenom me tak zajimalo, jestli je chtene.
Muzu si tedka udelat vlastni TemplateFactory
, kde budu
nastavovat napriklad $_template
a pak to budu pouzivat ve vsech
sablonach.
Je to tak schvalne?
Jinak super prace! Nic vic jsem resit nemusel.
- uestla
- Backer | 799
Nevím, jestli někde nedělám chybu, ale dynamické filtry nefungují při
aplikaci na block
?
services:
latte.latteFactory:
setup:
- addFilter( null, 'Filters::common' )
class Filters
{
function loader($filter, $value)
{
if (method_exists($this, $filter)) {
return call_user_func_array([$this, $filter], array_slice(func_get_args(), 1));
}
}
function my_filter($s)
{
return $s;
}
}
{block |my_filter}Test{/block}
Končí výjimkou
LogicException: Filter |my_filter is not defined.
.
- kukulich
- Člen | 58
- kukulich
- Člen | 58
Nasadil jsem poslední RC na Slevomat a všechno funguje. A potvrzuju, že i kdyby/replicator nyní funguje bez jakéhokoliv patche.
Jen commit https://github.com/…a6df11826142 mi teda dal trochu zabrat, ale aspoň jsem náš kód zase trochu vyčistil :)
Editoval kukulich (7. 6. 2016 22:53)
- Jan Tvrdík
- Nette guru | 2595
@DavidGrudl Tohle funguje v Latte 2.3 OK, ale v Latte 2.4 to vede na double-escaping. Workaround s capture pořád funguje dobře.
<td colspan="2" data-content="{include MailPanel.body.latte, message => $message|escape}"></td>
Vypadá to, jako by ses rozhodoval, jak a zda to escapovat předtím, než se vyhodnotí filtry.
- David Grudl
- Nette Core | 8227
@kukulich a kvůli něčemu jinému, než filtrem nad
$template
? Toho jsem měl v šablonách taky mraky a vyřešil
jsem to regulárem \$template->(\w+)\(([^,)]+)(,[^)]+)?\)
→ ($2|$1$3)
Složitější byly případy, když jsem si dával do šablony „jakože
filtry“, např. $template->rss,
což samozřejmě lze jednoduše přepsat na ('feed.xml'|rss)
, ale
vypadá to blbě.
Samozřejmě se to dá řešit vytvořením metody na presenteru
$presenter->rss()
, ale to není přenosné do více šablon.
Nebo předáním callbacku do proměnné $rss
a pak voláním
$rss('feed.xml')
. Ale to nelze nastavit globálně na
TemplateFactory. Nebo přes provider, který lze nastavit globálně, a volat
$this->global->rss('feed.xml')
. A nebo mergnout podporu pro
vlastní funkce, takže by se callback nastavil přes
$latte->addFunction('rss', ...)
a používal jako
rss('feed.xml')
, ale fakt si nejsem jist, jestli je tohle úplně
potřebné.
- David Grudl
- Nette Core | 8227
Jan Tvrdík napsal(a):
@DavidGrudl Tohle funguje v Latte 2.3 OK, ale v Latte 2.4 to vede na double-escaping.
Ono vlastně teď {include}
provádí automatické
escapování.
Protože {$var|escape}
vede k double escapingu, mělo by
analogicky i {include|escape}
vést k double escapingu. Tudíž
bych to vyrešil tak, že |escape
se bude ignorovat, ale vyhodí to
noticku.
- Jan Tvrdík
- Nette guru | 2595
@DavidGrudl Rozdíl je v tom, že u {$var}
můžeš
explicitně zapnout manuální mód, pomocí |noescape
, což u
{include}
nefunguje.
- David Grudl
- Nette Core | 8227
Jan Tvrdík napsal(a):
@DavidGrudl Rozdíl je v tom, že u
{$var}
můžeš explicitně zapnout manuální mód, pomocí|noescape
, což u{include}
nefunguje.
Funguje, ale jmenuje se to |nocheck
. Asi bych to změnil taky na
|noescape
.
(Jen abych dovysvětlil: v původním konceptu co připravil
@DavidMatějka to bylo |noescape
, ale tehdy součástí
automatické escapování nebylo, jen kontrola kontextů, tak jsem to navrhl
změnit na |nocheck
. Pak se ukázalo, že těch chyb kontextů se
v praxi projevuje docela dost, není úplně snadné vysvětlit, jak je
řešit, tak jsem tam přidal automatické escapování pro všechny
nahlášené situace, čímž pádem je rozumné se vrátit k
|noescape
).
- David Grudl
- Nette Core | 8227
Je tady ještě jedna věc, kterou se snažím vyřešit od 2.1, a tou jsou povinné a nepovinné prvky formuláře. V podstatě jde o to, že
$form->addText('email')->addRule($form::EMAIL);
vytváří implicitně povinné políčko, protože pokud není vyplněné,
validace neprojde kvůli tomu, že prázdný řetězec není platná emailová
adresa. Ale zároveň nemá nastaveno setRequired()
a z toho
vyplývá, že chybí například třída v HTML atd.
- kukulich
- Člen | 58
@DavidGrudl Filtry nad $template
jsem vyřešil už
napoprvé a bylo to podobně snadné, jak píšeš, ale teď jsem musel
vyřešit $_form
. Máme pár hodně složitých formulářů, kde
se kvůli znovupoužitelnosti různě includují šablony, je tam hodně
{formContainer}
apod. Ale jak jsem psal, myslím, že to našemu
kódu prospělo, zmizelo pár ošklivostí a je to teď hezčí :)
Editoval kukulich (8. 6. 2016 22:24)
- kukulich
- Člen | 58
@DavidGrudl Ještě k těm vlastním funkcím. Osobně mi to
potřebné nepřijde. My pravidelně používáme callbacky do proměnné, když
je to něco, co se týká jednoho presenteru. Když to má být
znovupoužitelné, tak prostě máme filtr (klidně jako
('feed.xml'|rss)
) a nebo si napíšeme vlastní makro
{rss 'feed.xml'}
.
- uestla
- Backer | 799
Kdyby někomu padala aplikace na
Nette\MemberAccessException: Cannot write to a read-only property Nette\Reflection\ClassType::$name.
,
případně
Nette\Application\UI\PresenterComponentReflection: Cannot write to a read-only property Nette\Reflection\ClassType::$name.
,
zkuste upgradovat PHP – mně to dělalo na verzi 7.0.1, verze 7.0.6 už je v cajku.
Vypadá to, že SmartObject
odhalil chybu v samotném
PHP :-D
- xificurk
- Člen | 121
Ahoj, ještě bych chtěl otevřít otázku přidání konfliktů do composer.json.
Jeden příklad za všechny je vztah latte – application. Každý z těchto balíčků je sice možné používat samostatně bez toho druhého, tedy není mezi nimi žádná tvrdá závsilost. Je ale prakticky nemožné(*) používat dohromady třeba latte 2.4 a application 2.3 – tahle skutečnost není nikde v composer.json podchycena, a v případě, že to zkusíte, tak aplikace vyhazuje podivné chyby bez zjevné příčiny (konec konců i přímo v tomto vlákně na tom pár lidí na tom pohořelo).
Řešení je celkem jednoduché – do composer.json se přidají konflikty
pro nekompatibilní verze. Otázkou je, kde všude by se měly přidat? Dvojice
latte-application je myslím celkem jasná, ale co zbytek?
Existují případy, kdy používáte oba balíčky, ale jejich integraci mezi
sebou si zajišťujete sami (nebo vůbec nepoužíváte)? Třeba latte
a forms?
(*) Museli byste re-implementovat v podstatě celý Bridge znova.
Editoval xificurk (13. 6. 2016 17:43)
- David Grudl
- Nette Core | 8227
@xificurk Řekl bych, že když nette/application 2.4 vyloučí latte, nette/forms a nette/di ve verzi < 2.4, tak by to mohlo být dostačující.
- xificurk
- Člen | 121
@DavidGrudl V podstatě by měly být konflikty symetrické na obou
stranách, tj. i v di a forms přidat konflikt s application < 2.4.
Podobný problém, ale existuje i třeba u vazby forms-latte (formulářová
marka nově používají provider z latte 2.4)… Ale tady bych se už trochu
bál, že někdo bude chtít tyto dva balíčky používat bez vzájemné
integrace a nevím, jestli je konflikt úplně košér.
- David Grudl
- Nette Core | 8227
Myslím, že samostatné použití bez application je tak výjimečné, že se jím asi nemá smysl zabývat.
- David Grudl
- Nette Core | 8227
Vydání Nette 2.4 by mělo připadnout na nějaké hezké datum a co by mohlo být lepšího než dnešek, kdy má @chemix narozeniny (+ ještě jedna událost, mrk mrk @milo)!
Vydal jsem verzi 2.4 takřka u všech balíčků, zabralo mi to celý den a na vydání ještě čekají neon, mail, latte, http, forms, di, database a application. Je tak úplně naprosto poslední možnost otestovat, jestli pod verzí 2.4 fungují i vaše projekty.
Před testováním doporučuji vypnout E_USER_DEPRECATED, tj. neřešit deprecated hlášky, ale ověřit, jestli všechno funguje.
- enumag
- Člen | 2118
@erikbalog O tom se ví… je potřeba akorát přehodit tenhle commit do starší větve Kdyby/Doctrine.
- enumag
- Člen | 2118
@erikbalog Bohužel budeš muset počkat nebo si udělat fork… Do Kdyby/Doctrine nemám práva pro zápis a @FilipProcházka zatím nemá čas to řešit (zkoušky). Nebo může nainstalovat master větev, ale ta je dost jiná takže by asi nebylo snadné ji rozfungovat. A hlavně se bude ještě dost měnit.
Editoval enumag (21. 6. 2016 15:16)
- qwerin
- Člen | 25
erikbalog napsal(a):
@enumag pises ze do starsej vetve.. ako si teda mam aktualizovat na tu najnovsiu ?
kukni sem:http://zlml.cz/…th-nette-2-4
- Tomáš Jacík
- Člen | 147
Chtěl jsem dnes otestovat 2.4 a hned jsem narazil na problém s Latte makry.
V composer.json mám toto:
"require": {
"php": ">=5.6.0",
"nette/application": "^2.4",
"nette/bootstrap": "^2.4.1",
"nette/caching": "^2.5",
"nette/database": "^2.4",
"nette/di": "^2.4",
"nette/finder": "^2.4",
"nette/forms": "^2.4",
"nette/http": "^2.4",
"nette/mail": "^2.4",
"nette/robot-loader": "^2.4",
"nette/safe-stream": "^2.3",
"nette/security": "^2.4",
"nette/utils": "^2.4",
"latte/latte": "^2.4",
"tracy/tracy": "^2.4",
"kdyby/console": "@dev",
"kdyby/events": "@dev",
"kdyby/rabbitmq": "@dev",
"kdyby/forms-replicator": "@dev",
"o5/grido": "^2.1.0",
"nextras/forms": "@dev",
"ramsey/uuid": "^3.4.1"
},
"minimum-stability": "dev"
Chybová hláška vypadá takto: http://i.imgur.com/BjrAoGd.png
Editoval Tomáš Jacík (26. 6. 2016 21:24)
- Tomáš Jacík
- Člen | 147
@CZechBoY Nefunguje to ani s víceméně prázdnou šablonou.
Layout:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div class="container-fluid">
{include content}
</div>
</body>
</html>
Šablona:
{block content}
{/block}
Edit: Podle všeho bude nejspíše problém přímo v balíku nette/forms, selže to při registraci makra label: http://i.imgur.com/3NDJgNx.png
@DavidGrudl Nevím jak to opravit, můžeš se na to prosím podívat?
Editoval Tomáš Jacík (26. 6. 2016 21:47)
- David Matějka
- Moderator | 6445
@TomášJacík asi za to muze nextras/forms https://github.com/…utMacros.php#L30, ktere registruje ten label bez flagu jako nette/forms
- Tomáš Jacík
- Člen | 147
@DavidMatějka Máš pravdu, z té chybové hlášky jsem to nepoznal :( Po vyhození to funguje, takže díky!
- ic
- Člen | 430
Antik napsal(a):
Alternativa k ~$form::PATTERN někdy bude nebo mám použít negative lookahead?
dá se pořád do kladného $form::PATTERN zapsat záporný regulární výraz (třeba používám na zakázaná uživatelská jména již při registraci takovýto regexp a všechno se pak validuje už v prohlížeči u klienta):
pattern="^(?!(admin|administrator|servis|…)$).*"
(atribut input elementu)
- David Grudl
- Nette Core | 8227
Doprogramoval jsem chystanou změnu required/optional formulářových prvků a nette/forms, poslední balíček čekající na vydání 2.4.0, je dokončený. Poprosím vás naposledy o otestování.
Co se mění? setRequired(FALSE)
nyní udělá prvek plně
volitelný, tj. pokud není vyplněn, neaplikují se validační pravidla. Lze
tím nahradit větve addCondition($form::FILLED)
. Zároveň díky
tomu mohly vzniknout novinky jako $form->addEmail()
nebo
addInteger()
.
Nicméně je to BC break, setRequired(FALSE)
předtím nedělalo
vlastně nic, tj. validační pravidla se postupně vykonávala, i když prvek
vyplněný nebyl.
Mám za to, že setRequired(FALSE)
v kódu snad nikdo
nepoužívá. Zkuste své kódy prohledat a pokud je to jinak, udělal by
namísto toho metodu setOptional()
a
setRequired(FALSE)
by vyhazovalo warning.
Dále vás Nette před vykreslením formuláře upozorní, pokud nad
nějakým prvkem použijete addRule()
(tedy je efektivně
povinný), ale zapomněli jste jej označit jako povinný pomocí
setRequired()
.
Nezapomeňte zaktualizovat netteForms.js
- Felix
- Nette Core | 1245
Jenom hlasim, ze componette s konfiguraci:
Funguje v pohode.
"nette/application": "dev-master",
"nette/caching": "dev-master",
"latte/latte": "dev-master",
S timhle, hlasi chybu.
"nette/application": "~2.4.0",
"nette/caching": "~2.4.0",
"latte/latte": "~2.4.0",
Editoval Felix (30. 6. 2016 11:27)
- blaztar
- Člen | 93
Felix napsal(a):
S timhle, hlasi chybu.
"nette/application": "~2.4.0", "nette/caching": "~2.4.0", "latte/latte": "~2.4.0",
Caching už je ve verzi 2.5. Co zkusit.
"nette/application": "^2.4",
"nette/caching": "^2.4",
"latte/latte": "^2.4",
Editoval blaztar (30. 6. 2016 11:43)
- David Grudl
- Nette Core | 8227
To je právě problematické, protože koliduje jen to makro, které je pouhým dodatkem v nette/caching. Řešením by bylo všechny bridge přesunout do samostatných repozitářů, ale tím by se z nette stal tak velký projekt, že už bych fakt neměl sílu to udržovat.
- radas
- Člen | 225
Dříve jsem měl ve formuláři
$this->addText('identifier', 'Identifier')
->addRule(self::PATTERN, 'Položka "%label" musí obsahovat 7 číslic.', '([0-9]\s*){7}');
Takže při nevyplnění nebo špatném vyplnění uživatel dostal jednu chybovou hlášku, ze které bylo ihned zřejmé, co je špatně.
Teď ale musím psát
$this->addText('identifier', 'Identifier')
->setRequired('Položka "%label" musí být vyplněná.')
->addRule(self::PATTERN, 'Položka "%label" musí obsahovat 7 číslic.', '([0-9]\s*){7}');
čímž se zobrazí zbytečně hlášky dvě. Není to škoda?
- David Grudl
- Nette Core | 8227
Není. Pokud (což je důležité dělat) vizuálně odlišuješ povinné
položky, třeba pomocí třídy
required, tak se předtím identifier
tvářila jako nepovinná
položka, což není pravda.
Pokud není úplně jasné, že jaký má mít identifikátor tvar, tak to chce vedle políčka popsat také, že má mít x číslic se uživatel nesmí dozvídat až z chybové hlášky.