Zkušenosti z upgradu z 0.9 na 2.0

- kukulich
 - Člen | 59
 
Před dvěma týdny jsem upgradoval jeden větší projekt z Nette 0.9.3 na Nette 2.0. Zkusím zde lehce sepsat svoje poznatky a zkušenosti. Berte prosím na vědomí, že některé věci možná nejsou aktuální pro upgrade z verze 0.9.7. Zabralo mi asi 8 hodin, aby vše fungovalo, pak už jsem si jen hrál s novinkami.
- Přejmenování všech tříd :)
 $context->parametersje pole, ale k prvkům zNette\Environment::getConfig()se dalo přistupovat jako k objektu. To dost komplikuje přechod z Environment na Context- Metoda 
Nette\Forms\Form::getValues()vracíNette\ArrayHash, dříve vracela pole. Pole je třeba vynutit přes parametr. Rozdíl je poznat, když pak používáte nějaké array_* funkce. - Nette\Forms\Form->onSubmit changed its behavior; use onSuccess instead.
 - Nette\Application\UI\Presenter::terminate() is not intended to send a Application\Response; use sendResponse() instead.
 Nette\Application\UI\Presenter::$invalidLinkModeuž není statické, ačkoliv dokumentace tvrdí, že ano https://doc.nette.org/…n/presenters#…- Změnila se deklarace metod
	
