Nette Documentation Preview

syntax
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.*:

```json
"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:

```php
$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í":https://forum.nette.org/cs/26250-pojdte-otestovat-nette-2-4-rc#p174339)
- použijete `|nosafeurl` mí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`, `$_form` atd.


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::FILLED` je `Form::BLANK`, nebo `~Form::EQUAL` můžete nahradit za `Form::NOT_EQUAL`.
- `Nette\Utils\Html::add()` se mění na `addHtml()` resp. `addText()`.
- V PhpGenerator metody `setDocuments(), getDocuments() a addDocument()` nahradily obdobné `setComment(), getComment() a addComment()`.
- Flag `Route::SECURED` a `Route::$defaultFlags` jsou 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":[https://github.com/nette/application/compare/0cdccef046b1cc3465e9a78d8645ea5ed037822b...3aa6f65000c001ab0f8fdeb3695bc62f9931ae8a#files_bucket] 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":https://github.com/nette/latte/blob/1423bd8974ce3132dee82aa0967f8afca49aca04/src/Latte/Runtime/Filters.php#L187-L199.

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

{{priority: -5}}

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 |nosafeurl mí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, $_form atd.

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::FILLED je Form::BLANK, nebo ~Form::EQUAL můžete nahradit za Form::NOT_EQUAL.
  • Nette\Utils\Html::add() se mění na addHtml() resp. addText().
  • V PhpGenerator metody setDocuments(), getDocuments() a addDocument() nahradily obdobné setComment(), getComment() a addComment().
  • Flag Route::SECURED a Route::$defaultFlags jsou 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.