Pojďte otestovat Nette 2.4 RC

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
finwe
Člen | 58
+
+1
-

Ú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.

mrtnzlml
Člen | 140
+
0
-

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?

kukulich
Člen | 58
+
0
-

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
+
+1
-

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
+
+15
-

Tak jak jsem slíbil, tak zde pár tipů a zkušeností, jak jsme aktualizovali na Slevomatu na Nette 2.4:

  1. 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.
  2. 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).
  3. 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!

Šaman
Člen | 2634
+
0
-

Skoro si říkám, jestli je 2.4 opravdu jen desetinkový posun, nebo je to spíš 2.5 – něco mezi Nette 2 a 3, na kterou se i těmi deprecated připravuje.

kukulich
Člen | 58
+
0
-

@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 | 8116
+
+3
-

@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
+
+3
-

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 | 1186
+
+1
-

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 | 796
+
0
-

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
+
+1
-

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
+
0
-

@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 | 8116
+
+1
-

@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 | 8116
+
0
-

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
+
0
-

@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 | 8116
+
+2
-

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 | 8116
+
+1
-

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.

…pokračování

kukulich
Člen | 58
+
+1
-

@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
+
+1
-

@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 | 796
+
0
-

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
+
+2
-

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 | 8116
+
+3
-

@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
+
0
-

David Grudl napsal(a):

@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í.

Tohle imho nestačí, protože to nevyloučí instalaci např. latte 2.4 a application 2.3.

David Grudl
Nette Core | 8116
+
0
-

@xificurk takže v Latte vyloučit nette/application < 2.4. Co dalšího?

xificurk
Člen | 121
+
0
-

@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 | 8116
+
0
-

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 | 8116
+
+24
-

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.

Milo
Nette Core | 1283
+
+2
-

@DavidGrudl Héj, to je pro mě pocta! Datum Honzovo narozenin a vydání Nette 2.4 si budu pamatovat nadosmrti :)

erikbalog
Člen | 27
+
+2
-

Nette\DI\Statement::setEntity is deprecated, change Statement object itself.
doctrine to hlasi dal som „minimum-stability“: „dev“

enumag
Člen | 2118
+
0
-

@erikbalog O tom se ví… je potřeba akorát přehodit tenhle commit do starší větve Kdyby/Doctrine.

erikbalog
Člen | 27
+
0
-

@enumag pises ze do starsej vetve.. ako si teda mam aktualizovat na tu najnovsiu ?

enumag
Člen | 2118
+
0
-

@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
+
+1
-

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 | 146
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

@TomášJacík a latte kod vypadá jak? :-)

Tomáš Jacík
Člen | 146
+
0
-

@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
+
+1
-

@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 | 146
+
0
-

@DavidMatějka Máš pravdu, z té chybové hlášky jsem to nepoznal :( Po vyhození to funguje, takže díky!

Martk
Člen | 652
+
0
-

Alternativa k ~$form::PATTERN někdy bude nebo mám použít negative lookahead?

David Grudl
Nette Core | 8116
+
0
-

To bude lepší kvůli kompatibilitě s HTML 5 atributem pattern.

ic
Člen | 430
+
+1
-

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 | 8116
+
+11
-

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 | 1186
+
0
-

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
+
+1
-

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)

Felix
Nette Core | 1186
+
0
-

@blaztar, @DavidGrudl

Dekuji, pomohlo. Mozna by chtel zase pridat konflikt, ze latte koliduje s nette/caching 2.4? Ale to necham Davide na tobe, moc tomu jeste nerozumim.. :-)

David Grudl
Nette Core | 8116
+
+4
-

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 | 221
+
+1
-

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 | 8116
+
0
-

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.