Nette\Application\UI\Presenter::formatLayoutTemplateFiles(),formatTemplateFiles(),createTemplate(). Při jejich dědění je třeba přidat parametr$class - Přejmenování metod 
Nette\Security\User::isAuthenticated(),authenticate(),signOut()naisLoggedIn(),login()alogout() - Přejmenování metody 
Nette\Security\Identity::getName()nagetId(), takžegetIdentity()->idnevrací id z pole $data ale identifikátor - Jinak se definují vlastní makra
 - Jinak se vyhledávají šablony a layouty, především když jsou součástí modulu
 @{include $content}nahrazeno za{block #content}- Některé 
{include}v kombinaci s{block #content}přestaly fungovat - Makro 
{ifset}vyžaduje jako koncovou značku{/ifset}, nestačí{/if} - Makro 
{ifCurrent}vyžaduje jako koncovou značku{/ifCurrent}, nestačí{/if}– Navíc je trochu matoucí porovnání zdrojáku a dokumentace, zda je makro zastaralé nebo ne: https://github.com/…UIMacros.php#L66, https://latte.nette.org/cs/tags#… {assign}mělo trochu jinou syntax než{var}Nette\Utils\Arrays::get()dřív nevyžadovalo zadání třetího parametru- Helper 
escapeUrlse přejmenoval naurl - Zrušena bez náhrady třída 
HashTable - Zrušena bez náhrady metoda
	
Nette\Http\Request::getPostRaw() 
Zastaralé metody
- Nette\Http\Request::getUri() is deprecated; use Nette\Http\Request::getUrl() instead.
 - Nette\Http\Url::getAbsoluteUri() is deprecated; use Nette\Http\Url::getAbsoluteUrl() instead.
 - Nette\Http\Url::getHostUri() is deprecated; use Nette\Http\Url::getHostUrl() instead.
 - Nette\Application\UI\Presenter::redirectUri() is deprecated; use Nette\Application.\UI\Presenter::redirectUrl() instead
 - Nette\Forms\Container::addFile() is deprecated; use addUpload() instead.
 - Nette\Forms\Controls\SelectBox::skipFirst() is deprecated; use setPrompt() instead.
 
Podle zdrojáku Nette je takový změn mnohem víc, ale já jsem narazil pouze na tyhle.
Navíc na hraní
- Změna ini konfigurace na neon
 - Přejmenování .phtml na .latte
 - Používání DI a služeb
 
Na závěr můžu říct, že pro projekt, který chcete dál vyvíjet, se rozhodně upgrade vyplatí. Není to zas tak náročně a už po dvou týdnech můžu říct, že nás to hodně nakoplo směrem dopředu, abychom spoustu věcí dělali lépe a radostněji :)

- Patrik Votoček
 - Člen | 2221
 
kukulich napsal(a):
@{include $content}nahrazeno za{block #content}
Spíš za {include #content} :-)
- Makro
 {ifCurrent}vyžaduje jako koncovou značku{/ifCurrent}, nestačí{/if}– Navíc je trochu matoucí porovnání zdrojáku a dokumentace, zda je makro zastaralé nebo ne: https://github.com/…UIMacros.php#L66, https://latte.nette.org/cs/tags#…
Zastaralé je mělo by se používat:
<a n:href=":Homepage:default" n:class="$presenter->linkCurrent ? current">Homepage</a>
{* resp.: *}
<li n:class="$presenter->isLinkCurrent(':Homepage:default') ? current">
	<a n:href=":Homepage:default">Homepage</a>
</li>
				
- kukulich
 - Člen | 59
 
- Makro
 {ifCurrent}vyžaduje jako koncovou značku{/ifCurrent}, nestačí{/if}– Navíc je trochu matoucí porovnání zdrojáku a dokumentace, zda je makro zastaralé nebo ne: https://github.com/…UIMacros.php#L66, https://latte.nette.org/cs/tags#…Zastaralé je mělo by se používat:
<a n:href=":Homepage:default" n:class="$presenter->linkCurrent ? current">Homepage</a> {* resp.: *} <li n:class="$presenter->isLinkCurrent(':Homepage:default') ? current"> <a n:href=":Homepage:default">Homepage</a> </li>
Mám nějaké podezření, že $presenter->linkCurrent mi
vůbec nefungovalo. Taktéž mi myslím nefungovalo
$presenter->isLinkCurrent(':Homepage:*'), což s makrem
funguje.
Navíc se přiznám, že to makro mi přijde v šabloně jako mnohem hezčí řešení než volání funkce.

- Patrik Votoček
 - Člen | 2221
 
kukulich napsal(a):
Mám nějaké podezření, že
$presenter->linkCurrentmi vůbec nefungovalo.
Funguje pomocí „last link“ tj. funguje pouze za předpokladu že je
$presenter->linkCurrent voláno až po samotné tvorbě
odkazu.
Taktéž mi myslím nefungovalo
$presenter->isLinkCurrent(':Homepage:*'), což s makrem funguje.
Wildcard u currentu je dlouhodobý problém který Nette trápí (ani nevím jestli se to do 2.0 stihlo opravit).
Navíc se přiznám, že to makro mi přijde v šabloně jako mnohem hezčí řešení než volání funkce.
Souhlasím jsou situace kdy se to hodí víc. Většinou se ale
ifCurrent používá na CSS třídu a tato třída nebývá samotná
proto je vhodnější použití n:class + fce.

- hrach
 - Člen | 1844
 
Provedl jsem u www.signaly.cz migraci na nejnovejsi nette (2.1) z roku a pul stareho nette. Nebylo to tedy 0.9, ale neco mezi. Pred pul rokem jsem provedl migraci jen formularu, takze nyni jsem s nimi neresil uz tolik problemu.
- pouzil jsem konverzni skripty, ktere plno veci ohlidali
 - vsechny vyse zminene body jsem samozrejme musel zmenit (skriptem, rucne) taky
 - bylo treba kompletne prepsat bootstrapy, konfigy apod; nebyla to takova sranda, protoze signaly pouzivaji nekolik behovych prostredi, 2 typy lokalnich vyvoju, routuji subdomeny jako blogy, atp.
 - do DI jsem neprepisoval modelovou vrstvu, ale brzy na to prijde rada
 - prepisovani sablon
		
- stara syntaxe 
{var promenna obsah}→{var $promenna = $obsah} - ifCurrent pridat uzaviraci ifCurrent, to stejne ifset – neni cas prepisovat to vsechno na novy zpusob
 - kompletni prepis vlastnich maker
				
- novy zpusob je pekny, ale v podstate jsem musel vsechno prepsat od zacatku
 
 - pretizit snad vsechny form macros, ktere jsou ve stavajici implementaci nepouzitelne. aktualni verzi, co pouzivame je tu: https://gist.github.com/2009432
 - if apod. se nesmi krizit, respektive mel jsem tak oifovany casti vypisu <form>u. Nastesti slo vyresit efektne pres define blocky.
 {label endDate}→{label endDate /}, nastesti nebyla takova hruza, regular to prosel…- vyresit jinak ajax u dynamickych komponent, ktere meli cast sve sablony mimo svuj render. https://twitter.com/…063298080769
 
 - stara syntaxe 
 Debug::logException→Debugger::log- jiny format error logu (parsujeme…)
 
Ve vysledku: cekal jsem to horsi, nicmene plno veci je zbytecne stale ohnutych – napr. @secured zabezpeceni. https://github.com/…tte/pull/469
Stesti bylo, ze jsem „spravne“ pouzivali ajaxove komponenty, takze nebylo treba tolik uprav, zamenil jsem pekne za UI\Multiplier a jelo to dal.
Z prevedu mj. vznikly take pullrequesty jako https://github.com/…tte/pull/551. Neslo to tedy prepsat hned napoprve.
Editoval hrach (10. 3. 2012 1:32)

- PetrP
 - Člen | 587
 
V php 5.2 verzi se v Component::lookup odstraňovali namespace, takže šlo zapsat:
$component->lookup('Nette\Application\Presenter')
Je potřeba přepsat na:
$component->lookup('Presenter')