Přechod na verzi 2.4
Minimální požadovaná verze PHP je 5.6 (pro Latte a Tracy 5.4).
Verzí Nette 2.4 se rozumí, že máte tyto balíčky nainstalované ve verzi 2.4.*:
"require": {
"nette/application": "2.4.*",
"nette/bootstrap": "2.4.*",
"nette/di": "2.4.*",
"nette/forms": "2.4.*",
"nette/http": "2.4.*",
"nette/security": "2.4.*",
},
Pozor: u ostatních balíčků nainstalujte nejnovější verzi, kterou vám dovolí Composer! Mohou mít totiž jiné
verzování. Zkuste uvést "*" a podívejte se, jakou verzi Composer nainstaluje.
Deprecated
Před testováním nebo nasazováním doporučujeme nejprve vypnout hlášení chyb E_USER_DEPRECATED a povolit
jej, až když vše bude fungovat:
$configurator->enableDebugger();
error_reporting(~E_USER_DEPRECATED); // note ~ before E_USER_DEPRECATED
Nette\SmartObject
Třídy frameworku teď místo dědění od Nette\Object používají novou traitu Nette\SmartObject,
která se liší v několika věcech:
- podporuje „emulované properties“ jen pokud je na třídě zapsaná anotace
@property typ $nazev - nepodporuje „extension methods“
- nepodporuje „getReflection“
- nepodporuje získávání metod jako
$this->formSubmitted(je třeba nahradit za klasický PHP callback[$this, 'formSubmitted']
Použití těchto vlastností generuje E_USER_DEPRECATED a v příští verzi bude odstraněno.
Latte
Latte generuje upozornění, pokud:
- konstrukcí
{foreach $langs as $lang}přepíšete parameter šablony$lang - použijete již zastaralou vykřičníkovou konvenci
{!$name}namísto{$name|noescape} - použijete v šabloně
<?php ?>nebo{? ...}namísto{php ...} - použijete u bloku či include filtr, který je pro jiný content type (vysvětlení)
- použijete
|nosafeurlmísto novějšího|nocheck - použijete makro
{includeblock}, které nahrazuje podobné makro{import}(importuje jen bloky a ne obsah okolo) - dojde k chybě „Incompatible context“ při používání bloků v jiném kontextu (například uvnitř HTML atributu bez uvozovek), než v jakém byl definován (například v běžném HTML textu)
- přistupujete k proměnné $template kvůli volání filtrů, což nahraďte za
($var|trim) - přistupujete k proměnné $template kvůli proměnné, což nahraďte za
$this->getParameter('xyz') - přistupujete k interní podtržítkové proměnné jako
$_control,$_formatd.
Bootstrap a DI
- sekce (production, development) v jednom konfiguračním souboru, použijte dvojici konfiguračních souborů config.neon a config.local.neon
- dědičnost služeb
- Statement::setEntity()
Další
- Negativní validační pravidla. Alternativou
~Form::FILLEDjeForm::BLANK, nebo~Form::EQUALmůžete nahradit zaForm::NOT_EQUAL. Nette\Utils\Html::add()se mění naaddHtml()resp.addText().- V PhpGenerator metody
setDocuments(), getDocuments() a addDocument()nahradily obdobnésetComment(), getComment() a addComment(). - Flag
Route::SECUREDaRoute::$defaultFlagsjsou deprecated.
Změny
Application
Route i SimpleRouter nyní generují v URL stejné HTTP/HTTPS schéma, s jakým se přistupuje ke stránce. Routy, které
vyžadují určitý protokol, se dají napsat se schématem např. Route('http://domain.cz/<presenter>').
U parametrů typu bool použitých v render/action metodách (tj. s výchozí hodnotou true nebo false) a persistentních parametrech se nyní rozlišuje mezi false a null, tj. pokud parametr v URL není uveden, jeho hodnota je nyní null, dříve byla false. Viz nette/application#107.
Třída, kterou vrací Presenter::getReflection(), již není potomkem Nette\Reflection\ClassType a
taktéž getReflection()->getMethod() není potomkem Nette\Reflection\Method. Metody
hasAnnotation a getAnnotation neparsují text uvedený za názvem anotace, jako např. abc
v @param abc, parsuje totiž jen text uvedený v závorkách @param(abc).
Formuláře
Pokud má prvek nastaveno nějaké pravidlo addRule() (tedy je efektivně povinný), musíte jej také označit
jako povinný pomocí setRequired(). Dále setRequired(false) nyní udělá prvek volitelný, tj. pokud
není vyplněn, neaplikují se validační pravidla. Lze tím nahradit větve addCondition($form::FILLED).
Už se nepoužívá interní proměnná $_form, kterou někdy bylo potřeba ručně předávat do inkludovaných
šablon, což už není potřeba, nebo kvůli snippetům uvnitř formulářů, což nyní povede k chybě (např.
end() expects parameter 1 to be array, null given). Pokud si kvůli snippetům předáváte do šablony
$template->_form = $form, můžete to nahradit za
$template->getLatte()->addProvider('formsStack', [$form]), nicméně jde stále jen o obezličku, korektní je
použít {snippetArea xyz} a ten invalidovat společně se snippetem.
Validátory Form::EMAIL, URL, INTEGER automaticky mění HTML atribut type na
email, url resp. number.
Interní parametr do se nyní u formulářů posílaných přes POST jmenuje _do, aby nedocházelo
ke kolizi, a zároveň by nemělo docházet k mixováním formulářových prvků s persistentními parametry.
Třída BaseControl už přímo definuje getControlPart() a getLabelPart() a standardně vracejí totéž, co getControl() a
getLabel(). Makra <tag n:name> už rovnou používají tyto -part metody.
DefaultFormRenderer nyní správně vkládá do skupiny i vnořené komponenty (dříve se vnořené komponenty vykreslily až na konci formuláře), viz nette/forms#96.
Pokud používáte vlastní TemplateFactory, aplikujte do ní změny vytvořené v originální továrně.
Nezapomeňte zaktualizovat netteForms.js.
Latte
Filtry, které mají být aplikovány na blok textu ({block} nebo {_}...{/_}) či
{include}, musejí jako první parametr přijímat objekt Latte\Runtime\FilterInfo, viz příklad.
Makro {contentType} je povolené pouze v hlavičce šablony a v elementu <script> kvůli
nette/latte#71.
Caching
Odstraněna třída Nette\Caching\Storages\FileJournal.