diff --git a/application/bg/ajax.texy b/application/bg/ajax.texy
index 3b98231de7..04cc36448d 100644
--- a/application/bg/ajax.texy
+++ b/application/bg/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Първо трябва да [инициализирате |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] библиотеката:
+
+```js
+naja.initialize();
+```
+
За да превърнете обикновена връзка (сигнал) или подаване на форма в AJAX заявка, просто маркирайте съответната връзка, форма или бутон с класа `ajax`:
```html
diff --git a/application/bg/bootstrap.texy b/application/bg/bootstrap.texy
index c2cd01ec7e..2ac3dc2e99 100644
--- a/application/bg/bootstrap.texy
+++ b/application/bg/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Конфигураторът отговаря за настройката на средата на приложението и услугите.
+ $this->configurator = new Configurator;
+ // Задайте директорията за временни файлове, генерирани от Nette (напр. компилирани шаблони)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette е интелигентен и режимът за разработка се включва автоматично,
+ // или можете да го включите за определен IP адрес, като разкоментирате следния ред:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Активира Tracy: най-добрият инструмент за отстраняване на грешки "швейцарско ножче".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: автоматично зарежда всички класове в дадената директория
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Зареждане на конфигурационни файлове
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-В случая на уеб приложения началният файл е `index.php`, който се намира в публичната директория `www/`. Той позволява на класа `Bootstrap` да инициализира средата и връща `$configurator`, който създава контейнера DI. След това тя извлича услугата `Application`, която стартира уеб приложението:
+Началният файл за уеб приложенията е `index.php`, разположен в публичната директория `www/`. Той използва класа `Bootstrap` за инициализиране на средата и създаване на контейнер DI. След това получава услугата `Application` от контейнера, която стартира уеб приложението:
```php
-// инициализиране на средата + получаване на обект Configurator
-$configurator = App\Bootstrap::boot();
-// създаване на DI-контейнер
-$container = $configurator->createContainer();
-// DI-контейнерът ще създаде обект Nette\Application\Application
+$bootstrap = new App\Bootstrap;
+// Иницииране на средата + създаване на контейнер DI
+$container = $bootstrap->bootWebApplication();
+// Контейнерът DI създава обект Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-//стартиране на приложението Nette
+// Стартирайте приложението Nette и обработете входящата заявка
$application->run();
```
@@ -66,19 +91,19 @@ Nette прави разграничение между два основни р
Ако искате да активирате режима за разработка в други случаи, например за програмисти, които имат достъп от определен IP адрес, можете да използвате `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // един или повече IP адреси
+$this->configurator->setDebugMode('23.75.345.200'); // един или повече IP адреси
```
Определено препоръчваме да комбинирате IP адреса с "бисквитка". Ще съхраним тайния токен в "бисквитката" `nette-debug', например, `secret1234`, а режимът за разработка ще бъде активиран за програмистите с тази комбинация от IP и "бисквитка".
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Можете да деактивирате напълно режима за разработчици, дори за localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Обърнете внимание, че стойността `true` активира плътно режима за разработчици, което никога не трябва да се случва на производствен сървър.
@@ -90,7 +115,7 @@ $configurator->setDebugMode(false);
За да улесним дебъгването, ще включим чудесния инструмент [Tracy |tracy:]. В режим за разработчици той визуализира грешките, а в производствен режим записва грешките в определена директория:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ $configurator->enableTracy($rootDir . '/log');
Nette използва кеш за DI-контейнер, RobotLoader, шаблони и др. Затова е необходимо да се зададе пътят до директорията, в която се съхранява кешът:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
В Linux или macOS задайте [разрешения за запис |nette:troubleshooting#Setting-Directory-Permissions] за директориите `log/` и `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Обикновено искаме да заредим класовете автоматично с помощта на [RobotLoader |robot-loader:], така че трябва да го стартираме и да му позволим да зареди класовете от директорията, в която се намира `Bootstrap.php` (т.е. `__DIR__`) и всички негови поддиректории:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ $configurator->createRobotLoader()
Конфигураторът ви позволява да зададете часовата зона за вашето приложение.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ $configurator->setTimeZone('Europe/Prague');
Файловете за конфигурация се зареждат с помощта на `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Методът `addConfig()` може да се извика няколко пъти, за да се добавят няколко файла.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ if (PHP_SAPI === 'cli') {
Параметрите, използвани в конфигурационните файлове, могат да бъдат дефинирани [в раздела `parameters` |dependency-injection:configuration#parameters] и да бъдат взети (или презаписани) от метода `addStaticParameters()` (той има псевдоним `addParameters()`). Важно е, че различните стойности на параметрите водят до генериране на допълнителни DI-контейнери, т.е. допълнителни класове.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ $configurator->addStaticParameters([
Възможно е също така да се добавят динамични параметри към контейнер. Различните им стойности, за разлика от статичните параметри, не генерират нови контейнери DI.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Достъпът до променливите на средата е лесен с помощта на динамични параметри. Достъпът до тях се осъществява чрез `%env.variable%` в конфигурационните файлове.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Създайте нов екземпляр и го вмъкнете в Bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Различни среди .[#toc-different-environments]
=============================================
-Не се колебайте да персонализирате класа `Bootstrap` според нуждите си. Можете да добавите параметри към метода `boot()`, за да разделите уеб проектите, или да добавите други методи, като например `bootForTests()`, който инициализира средата за тестове на единици, `bootForCli()` за скриптове, извикани от командния ред, и т.н.
+Не се колебайте да персонализирате класа `Bootstrap` според нуждите си. Можете да добавите параметри към метода `bootWebApplication()`, за да разграничите отделните уеб проекти. Като алтернатива можете да добавите и други методи, например `bootTestEnvironment()` за инициализиране на средата за unit тестове, `bootConsoleApplication()` за скриптове, извикани от командния ред, и т.н.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Инициализация на Nette Tester
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // Инициализация Nette Tester
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/bg/components.texy b/application/bg/components.texy
index e5ccab94e7..ab5c216e1c 100644
--- a/application/bg/components.texy
+++ b/application/bg/components.texy
@@ -230,6 +230,28 @@ $this->redirect(/* ... */); // пренасочване
```
+Пренасочване след сигнал .[#toc-redirection-after-a-signal]
+===========================================================
+
+След обработката на сигнал от компонент често следва пренасочване. Тази ситуация е подобна на формулярите - след изпращане на формуляр също пренасочваме, за да предотвратим повторното изпращане на данни, когато страницата се опреснява в браузъра.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Тъй като компонентът е елемент за многократна употреба и обикновено не трябва да има пряка зависимост от конкретни презентатори, методите `redirect()` и `link()` автоматично интерпретират параметъра като сигнал за компонент:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Ако трябва да пренасочите към друг презентатор или действие, можете да го направите чрез презентатора:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Постоянни параметри .[#toc-persistent-parameters]
=================================================
diff --git a/application/bg/presenters.texy b/application/bg/presenters.texy
index e596b0f55a..bf2aeb04fc 100644
--- a/application/bg/presenters.texy
+++ b/application/bg/presenters.texy
@@ -60,7 +60,7 @@ class ArticlePresenter extends Nette\Application\UI\Presenter
Важното е, че `action()` се извиква преди `render()`, така че в него можем евентуално да променим следващия жизнен цикъл, т.е. да променим шаблона за визуализиране и метода `render()`която ще бъде извикана с помощта на `setView('otherView')`.
-Параметрите от заявката се предават на метода. Възможно и препоръчително е да се посочат типове за параметрите, например `actionShow(int $id, string $slug = null)` - ако параметърът `id` липсва или ако не е цяло число, презентаторът ще върне [грешка 404 |#Error-404-etc] и ще прекрати операцията.
+Параметрите от заявката се предават на метода. Възможно и препоръчително е да се посочат типове за параметрите, например `actionShow(int $id, ?string $slug = null)` - ако параметърът `id` липсва или ако не е цяло число, презентаторът ще върне [грешка 404 |#Error-404-etc] и ще прекрати операцията.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ $this->redirect(/* ... */);
Грешка 404 и т.н. .[#toc-error-404-etc]
=======================================
-Когато не можем да изпълним дадена заявка, защото например статията, която искаме да покажем, не съществува в базата данни, ще хвърлим грешка 404, като използваме метода `error(string $message = null, int $httpCode = 404)`, който представлява HTTP грешка 404:
+Когато не можем да изпълним дадена заявка, защото например статията, която искаме да покажем, не съществува в базата данни, ще хвърлим грешка 404, като използваме метода `error(?string $message = null, int $httpCode = 404)`, който представлява HTTP грешка 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ class ProductPresenter extends Nette\Application\UI\Presenter
Можете също така да извикате канонизацията ръчно с метода `canonicalize()`, който, както и методът `link()`, приема като аргументи водещия, действията и параметрите. Тя създава връзка и я сравнява с текущия URL адрес. Ако те са различни, се пренасочва към генерираната връзка.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// пренасочва, ако $slug е различен от $realSlug
diff --git a/application/cs/ajax.texy b/application/cs/ajax.texy
index 407622ab95..327977ea19 100644
--- a/application/cs/ajax.texy
+++ b/application/cs/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Nejprve je potřeba knihovnu [inicializovat |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization]:
+
+```js
+naja.initialize();
+```
+
Aby se z obyčejného odkazu (signálu) nebo odeslání formuláře vytvořil AJAXový požadavek, stačí označit příslušný odkaz, formulář nebo tlačítko třídou `ajax`:
```html
diff --git a/application/cs/bootstrap.texy b/application/cs/bootstrap.texy
index 7ed9569e3c..6357fe0d4d 100644
--- a/application/cs/bootstrap.texy
+++ b/application/cs/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Konfigurátor je zodpovědný za nastavení prostředí aplikace a služeb.
+ $this->configurator = new Configurator;
+ // Nastaví adresář pro dočasné soubory generované Nette (např. zkompilované šablony)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette je chytré a vývojový režim se zapíná automaticky,
+ // nebo jej můžete povolit pro konkrétní IP adresu odkomentováním následujícího řádku:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Aktivuje Tracy: ultimátní "švýcarský nůž" pro ladění.
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: automaticky načítá všechny třídy ve zvoleném adresáři
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Načte konfigurační soubory
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php
=========
-Prvotní soubor je v případě webových aplikací `index.php`, který se nachází ve veřejném adresáři `www/`. Ten si nechá od třídy Bootstrap inicializovat prostředí a vrátit `$configurator` a následně vyrobí DI kontejner. Poté z něj získá službu `Application`, kterou spustí webovou aplikaci:
+Prvotní soubor je v případě webových aplikací `index.php`, který se nachází ve veřejném adresáři `www/`. Ten si nechá od třídy Bootstrap inicializovat prostředí a vyrobit DI kontejner. Poté z něj získá službu `Application`, která spustí webovou aplikaci:
```php
-// inicializace prostředí + získání objektu Configurator
-$configurator = App\Bootstrap::boot();
-// vytvoření DI kontejneru
-$container = $configurator->createContainer();
+$bootstrap = new App\Bootstrap;
+// Inicializace prostředí + vytvoření DI kontejneru
+$container = $bootstrap->bootWebApplication();
// DI kontejner vytvoří objekt Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// spuštění Nette aplikace
+// Spuštění aplikace Nette a zpracování příchozího požadavku
$application->run();
```
@@ -66,19 +91,19 @@ Volba režimu se provádí autodetekcí, takže obvykle není potřeba nic konfi
Pokud chceme vývojářský režim povolit i v dalších případech, například programátorům přistupujícím z konkrétní IP adresy, použijeme `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // lze uvést i pole IP adres
+$this->configurator->setDebugMode('23.75.345.200'); // lze uvést i pole IP adres
```
Rozhodně doporučujeme kombinovat IP adresu s cookie. Do cookie `nette-debug` uložíme tajný token, např. `secret1234`, a tímto způsobem aktivujeme vývojářský režim pro programátory přistupující z konkrétní IP adresy a zároveň mající v cookie zmíněný token:
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Vývojářský režim můžeme také vypnout úplně, i pro localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Pozor, hodnota `true` zapne vývojářský režim natvrdo, což se nikdy nesmí stát na produkčním serveru.
@@ -90,7 +115,7 @@ Debugovací nástroj Tracy
Pro snadné debugování ještě zapneme skvělý nástroj [Tracy |tracy:]. Ve vývojářském režimu chyby vizualizuje a v produkčním režimu chyby loguje do uvedeného adresáře:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Dočasné soubory
Nette využívá cache pro DI kontejner, RobotLoader, šablony atd. Proto je nutné nastavit cestu k adresáři, kam se bude cache ukládat:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
Na Linuxu nebo macOS nastavte adresářům `log/` a `temp/` [práva pro zápis |nette:troubleshooting#Nastavení práv adresářů].
@@ -112,7 +137,7 @@ RobotLoader
Zpravidla budeme chtít automaticky načítat třídy pomocí [RobotLoaderu |robot-loader:], musíme ho tedy nastartovat a necháme jej načítat třídy z adresáře, kde je umístěný `Bootstrap.php` (tj. `__DIR__`), a všech podadresářů:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Timezone
Přes konfigurátor můžete nastavit výchozí časovou zónu.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ Ve vývojářském režimu se kontejner automaticky aktualizuje při každé zm
Konfigurační soubory načteme pomocí `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Pokud chceme přidat více konfiguračních souborů, můžeme funkci `addConfig()` zavolat vícekrát.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Statické parametry
Parametry používané v konfiguračních souborech můžeme definovat [v sekci `parameters`|dependency-injection:configuration#parametry] a také je předávat (či přepisovat) metodou `addStaticParameters()` (má alias `addParameters()`). Důležité je, že různé hodnoty parametrů způsobí vygenerování dalších DI kontejnerů, tedy dalších tříd.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Dynamické parametry
Do kontejneru můžeme přidat i dynamické parametry, jejichž různé hodnoty na rozdíl od statických parameterů nezpůsobí generování nových DI kontejnerů.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Jednoduše tak můžeme přidat např. environmentální proměnné, na které se pak lze v konfiguraci odkázat zápisem `%env.variable%`.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
A v bootstrapu do kontejneru vložíme objekt:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Odlišné prostředí
=================
-Nebojte se upravit třídu Bootstrap podle svých potřeb. Metodě `boot()` můžete přidat parametry pro rozlišení webových projektů nebo doplnit další metody, například `bootForTests()`, která inicializuje prostředí pro jednotkové testy, `bootForCli()` pro skripty volané z příkazové řádky atd.
+Nebojte se upravit třídu Bootstrap podle svých potřeb. Metodě `bootWebApplication()` můžete přidat parametry pro rozlišení webových projektů. Nebo můžeme doplnit další metody, například `bootTestEnvironment()`, která inicializuje prostředí pro jednotkové testy, `bootConsoleApplication()` pro skripty volané z příkazové řádky atd.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
{
- $configurator = self::boot();
Tester\Environment::setup(); // inicializace Nette Testeru
- return $configurator;
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
+{
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/cs/components.texy b/application/cs/components.texy
index d60ee2b7fd..db86af248c 100644
--- a/application/cs/components.texy
+++ b/application/cs/components.texy
@@ -198,7 +198,7 @@ Odkaz, který zavolá signál, vytvoříme obvyklým způsobem, tedy v šabloně
click here
```
-Signál se vždy volá na aktuálním presenteru a view, tudíž není možné jej vyvolat na jiném presenteru nebo view.
+Signál se vždy volá na aktuálním presenteru a action, není možné jej vyvolat na jiném presenteru nebo jiné action.
Signál tedy způsobí znovunačtení stránky úplně stejně jako při původním požadavku, jen navíc zavolá obslužnou metodu signálu s příslušnými parametry. Pokud metoda neexistuje, vyhodí se výjimka [api:Nette\Application\UI\BadSignalException], která se uživateli zobrazí jako chybová stránka 403 Forbidden.
@@ -230,6 +230,28 @@ $this->redirect(/* ... */); // a přesměrujeme
```
+Přesměrování po signálu
+=======================
+
+Po zpracování signálu komponenty často následuje přesměrování. Je to podobná situace jako u formulářů - po jejich odeslání také přesměrováváme, aby při obnovení stránky v prohlížeči nedošlo k opětovnému odeslání dat.
+
+```php
+$this->redirect('this') // přesměruje na aktuální presenter a action
+```
+
+Protože komponenta je znovupoužitelný prvek a obvykle by neměla mít přímou vazbu na konkrétní presentery, metody `redirect()` a `link()` automaticky interpretují parametr jako signál komponenty:
+
+```php
+$this->redirect('click') // přesměruje na signál 'click' téže komponenty
+```
+
+Pokud potřebujete přesměrovat na jiný presenter či akci, můžete to udělat prostřednictvím presenteru:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // přesměruje na jiný presenter/action
+```
+
+
Persistentní parametry
======================
@@ -430,7 +452,7 @@ class PaginatingControl extends Control
}
```
-Opačný proces, tedy sesbírání hodnot z persistentních properites, má na starosti metoda `saveState()`.
+Opačný proces, tedy sesbírání hodnot z persistentních properties, má na starosti metoda `saveState()`.
Signály do hloubky
@@ -444,7 +466,7 @@ Signál může přijímat jakákoliv komponenta, presenter nebo objekt, který i
Mezi hlavní příjemce signálů budou patřit `Presentery` a vizuální komponenty dědící od `Control`. Signál má sloužit jako znamení pro objekt, že má něco udělat – anketa si má započítat hlas od uživatele, blok s novinkami se má rozbalit a zobrazit dvakrát tolik novinek, formulář byl odeslán a má zpracovat data a podobně.
-URL pro signál vytváříme pomocí metody [Component::link() |api:Nette\Application\UI\Component::link()]. Jako parametr `$destination` předáme řetězec `{signal}!` a jako `$args` pole argumentů, které chceme signálu předat. Signál se vždy volá na aktuální view s aktuálními parametry, parametry signálu se jen přidají. Navíc se přidává hned na začátku **parametr `?do`, který určuje signál**.
+URL pro signál vytváříme pomocí metody [Component::link() |api:Nette\Application\UI\Component::link()]. Jako parametr `$destination` předáme řetězec `{signal}!` a jako `$args` pole argumentů, které chceme signálu předat. Signál se vždy volá na aktuálním presenteru a action s aktuálními parametry, parametry signálu se jen přidají. Navíc se přidává hned na začátku **parametr `?do`, který určuje signál**.
Jeho formát je buď `{signal}`, nebo `{signalReceiver}-{signal}`. `{signalReceiver}` je název komponenty v presenteru. Proto nemůže být v názvu komponenty pomlčka – používá se k oddělení názvu komponenty a signálu, je ovšem možné takto zanořit několik komponent.
diff --git a/application/cs/presenters.texy b/application/cs/presenters.texy
index cb8a415b75..c6b207b0f1 100644
--- a/application/cs/presenters.texy
+++ b/application/cs/presenters.texy
@@ -60,7 +60,7 @@ Obdoba metody `render()`. Zatímco `render()` je určená k tomu, ab
Důležité je, že `action()` se volá dříve než `render()`, takže v ní můžeme případně změnit další běh dějin, tj. změnit šablonu, která se bude kreslit, a také metodu `render()`, která se bude volat. A to pomocí `setView('jineView')`.
-Metodě se předávají parametry z požadavku. Je možné a doporučené uvést parametrům typy, např. `actionShow(int $id, string $slug = null)` - pokud bude parametr `id` chybět nebo pokud nebude integer, presenter vrátí [chybu 404|#Chyba 404 a spol.] a ukončí činnost.
+Metodě se předávají parametry z požadavku. Je možné a doporučené uvést parametrům typy, např. `actionShow(int $id, ?string $slug = null)` - pokud bude parametr `id` chybět nebo pokud nebude integer, presenter vrátí [chybu 404|#Chyba 404 a spol.] a ukončí činnost.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ $this->redirect(/* ... */); // a přesměrujeme
Chyba 404 a spol.
=================
-Pokud nelze splnit požadavek, třeba z důvodu, že článek který chceme zobrazit neexistuje v databázi, vyhodíme chybu 404 metodou `error(string $message = null, int $httpCode = 404)`.
+Pokud nelze splnit požadavek, třeba z důvodu, že článek který chceme zobrazit neexistuje v databázi, vyhodíme chybu 404 metodou `error(?string $message = null, int $httpCode = 404)`.
```php
public function renderShow(int $id): void
@@ -225,7 +225,7 @@ Nastavení error-preseteru se provádí v [konfiguraci application|configuration
Odeslání JSON
=============
-Příklad action-metody, která odešle data ve formátu JSON a ukončí presenter:
+Metoda sendJson($data) převede $data do formátu JSON, ten odešle jako http odpověď a ukončí běh presenteru.
```php
public function actionData(): void
@@ -384,7 +384,7 @@ K přesměrování nedojde při AJAXovém nebo POST požadavku, protože by doš
Kanonizaci můžete vyvolat i manuálně pomocí metody `canonicalize()`, které se podobně jako metodě `link()` předá presenter, akce a parametry. Vyrobí odkaz a porovná ho s aktuální URL adresou. Pokud se liší, tak přesměruje na vygenerovaný odkaz.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// přesměruje, pokud $slug se liší od $realSlug
diff --git a/application/de/ajax.texy b/application/de/ajax.texy
index 9b97c2db0e..fe36f40a83 100644
--- a/application/de/ajax.texy
+++ b/application/de/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Zunächst müssen Sie die Bibliothek [initialisieren |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization]:
+
+```js
+naja.initialize();
+```
+
Um einen gewöhnlichen Link (Signal) oder eine Formularübermittlung zu einer AJAX-Anfrage zu machen, markieren Sie einfach den entsprechenden Link, das Formular oder die Schaltfläche mit der Klasse `ajax`:
```html
diff --git a/application/de/bootstrap.texy b/application/de/bootstrap.texy
index 6b1fa8f7e6..6c441bfcf9 100644
--- a/application/de/bootstrap.texy
+++ b/application/de/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Der Konfigurator ist für das Einrichten der Anwendungsumgebung und der Dienste zuständig.
+ $this->configurator = new Configurator;
+ // Legen Sie das Verzeichnis für temporäre Dateien fest, die von Nette erzeugt werden (z. B. kompilierte Vorlagen)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette ist intelligent, und der Entwicklungsmodus wird automatisch aktiviert,
+ // oder Sie können ihn für eine bestimmte IP-Adresse aktivieren, indem Sie die folgende Zeile auskommentieren:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Aktiviert Tracy: das ultimative "Schweizer Taschenmesser" zur Fehlersuche.
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: Lädt automatisch alle Klassen im angegebenen Verzeichnis
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Konfigurationsdateien laden
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-Im Falle von Webanwendungen ist die Ausgangsdatei `index.php`, die sich im öffentlichen Verzeichnis `www/` befindet. Sie überlässt es der Klasse `Bootstrap`, die Umgebung zu initialisieren und den `$configurator` zurückzugeben, der den DI-Container erstellt. Dann wird der Dienst `Application` aufgerufen, der die Webanwendung ausführt:
+Die Ausgangsdatei für Webanwendungen ist `index.php`, die sich im öffentlichen Verzeichnis `www/` befindet. Sie verwendet die Klasse `Bootstrap`, um die Umgebung zu initialisieren und einen DI-Container zu erstellen. Anschließend wird der Dienst `Application` aus dem Container abgerufen, der die Webanwendung startet:
```php
-// Initialisieren der Umgebung + Abrufen des Configurator-Objekts
-$configurator = App\Bootstrap::boot();
-// Erstellen eines DI-Containers
-$container = $configurator->createContainer();
-// DI-Container erstellt ein Nette\Application\Application-Objekt
+$bootstrap = new App\Bootstrap;
+// Initialisierung der Umgebung + Erstellung eines DI-Containers
+$container = $bootstrap->bootWebApplication();
+// DI-Container erstellt ein Nette\Anwendung\Anwendungsobjekt
$application = $container->getByType(Nette\Application\Application::class);
-// Nette-Anwendung starten
+// Starten Sie die Nette-Anwendung und bearbeiten Sie die eingehende Anfrage
$application->run();
```
@@ -66,19 +91,19 @@ Die Auswahl des Modus erfolgt durch automatische Erkennung, so dass in der Regel
Wenn Sie den Entwicklungsmodus in anderen Fällen aktivieren möchten, z. B. für Programmierer, die von einer bestimmten IP-Adresse aus zugreifen, können Sie `setDebugMode()` verwenden:
```php
-$configurator->setDebugMode('23.75.345.200'); // eine oder mehrere IP-Adressen
+$this->configurator->setDebugMode('23.75.345.200'); // eine oder mehrere IP-Adressen
```
Wir empfehlen auf jeden Fall, eine IP-Adresse mit einem Cookie zu kombinieren. Wir speichern ein geheimes Token im `nette-debug` Cookie, z.B. `secret1234`, und der Entwicklungsmodus wird für Programmierer mit dieser Kombination von IP und Cookie aktiviert.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Wir können den Entwicklermodus auch komplett abschalten, sogar für localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Beachten Sie, dass der Wert `true` den Entwicklermodus standardmäßig einschaltet, was auf einem Produktionsserver niemals passieren sollte.
@@ -90,7 +115,7 @@ Debugging-Werkzeug Tracy .[#toc-debugging-tool-tracy]
Zur einfachen Fehlersuche werden wir das großartige Tool [Tracy |tracy:] einschalten. Im Entwicklermodus zeigt es Fehler an und im Produktionsmodus protokolliert es Fehler in das angegebene Verzeichnis:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Temporäre Dateien .[#toc-temporary-files]
Nette verwendet den Cache für DI-Container, RobotLoader, Vorlagen usw. Daher ist es notwendig, den Pfad zu dem Verzeichnis festzulegen, in dem der Cache gespeichert werden soll:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
Unter Linux oder macOS setzen Sie die [Schreibrechte |nette:troubleshooting#Setting directory permissions] für die Verzeichnisse `log/` und `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Normalerweise wollen wir die Klassen automatisch mit [RobotLoader |robot-loader:] laden, also müssen wir ihn starten und ihn Klassen aus dem Verzeichnis laden lassen, in dem sich `Bootstrap.php` befindet (d.h. `__DIR__`) und aus allen seinen Unterverzeichnissen:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Zeitzone .[#toc-timezone]
Configurator ermöglicht es Ihnen, eine Zeitzone für Ihre Anwendung festzulegen.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ Im Entwicklungsmodus wird der Container jedes Mal automatisch aktualisiert, wenn
Konfigurationsdateien werden mit `addConfig()` geladen:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Die Methode `addConfig()` kann mehrfach aufgerufen werden, um mehrere Dateien hinzuzufügen.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Statische Parameter .[#toc-static-parameters]
Parameter, die in Konfigurationsdateien verwendet werden, können [im Abschnitt `parameters` |dependency-injection:configuration#parameters] definiert und auch von der Methode `addStaticParameters()` übergeben (oder überschrieben) werden (sie hat den Alias `addParameters()`). Wichtig ist, dass unterschiedliche Parameterwerte die Erzeugung zusätzlicher DI-Container, d.h. zusätzlicher Klassen, bewirken.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Dynamische Parameter .[#toc-dynamic-parameters]
Wir können dem Container auch dynamische Parameter hinzufügen, deren unterschiedliche Werte, im Gegensatz zu statischen Parametern, nicht die Erzeugung neuer DI-Container verursachen.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Umgebungsvariablen können mit dynamischen Parametern leicht verfügbar gemacht werden. Wir können über `%env.variable%` in Konfigurationsdateien auf sie zugreifen.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Erstellen Sie eine neue Instanz und fügen Sie sie in Bootstrap ein:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Verschiedene Umgebungen .[#toc-different-environments]
======================================================
-Es steht Ihnen frei, die Klasse `Bootstrap` an Ihre Bedürfnisse anzupassen. Sie können der Methode `boot()` Parameter hinzufügen, um Webprojekte zu unterscheiden, oder andere Methoden hinzufügen, wie `bootForTests()`, die die Umgebung für Unit-Tests initialisiert, `bootForCli()` für Skripte, die von der Befehlszeile aus aufgerufen werden, und so weiter.
+Zögern Sie nicht, die Klasse `Bootstrap` nach Ihren Bedürfnissen anzupassen. Sie können der Methode `bootWebApplication()` Parameter hinzufügen, um zwischen Webprojekten zu unterscheiden. Alternativ können Sie auch andere Methoden hinzufügen, z. B. `bootTestEnvironment()`, um die Umgebung für Unit-Tests zu initialisieren, `bootConsoleApplication()` für Skripte, die von der Befehlszeile aus aufgerufen werden, und so weiter.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Initialisierung des Nette-Testers
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // Nette Tester Initialisierung
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/de/components.texy b/application/de/components.texy
index a335f73618..d47cc5bd78 100644
--- a/application/de/components.texy
+++ b/application/de/components.texy
@@ -230,6 +230,28 @@ In der Vorlage stehen diese Meldungen in der Variablen `$flashes` als Objekte `s
```
+Umleitung nach einem Signal .[#toc-redirection-after-a-signal]
+==============================================================
+
+Nach der Verarbeitung eines Komponentensignals folgt oft eine Umleitung. Diese Situation ist ähnlich wie bei Formularen - nach dem Absenden eines Formulars leiten wir ebenfalls um, um eine erneute Übermittlung von Daten zu verhindern, wenn die Seite im Browser aktualisiert wird.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Da eine Komponente ein wiederverwendbares Element ist und in der Regel keine direkte Abhängigkeit von bestimmten Presentern haben sollte, interpretieren die Methoden `redirect()` und `link()` den Parameter automatisch als Komponentensignal:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Wenn Sie zu einem anderen Präsentator oder einer Aktion umleiten müssen, können Sie dies über den Präsentator tun:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Dauerhafte Parameter .[#toc-persistent-parameters]
==================================================
diff --git a/application/de/presenters.texy b/application/de/presenters.texy
index 026ebee737..8622224006 100644
--- a/application/de/presenters.texy
+++ b/application/de/presenters.texy
@@ -60,7 +60,7 @@ Unmittelbar nach Erhalt der Anfrage wird die Methode `startup ()` aufgerufen. Si
Es ist wichtig, dass `action()` vor aufgerufen wird `render()`aufgerufen wird, damit wir darin möglicherweise den weiteren Verlauf des Lebenszyklus ändern können, d. h. die Vorlage, die gerendert wird, und auch die Methode `render()` die aufgerufen wird, mit `setView('otherView')`.
-Die Parameter der Anfrage werden an die Methode übergeben. Es ist möglich und empfehlenswert, Typen für die Parameter anzugeben, z. B. `actionShow(int $id, string $slug = null)` - wenn der Parameter `id` fehlt oder keine ganze Zahl ist, gibt der Präsentator den [Fehler 404 |#Error 404 etc.] zurück und bricht die Operation ab.
+Die Parameter der Anfrage werden an die Methode übergeben. Es ist möglich und empfehlenswert, Typen für die Parameter anzugeben, z. B. `actionShow(int $id, ?string $slug = null)` - wenn der Parameter `id` fehlt oder keine ganze Zahl ist, gibt der Präsentator den [Fehler 404 |#Error 404 etc.] zurück und bricht die Operation ab.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ In der Vorlage sind diese Meldungen in der Variablen `$flashes` als Objekte `std
Fehler 404 usw. .[#toc-error-404-etc]
=====================================
-Wenn wir die Anfrage nicht erfüllen können, weil z.B. der Artikel, den wir anzeigen wollen, nicht in der Datenbank existiert, werden wir den Fehler 404 mit der Methode `error(string $message = null, int $httpCode = 404)` ausgeben, die den HTTP-Fehler 404 darstellt:
+Wenn wir die Anfrage nicht erfüllen können, weil z.B. der Artikel, den wir anzeigen wollen, nicht in der Datenbank existiert, werden wir den Fehler 404 mit der Methode `error(?string $message = null, int $httpCode = 404)` ausgeben, die den HTTP-Fehler 404 darstellt:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ Eine Umleitung findet bei einer AJAX- oder POST-Anfrage nicht statt, da dies zu
Sie können die Kanonisierung auch manuell mit der Methode `canonicalize()` aufrufen, die wie die Methode `link()` den Präsentator, Aktionen und Parameter als Argumente erhält. Sie erstellt einen Link und vergleicht ihn mit der aktuellen URL. Wenn sie sich unterscheidet, wird sie auf den erzeugten Link umgeleitet.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// leitet um, wenn $slug nicht mit $realSlug übereinstimmt
diff --git a/application/el/ajax.texy b/application/el/ajax.texy
index de4975d290..ab0e2f48f5 100644
--- a/application/el/ajax.texy
+++ b/application/el/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Πρώτα πρέπει να [αρχικοποιήσετε |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] τη βιβλιοθήκη:
+
+```js
+naja.initialize();
+```
+
Για να μετατρέψετε έναν συνηθισμένο σύνδεσμο (σήμα) ή την υποβολή φόρμας σε αίτηση AJAX, απλά σημειώστε τον αντίστοιχο σύνδεσμο, φόρμα ή κουμπί με την κλάση `ajax`:
```html
diff --git a/application/el/bootstrap.texy b/application/el/bootstrap.texy
index 91cc3f41db..f71018bac5 100644
--- a/application/el/bootstrap.texy
+++ b/application/el/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Ο διαμορφωτής είναι υπεύθυνος για τη ρύθμιση του περιβάλλοντος και των υπηρεσιών της εφαρμογής.
+ $this->configurator = new Configurator;
+ // Ορίστε τον κατάλογο για τα προσωρινά αρχεία που παράγονται από τη Nette (π.χ. μεταγλωττισμένα πρότυπα)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Η Nette είναι έξυπνη και η λειτουργία ανάπτυξης ενεργοποιείται αυτόματα,
+ // ή μπορείτε να την ενεργοποιήσετε για μια συγκεκριμένη διεύθυνση IP ξεσχολιάζοντας την ακόλουθη γραμμή:
+ // $this->configurator->setDebugMode('secret@23.75.345.200'),
+
+ // Ενεργοποιεί το Tracy: το απόλυτο εργαλείο αποσφαλμάτωσης "ελβετικό μαχαίρι του στρατού".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: αυτόματη φόρτωση όλων των κλάσεων στον δεδομένο κατάλογο
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Φόρτωση αρχείων διαμόρφωσης
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-Στην περίπτωση των διαδικτυακών εφαρμογών, το αρχικό αρχείο είναι το `index.php`, το οποίο βρίσκεται στον δημόσιο κατάλογο `www/`. Επιτρέπει στην κλάση `Bootstrap` να αρχικοποιήσει το περιβάλλον και να επιστρέψει το `$configurator` που δημιουργεί το DI container. Στη συνέχεια αποκτά την υπηρεσία `Application`, η οποία εκτελεί την εφαρμογή ιστού:
+Το αρχικό αρχείο για τις διαδικτυακές εφαρμογές είναι το `index.php`, το οποίο βρίσκεται στον δημόσιο κατάλογο `www/`. Χρησιμοποιεί την κλάση `Bootstrap` για την αρχικοποίηση του περιβάλλοντος και τη δημιουργία ενός δοχείου DI. Στη συνέχεια, λαμβάνει την υπηρεσία `Application` από το δοχείο, η οποία εκκινεί την εφαρμογή ιστού:
```php
-// αρχικοποίηση του περιβάλλοντος + λήψη του αντικειμένου Configurator
-$configurator = App\Bootstrap::boot();
-// Δημιουργία ενός δοχείου DI
-$container = $configurator->createContainer();
+$bootstrap = new App\Bootstrap;
+// Αρχικοποίηση του περιβάλλοντος + δημιουργία ενός δοχείου DI
+$container = $bootstrap->bootWebApplication();
// Το δοχείο DI δημιουργεί ένα αντικείμενο Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// έναρξη της εφαρμογής Nette
+// Εκκίνηση της εφαρμογής Nette και χειρισμός της εισερχόμενης αίτησης
$application->run();
```
@@ -66,19 +91,19 @@ $application->run();
Αν θέλετε να ενεργοποιήσετε τη λειτουργία ανάπτυξης σε άλλες περιπτώσεις, για παράδειγμα, για προγραμματιστές που έχουν πρόσβαση από μια συγκεκριμένη διεύθυνση IP, μπορείτε να χρησιμοποιήσετε τη διεύθυνση `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // μία ή περισσότερες διευθύνσεις IP
+$this->configurator->setDebugMode('23.75.345.200'); // μία ή περισσότερες διευθύνσεις IP
```
Συνιστούμε οπωσδήποτε τον συνδυασμό μιας διεύθυνσης IP με ένα cookie. Θα αποθηκεύσουμε ένα μυστικό token στο cookie `nette-debug`, π.χ. `secret1234`, και η λειτουργία ανάπτυξης θα ενεργοποιηθεί για τους προγραμματιστές με αυτόν τον συνδυασμό IP και cookie.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Μπορούμε επίσης να απενεργοποιήσουμε εντελώς τη λειτουργία προγραμματιστή, ακόμη και για το localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Σημειώστε ότι η τιμή `true` ενεργοποιεί τη λειτουργία προγραμματιστή με σκληρό τρόπο, κάτι που δεν πρέπει ποτέ να συμβαίνει σε έναν διακομιστή παραγωγής.
@@ -90,7 +115,7 @@ $configurator->setDebugMode(false);
Για εύκολη αποσφαλμάτωση, θα ενεργοποιήσουμε το σπουδαίο εργαλείο [Tracy |tracy:]. Στη λειτουργία προγραμματιστή απεικονίζει τα σφάλματα και στη λειτουργία παραγωγής καταγράφει τα σφάλματα στον καθορισμένο κατάλογο:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ $configurator->enableTracy($rootDir . '/log');
Η Nette χρησιμοποιεί την κρυφή μνήμη για το DI container, το RobotLoader, τα πρότυπα κ.λπ. Ως εκ τούτου, είναι απαραίτητο να ορίσετε τη διαδρομή προς τον κατάλογο όπου θα αποθηκεύεται η προσωρινή μνήμη:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
Σε Linux ή macOS, ορίστε τα [δικαιώματα εγγραφής |nette:troubleshooting#Setting directory permissions] για τους καταλόγους `log/` και `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Συνήθως, θα θέλουμε να φορτώνουμε αυτόματα τις κλάσεις χρησιμοποιώντας [τον RobotLoader |robot-loader:], οπότε πρέπει να τον εκκινήσουμε και να τον αφήσουμε να φορτώσει κλάσεις από τον κατάλογο όπου βρίσκεται το `Bootstrap.php` (δηλαδή το `__DIR__`) και όλους τους υποκαταλόγους του:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ $configurator->createRobotLoader()
Το Configurator σας επιτρέπει να καθορίσετε μια ζώνη ώρας για την εφαρμογή σας.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ $configurator->setTimeZone('Europe/Prague');
Τα αρχεία διαμόρφωσης φορτώνονται με τη χρήση του `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Η μέθοδος `addConfig()` μπορεί να κληθεί πολλές φορές για την προσθήκη πολλών αρχείων.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ if (PHP_SAPI === 'cli') {
Οι παράμετροι που χρησιμοποιούνται σε αρχεία ρυθμίσεων μπορούν να οριστούν [στην ενότητα `parameters` |dependency-injection:configuration#parameters] και επίσης να μεταβιβαστούν (ή να αντικατασταθούν) από τη μέθοδο `addStaticParameters()` (έχει το ψευδώνυμο `addParameters()`). Είναι σημαντικό ότι διαφορετικές τιμές παραμέτρων προκαλούν τη δημιουργία πρόσθετων δοχείων DI, δηλαδή πρόσθετων κλάσεων.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ $configurator->addStaticParameters([
Μπορούμε επίσης να προσθέσουμε δυναμικές παραμέτρους στο δοχείο, οι διαφορετικές τιμές τους, σε αντίθεση με τις στατικές παραμέτρους, δεν θα προκαλέσουν τη δημιουργία νέων δοχείων DI.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Οι μεταβλητές περιβάλλοντος θα μπορούσαν εύκολα να γίνουν διαθέσιμες με τη χρήση δυναμικών παραμέτρων. Μπορούμε να έχουμε πρόσβαση σε αυτές μέσω της διεύθυνσης `%env.variable%` στα αρχεία ρυθμίσεων.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Δημιουργούμε μια νέα περίπτωση και την εισάγουμε στο bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Διαφορετικά περιβάλλοντα .[#toc-different-environments]
=======================================================
-Μπορείτε να προσαρμόσετε την τάξη `Bootstrap` ανάλογα με τις ανάγκες σας. Μπορείτε να προσθέσετε παραμέτρους στη μέθοδο `boot()` για να διαφοροποιήσετε τα έργα ιστού ή να προσθέσετε άλλες μεθόδους, όπως η `bootForTests()`, η οποία αρχικοποιεί το περιβάλλον για δοκιμές μονάδας, η `bootForCli()` για σενάρια που καλούνται από τη γραμμή εντολών κ.ο.κ.
+Μη διστάσετε να προσαρμόσετε την τάξη `Bootstrap` σύμφωνα με τις ανάγκες σας. Μπορείτε να προσθέσετε παραμέτρους στη μέθοδο `bootWebApplication()` για να διαφοροποιήσετε τα διάφορα web projects. Εναλλακτικά, μπορείτε να προσθέσετε άλλες μεθόδους, όπως `bootTestEnvironment()` για την αρχικοποίηση του περιβάλλοντος για δοκιμές μονάδας, `bootConsoleApplication()` για σενάρια που καλούνται από τη γραμμή εντολών κ.ο.κ.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
{
- $configurator = self::boot();
Tester\Environment::setup(); // Αρχικοποίηση Nette Tester
- return $configurator;
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
+{
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/el/components.texy b/application/el/components.texy
index ed46dc4e74..06fafcf4d4 100644
--- a/application/el/components.texy
+++ b/application/el/components.texy
@@ -230,6 +230,28 @@ $this->redirect(/* ... */); // και ανακατεύθυνση
```
+Επανακατεύθυνση μετά από ένα σήμα .[#toc-redirection-after-a-signal]
+====================================================================
+
+Μετά την επεξεργασία ενός σήματος συνιστωσών, ακολουθεί συχνά ανακατεύθυνση. Αυτή η κατάσταση είναι παρόμοια με τις φόρμες - μετά την υποβολή μιας φόρμας, κάνουμε επίσης ανακατεύθυνση για να αποτρέψουμε την εκ νέου υποβολή δεδομένων όταν η σελίδα ανανεώνεται στο πρόγραμμα περιήγησης.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Δεδομένου ότι ένα συστατικό είναι ένα επαναχρησιμοποιήσιμο στοιχείο και συνήθως δεν πρέπει να έχει άμεση εξάρτηση από συγκεκριμένους παρουσιαστές, οι μέθοδοι `redirect()` και `link()` ερμηνεύουν αυτόματα την παράμετρο ως σήμα συστατικού:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Εάν χρειάζεται να ανακατευθύνετε σε διαφορετικό παρουσιαστή ή ενέργεια, μπορείτε να το κάνετε μέσω του παρουσιαστή:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Μόνιμες παράμετροι .[#toc-persistent-parameters]
================================================
@@ -430,7 +452,7 @@ class PaginatingControl extends Control
}
```
-Η αντίθετη διαδικασία, δηλαδή η συλλογή τιμών από persistent properites, αντιμετωπίζεται από τη μέθοδο `saveState()`.
+Η αντίθετη διαδικασία, δηλαδή η συλλογή τιμών από persistent properties, αντιμετωπίζεται από τη μέθοδο `saveState()`.
Σήματα σε βάθος .[#toc-signals-in-depth]
diff --git a/application/el/presenters.texy b/application/el/presenters.texy
index b2db7f0af6..8b7a737672 100644
--- a/application/el/presenters.texy
+++ b/application/el/presenters.texy
@@ -60,7 +60,7 @@ class ArticlePresenter extends Nette\Application\UI\Presenter
Είναι σημαντικό ότι `action()` καλείται πριν από την `render()`, ώστε μέσα σε αυτό να μπορούμε ενδεχομένως να αλλάξουμε την επόμενη πορεία του κύκλου ζωής, δηλαδή να αλλάξουμε το πρότυπο που θα αποδοθεί και επίσης τη μέθοδο `render()` που θα κληθεί, χρησιμοποιώντας το `setView('otherView')`.
-Οι παράμετροι από το αίτημα περνούν στη μέθοδο. Είναι δυνατόν και συνιστάται να καθορίσετε τύπους για τις παραμέτρους, π.χ. `actionShow(int $id, string $slug = null)` - αν η παράμετρος `id` λείπει ή αν δεν είναι ακέραιος αριθμός, ο παρουσιαστής επιστρέφει [σφάλμα 404 |#Error 404 etc.] και τερματίζει τη λειτουργία.
+Οι παράμετροι από το αίτημα περνούν στη μέθοδο. Είναι δυνατόν και συνιστάται να καθορίσετε τύπους για τις παραμέτρους, π.χ. `actionShow(int $id, ?string $slug = null)` - αν η παράμετρος `id` λείπει ή αν δεν είναι ακέραιος αριθμός, ο παρουσιαστής επιστρέφει [σφάλμα 404 |#Error 404 etc.] και τερματίζει τη λειτουργία.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ $this->redirect(/* ... */);
Σφάλμα 404 κ.λπ. .[#toc-error-404-etc]
======================================
-Όταν δεν μπορούμε να ικανοποιήσουμε το αίτημα επειδή για παράδειγμα το άρθρο που θέλουμε να εμφανίσουμε δεν υπάρχει στη βάση δεδομένων, θα πετάξουμε το σφάλμα 404 χρησιμοποιώντας τη μέθοδο `error(string $message = null, int $httpCode = 404)`, η οποία αντιπροσωπεύει το σφάλμα HTTP 404:
+Όταν δεν μπορούμε να ικανοποιήσουμε το αίτημα επειδή για παράδειγμα το άρθρο που θέλουμε να εμφανίσουμε δεν υπάρχει στη βάση δεδομένων, θα πετάξουμε το σφάλμα 404 χρησιμοποιώντας τη μέθοδο `error(?string $message = null, int $httpCode = 404)`, η οποία αντιπροσωπεύει το σφάλμα HTTP 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ class ProductPresenter extends Nette\Application\UI\Presenter
Μπορείτε επίσης να επικαλεστείτε την κανονικοποίηση χειροκίνητα χρησιμοποιώντας τη μέθοδο `canonicalize()`, η οποία, όπως και η μέθοδος `link()`, λαμβάνει τον παρουσιαστή, τις ενέργειες και τις παραμέτρους ως ορίσματα. Δημιουργεί έναν σύνδεσμο και τον συγκρίνει με την τρέχουσα διεύθυνση URL. Εάν είναι διαφορετική, ανακατευθύνει στον δημιουργημένο σύνδεσμο.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// ανακατευθύνει εάν το $slug είναι διαφορετικό από το $realSlug
diff --git a/application/en/ajax.texy b/application/en/ajax.texy
index a62ed95cfc..819a6e4627 100644
--- a/application/en/ajax.texy
+++ b/application/en/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+First you need to [initialize |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] the library:
+
+```js
+naja.initialize();
+```
+
To make an ordinary link (signal) or form submission an AJAX request, simply mark the respective link, form, or button with the `ajax` class:
```html
diff --git a/application/en/bootstrap.texy b/application/en/bootstrap.texy
index f0b54d49b9..a950df1e88 100644
--- a/application/en/bootstrap.texy
+++ b/application/en/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // The configurator is responsible for setting up the application environment and services.
+ $this->configurator = new Configurator;
+ // Set the directory for temporary files generated by Nette (e.g. compiled templates)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette is smart, and the development mode turns on automatically,
+ // or you can enable for a specific IP address it by uncommenting the following line:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Enables Tracy: the ultimate "swiss army knife" debugging tool.
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: autoloads all classes in the given directory
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Load configuration files
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php
=========
-In the case of web applications, the initial file is `index.php`, which is located in the public directory `www/`. It lets the `Bootstrap` class to initialize the environment and return the `$configurator` which creates DI container. Then it obtains the `Application` service, that runs the web application:
+The initial file for web applications is `index.php`, located in the public directory `www/`. It uses the `Bootstrap` class to initialize the environment and create a DI container. Then, it obtains the `Application` service from the container, which launches the web application:
```php
-// initialize the environment + get Configurator object
-$configurator = App\Bootstrap::boot();
-// create a DI container
-$container = $configurator->createContainer();
+$bootstrap = new App\Bootstrap;
+// Initialize the environment + create a DI container
+$container = $bootstrap->bootWebApplication();
// DI container creates a Nette\Application\Application object
$application = $container->getByType(Nette\Application\Application::class);
-// start Nette application
+// Start the Nette application and handle the incoming request
$application->run();
```
@@ -66,19 +91,19 @@ Mode selection is done by autodetection, so there is usually no need to configur
If you want to enable development mode in other cases, for example, for programmers accessing from a specific IP address, you can use `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // one or more IP addresses
+$this->configurator->setDebugMode('23.75.345.200'); // one or more IP addresses
```
We definitely recommend combining an IP address with a cookie. We will store a secret token into the `nette-debug` cookie, e.g. `secret1234`, and the development mode will be activated for programmers with this combination of IP and cookie.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
We can also turn off developer mode completely, even for localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Note that the value `true` turns on developer mode by hard, which should never happen on a production server.
@@ -90,7 +115,7 @@ Debugging Tool Tracy
For easy debugging, we will turn on the great tool [Tracy |tracy:]. In developer mode it visualizes errors and in production mode it logs errors to the specified directory:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Temporary Files
Nette uses the cache for DI container, RobotLoader, templates, etc. Therefore it is necessary to set the path to the directory where the cache will be stored:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
On Linux or macOS, set the [write permissions |nette:troubleshooting#Setting directory permissions] for directories `log/` and `temp/`.
@@ -112,7 +137,7 @@ RobotLoader
Usually, we will want to automatically load the classes using [RobotLoader |robot-loader:], so we have to start it up and let it load classes from the directory where `Bootstrap.php` is located (i.e. `__DIR__`) and all its subdirectories:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Timezone
Configurator allows you to specify a timezone for your application.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ In the development mode, the container is automatically updated each time you ch
Configuration files are loaded using `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
The method `addConfig()` can be called multiple times to add multiple files.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Static Parameters
Parameters used in configuration files can be defined [in the section `parameters`|dependency-injection:configuration#parameters] and also passed (or overwritten) by the `addStaticParameters()` method (it has alias `addParameters()`). It is important that different parameter values cause the generation of additional DI containers, i.e. additional classes.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Dynamic Parameters
We can also add dynamic parameters to the container, their different values, unlike static parameters, will not cause the generation of new DI containers.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Environment variables could be easily made available using dynamic parameters. We can access them via `%env.variable%` in configuration files.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Create a new instance and insert it in bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Different Environments
======================
-Feel free to customize the `Bootstrap` class to suit your needs. You can add parameters to the `boot()` method to differentiate web projects, or add other methods, such as `bootForTests()`, which initializes the environment for unit tests, `bootForCli()` for scripts called from the command line, and so on.
+Don't hesitate to customize the `Bootstrap` class according to your needs. You can add parameters to the `bootWebApplication()` method to differentiate between web projects. Alternatively, you can add other methods, such as `bootTestEnvironment()` to initialize the environment for unit tests, `bootConsoleApplication()` for scripts called from the command line, and so on.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
{
- $configurator = self::boot();
Tester\Environment::setup(); // Nette Tester initialization
- return $configurator;
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
+{
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/en/components.texy b/application/en/components.texy
index 42b40aaacb..2c79308bef 100644
--- a/application/en/components.texy
+++ b/application/en/components.texy
@@ -198,7 +198,7 @@ The link that calls the signal is created in the usual way, i.e. in the template
click here
```
-The signal is always called on the current presenter and view, so it is not possible to link to signal in different presenter / action.
+The signal is always called on the current presenter and action, it cannot be called on another presenter or action.
Thus, the signal causes the page to be reloaded in exactly the same way as in the original request, only in addition it calls the signal handling method with the appropriate parameters. If the method does not exist, exception [api:Nette\Application\UI\BadSignalException] is thrown, which is displayed to the user as error page 403 Forbidden.
@@ -230,6 +230,28 @@ In the template, these messages are available in the variable `$flashes` as obje
```
+Redirection After a Signal
+==========================
+
+After processing a component signal, redirection often follows. This situation is similar to forms—after submitting a form, we also redirect to prevent resubmission of data when the page is refreshed in the browser.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Since a component is a reusable element and should not usually have a direct dependency on specific presenters, the `redirect()` and `link()` methods automatically interpret the parameter as a component signal:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+If you need to redirect to a different presenter or action, you can do so through the presenter:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Persistent Parameters
=====================
@@ -430,7 +452,7 @@ class PaginatingControl extends Control
}
```
-The opposite process, that is, collecting values from persistent properites, is handled by the `saveState()` method.
+The opposite process, that is, collecting values from persistent properties, is handled by the `saveState()` method.
Signals in Depth
@@ -444,7 +466,7 @@ Signal can be received by any component, presenter of object which implements in
The main receivers of signals are `Presenters` and visual components extending `Control`. A signal is a sign for an object that it has to do something - poll counts in a vote from user, box with news has to unfold, form was sent and has to process data and so on.
-The URL for the signal is created using the method [Component::link() |api:Nette\Application\UI\Component::link()]. As parameter `$destination` we pass string `{signal}!` and as `$args` an array of arguments which we want to pass to the signal handler. Signal parameters are attached to the URL of the current presenter/view. **The parameter `?do` in the URL determines the signal called.**
+The URL for the signal is created using the [Component::link() |api:Nette\Application\UI\Component::link()] method. We pass the string `{signal}!` as the `$destination` parameter and the array of arguments we want to pass to the signal as `$args`. The signal is always called on the current presenter and action with the current parameters, the signal parameters are just added. In addition, the **parameter `?do`, which specifies the signal** is added right at the beginning.
Its format is `{signal}` or `{signalReceiver}-{signal}`. `{signalReceiver}` is the name of the component in the presenter. This is why hyphen (inaccurately dash) can't be present in the name of components - it is used to divide the name of the component and signal, but it's possible to compose several components.
diff --git a/application/en/presenters.texy b/application/en/presenters.texy
index 65a0dcf131..2773f8486b 100644
--- a/application/en/presenters.texy
+++ b/application/en/presenters.texy
@@ -60,7 +60,7 @@ Similar to the method `render()`. While `render()` is intended to pr
It is important that `action()` is called before `render()`, so inside it we can possibly change the next course of life cycle, i.e. change the template that will be rendered and also the method `render()` that will be called, using `setView('otherView')`.
-The parameters from the request are passed to the method. It is possible and recommended to specify types for the parameters, e.g. `actionShow(int $id, string $slug = null)` - if parameter `id` is missing or if it is not an integer, the presenter returns [error 404|#Error 404 etc.] and terminates the operation.
+The parameters from the request are passed to the method. It is possible and recommended to specify types for the parameters, e.g. `actionShow(int $id, ?string $slug = null)` - if parameter `id` is missing or if it is not an integer, the presenter returns [error 404|#Error 404 etc.] and terminates the operation.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ In the template, these messages are available in the variable `$flashes` as obje
Error 404 etc.
==============
-When we can't fulfill the request because for example the article we want to display does not exist in the database, we will throw out the 404 error using method `error(string $message = null, int $httpCode = 404)`, which represents HTTP error 404:
+When we can't fulfill the request because for example the article we want to display does not exist in the database, we will throw out the 404 error using method `error(?string $message = null, int $httpCode = 404)`, which represents HTTP error 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ Redirection does not occur with an AJAX or POST request because it would result
You can also invoke canonization manually using method `canonicalize()`, which, like method `link()`, receives the presenter, actions, and parameters as arguments. It creates a link and compares it to the current URL. If it is different, it redirects to the generated link.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// redirects if $slug is different from $realSlug
diff --git a/application/es/ajax.texy b/application/es/ajax.texy
index a90acb698b..d1414e84c4 100644
--- a/application/es/ajax.texy
+++ b/application/es/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Primero hay que [inicializar |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] la biblioteca:
+
+```js
+naja.initialize();
+```
+
Para convertir un enlace ordinario (señal) o el envío de un formulario en una petición AJAX, basta con marcar el enlace, formulario o botón correspondiente con la clase `ajax`:
```html
diff --git a/application/es/bootstrap.texy b/application/es/bootstrap.texy
index d1753e0a9f..19bb56c0ba 100644
--- a/application/es/bootstrap.texy
+++ b/application/es/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // El configurador se encarga de configurar el entorno y los servicios de la aplicación.
+ $this->configurator = new Configurator;
+ // Establecer el directorio para los archivos temporales generados por Nette (por ejemplo, plantillas compiladas).
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette es inteligente, y el modo de desarrollo se activa automáticamente,
+ // o puede habilitarlo para una dirección IP específica descomentando la siguiente línea:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Habilita Tracy: la última herramienta de depuración "navaja suiza".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: carga automáticamente todas las clases en el directorio dado
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Carga archivos de configuración
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-En el caso de las aplicaciones web, el archivo inicial es `index.php`, que se encuentra en el directorio público `www/`. Permite a la clase `Bootstrap` inicializar el entorno y devolver el `$configurator` que crea el contenedor DI. Luego obtiene el servicio `Application`, que ejecuta la aplicación web:
+El archivo inicial para aplicaciones web es `index.php`, ubicado en el directorio público `www/`. Utiliza la clase `Bootstrap` para inicializar el entorno y crear un contenedor DI. A continuación, obtiene el servicio `Application` del contenedor, que lanza la aplicación web:
```php
-// initialize the environment + get Configurator object
-$configurator = App\Bootstrap::boot();
-// create a DI container
-$container = $configurator->createContainer();
-// DI container creates a Nette\Application\Application object
+$bootstrap = new App\Bootstrap;
+// Inicializar el entorno + crear un contenedor DI
+$container = $bootstrap->bootWebApplication();
+// El contenedor DI crea un objeto Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// start Nette application
+// Inicia la aplicación Nette y gestiona la petición entrante
$application->run();
```
@@ -66,19 +91,19 @@ La selección del modo se hace por autodetección, por lo que normalmente no hay
Si desea habilitar el modo de desarrollo en otros casos, por ejemplo, para los programadores que acceden desde una dirección IP específica, puede utilizar `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // one or more IP addresses
+$this->configurator->setDebugMode('23.75.345.200'); // one or more IP addresses
```
Recomendamos encarecidamente combinar una dirección IP con una cookie. Almacenaremos un token secreto en la cookie `nette-debug`, por ejemplo `secret1234`, y el modo de desarrollo se activará para los programadores con esta combinación de IP y cookie.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
También podemos desactivar completamente el modo de desarrollo, incluso para localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Nótese que el valor `true` activa el modo desarrollador por fuerza, lo que nunca debería ocurrir en un servidor de producción.
@@ -90,7 +115,7 @@ Herramienta de depuración Tracy .[#toc-debugging-tool-tracy]
Para facilitar la depuración, activaremos la gran herramienta [Tracy |tracy:]. En modo desarrollador visualiza los errores y en modo producción los registra en el directorio especificado:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Archivos temporales .[#toc-temporary-files]
Nette utiliza la caché para el contenedor DI, RobotLoader, plantillas, etc. Por lo tanto es necesario establecer la ruta al directorio donde se almacenará la caché:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
En Linux o macOS, establezca los [permisos de escritura |nette:troubleshooting#Setting directory permissions] para los directorios `log/` y `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Normalmente, querremos cargar automáticamente las clases usando [RobotLoader |robot-loader:], así que tenemos que iniciarlo y dejar que cargue las clases desde el directorio donde se encuentra `Bootstrap.php` (es decir, `__DIR__`) y todos sus subdirectorios:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Zona horaria .[#toc-timezone]
Configurator le permite especificar una zona horaria para su aplicación.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ En el modo de desarrollo, el contenedor se actualiza automáticamente cada vez q
Los archivos de configuración se cargan utilizando `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
El método `addConfig()` se puede llamar varias veces para añadir varios archivos.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Parámetros estáticos .[#toc-static-parameters]
Los parámetros utilizados en los archivos de configuración pueden definirse [en la sección `parameters` |dependency-injection:configuration#parameters] y también pasarse (o sobrescribirse) por el método `addStaticParameters()` (tiene el alias `addParameters()`). Es importante que los diferentes valores de los parámetros provoquen la generación de contenedores DI adicionales, es decir, clases adicionales.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Parámetros dinámicos .[#toc-dynamic-parameters]
También podemos añadir parámetros dinámicos al contenedor, sus diferentes valores, a diferencia de los parámetros estáticos, no provocarán la generación de nuevos contenedores DI.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Las variables de entorno podrían estar fácilmente disponibles utilizando parámetros dinámicos. Podemos acceder a ellas a través de `%env.variable%` en archivos de configuración.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Creamos una nueva instancia y la insertamos en bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Diferentes entornos .[#toc-different-environments]
==================================================
-Siéntete libre de personalizar la clase `Bootstrap` para adaptarla a tus necesidades. Puedes añadir parámetros al método `boot()` para diferenciar proyectos web, o añadir otros métodos, como `bootForTests()`, que inicializa el entorno para pruebas unitarias, `bootForCli()` para scripts llamados desde la línea de comandos, etc.
+No dude en personalizar la clase `Bootstrap` según sus necesidades. Puedes añadir parámetros al método `bootWebApplication()` para diferenciar entre proyectos web. Alternativamente, puedes añadir otros métodos, como `bootTestEnvironment()` para inicializar el entorno para pruebas unitarias, `bootConsoleApplication()` para scripts llamados desde la línea de comandos, etc.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Inicialización del comprobador de redes
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // Nette Tester initialization
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/es/components.texy b/application/es/components.texy
index 0482a246a3..5e58b7e920 100644
--- a/application/es/components.texy
+++ b/application/es/components.texy
@@ -230,6 +230,28 @@ En la plantilla, estos mensajes están disponibles en la variable `$flashes` com
```
+Redirección tras una señal .[#toc-redirection-after-a-signal]
+=============================================================
+
+Después de procesar una señal de componente, a menudo se produce una redirección. Esta situación es similar a la de los formularios: después de enviar un formulario, también redirigimos para evitar que se vuelvan a enviar los datos cuando se actualiza la página en el navegador.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Dado que un componente es un elemento reutilizable y, por lo general, no debería tener una dependencia directa de presentadores específicos, los métodos `redirect()` y `link()` interpretan automáticamente el parámetro como una señal de componente:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Si necesita redirigir a un presentador o acción diferente, puede hacerlo a través del presentador:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Parámetros persistentes .[#toc-persistent-parameters]
=====================================================
diff --git a/application/es/presenters.texy b/application/es/presenters.texy
index 030cd85b9c..ee6f551d6c 100644
--- a/application/es/presenters.texy
+++ b/application/es/presenters.texy
@@ -60,7 +60,7 @@ Similar al método `render()`. Mientras que `render()` está destina
Es importante que `action()` se llame antes que `render()`para que dentro de él podamos posiblemente cambiar el siguiente curso del ciclo de vida, es decir, cambiar la plantilla que será renderizada y también el método `render()` que será llamado, usando `setView('otherView')`.
-Los parámetros de la petición se pasan al método. Es posible y recomendable especificar tipos para los parámetros, por ejemplo `actionShow(int $id, string $slug = null)` - si el parámetro `id` falta o si no es un entero, el presentador devuelve [el error 404 |#Error 404 etc.] y termina la operación.
+Los parámetros de la petición se pasan al método. Es posible y recomendable especificar tipos para los parámetros, por ejemplo `actionShow(int $id, ?string $slug = null)` - si el parámetro `id` falta o si no es un entero, el presentador devuelve [el error 404 |#Error 404 etc.] y termina la operación.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ En la plantilla, estos mensajes están disponibles en la variable `$flashes` com
Error 404 etc. .[#toc-error-404-etc]
====================================
-Cuando no podamos satisfacer la petición porque por ejemplo el artículo que queremos mostrar no existe en la base de datos, lanzaremos el error 404 utilizando el método `error(string $message = null, int $httpCode = 404)`, que representa el error HTTP 404:
+Cuando no podamos satisfacer la petición porque por ejemplo el artículo que queremos mostrar no existe en la base de datos, lanzaremos el error 404 utilizando el método `error(?string $message = null, int $httpCode = 404)`, que representa el error HTTP 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ La redirección no se produce con una solicitud AJAX o POST porque provocaría u
También puede invocar la canonización manualmente mediante el método `canonicalize()`, que, al igual que el método `link()`, recibe el presentador, las acciones y los parámetros como argumentos. Crea un enlace y lo compara con la URL actual. Si es diferente, redirige al enlace generado.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// redirects if $slug is different from $realSlug
diff --git a/application/fr/ajax.texy b/application/fr/ajax.texy
index 6ef5b2bf32..d93abac2f4 100644
--- a/application/fr/ajax.texy
+++ b/application/fr/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Vous devez d'abord [initialiser |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] la bibliothèque :
+
+```js
+naja.initialize();
+```
+
Pour faire d'un lien ordinaire (signal) ou d'une soumission de formulaire une requête AJAX, il suffit de marquer le lien, le formulaire ou le bouton correspondant avec la classe `ajax`:
```html
diff --git a/application/fr/bootstrap.texy b/application/fr/bootstrap.texy
index dbe7e4bc85..32c12e829b 100644
--- a/application/fr/bootstrap.texy
+++ b/application/fr/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Le configurateur est chargé de configurer l'environnement et les services de l'application.
+ $this->configurator = new Configurator;
+ // Définir le répertoire pour les fichiers temporaires générés par Nette (par exemple, les modèles compilés)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette est intelligent, et le mode développement est activé automatiquement,
+ // ou vous pouvez l'activer pour une adresse IP spécifique en décommentant la ligne suivante:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Active Tracy: l'ultime outil de débogage "couteau suisse".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: charge automatiquement toutes les classes dans le répertoire donné
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Chargement des fichiers de configuration
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-Dans le cas des applications web, le fichier initial est `index.php`, qui se trouve dans le répertoire public `www/`. Il laisse la classe `Bootstrap` pour initialiser l'environnement et retourne la classe `$configurator` qui crée le conteneur DI. Ensuite, il obtient le service `Application`, qui exécute l'application web :
+Le fichier initial des applications web est `index.php`, situé dans le répertoire public `www/`. Il utilise la classe `Bootstrap` pour initialiser l'environnement et créer un conteneur DI. Ensuite, il obtient le service `Application` du conteneur, ce qui lance l'application web :
```php
-// initialisation de l'environnement + obtention de l'objet Configurateur
-$configurator = App\Bootstrap::boot();
-// créer un conteneur DI
-$container = $configurator->createContainer();
+$bootstrap = new App\Bootstrap;
+// Initialiser l'environnement + créer un conteneur DI
+$container = $bootstrap->bootWebApplication();
// Le conteneur DI crée un objet Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// Démarrage de l'application Nette
+// Démarrer l'application Nette et traiter la demande entrante
$application->run();
```
@@ -66,19 +91,19 @@ La sélection du mode se fait par autodétection, il n'est donc généralement p
Si vous souhaitez activer le mode développement dans d'autres cas, par exemple pour les programmeurs accédant depuis une adresse IP spécifique, vous pouvez utiliser `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // une ou plusieurs adresses IP
+$this->configurator->setDebugMode('23.75.345.200'); // une ou plusieurs adresses IP
```
Nous recommandons vivement de combiner une adresse IP avec un cookie. Nous stockerons un jeton secret dans le cookie `nette-debug`, par exemple `secret1234`, et le mode de développement sera activé pour les programmeurs avec cette combinaison d'IP et de cookie.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Nous pouvons également désactiver complètement le mode de développement, même pour localhost :
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Notez que la valeur `true` active le mode développeur par défaut, ce qui ne devrait jamais arriver sur un serveur de production.
@@ -90,7 +115,7 @@ Outil de débogage Tracy .[#toc-debugging-tool-tracy]
Pour faciliter le débogage, nous allons activer l'excellent outil [Tracy |tracy:]. En mode développeur, il visualise les erreurs et en mode production, il enregistre les erreurs dans le répertoire spécifié :
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Fichiers temporaires .[#toc-temporary-files]
Nette utilise le cache pour le conteneur DI, RobotLoader, les modèles, etc. Il est donc nécessaire de définir le chemin d'accès au répertoire où le cache sera stocké :
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
Sous Linux ou macOS, définissez les [droits d'écriture |nette:troubleshooting#Setting directory permissions] pour les répertoires `log/` et `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
En général, nous voulons charger automatiquement les classes à l'aide de [RobotLoader |robot-loader:], nous devons donc le lancer et le laisser charger les classes du répertoire où se trouve `Bootstrap.php` (c'est-à-dire `__DIR__`) et de tous ses sous-répertoires :
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Fuseau horaire .[#toc-timezone]
Le configurateur vous permet de spécifier un fuseau horaire pour votre application.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ En mode développement, le conteneur est automatiquement mis à jour chaque fois
Les fichiers de configuration sont chargés à l'aide de `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
La méthode `addConfig()` peut être appelée plusieurs fois pour ajouter plusieurs fichiers.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Paramètres statiques .[#toc-static-parameters]
Les paramètres utilisés dans les fichiers de configuration peuvent être définis [dans la section `parameters` |dependency-injection:configuration#parameters] et également transmis (ou écrasés) par la méthode `addStaticParameters()` (qui a un alias `addParameters()`). Il est important que les différentes valeurs des paramètres entraînent la génération de conteneurs DI supplémentaires, c'est-à-dire de classes supplémentaires.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Paramètres dynamiques .[#toc-dynamic-parameters]
Nous pouvons également ajouter des paramètres dynamiques au conteneur, leurs différentes valeurs, contrairement aux paramètres statiques, ne provoqueront pas la génération de nouveaux conteneurs DI.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Les variables d'environnement peuvent être facilement mises à disposition à l'aide de paramètres dynamiques. Nous pouvons y accéder via `%env.variable%` dans les fichiers de configuration.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Créez une nouvelle instance et insérez-la dans bootstrap :
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Différents environnements .[#toc-different-environments]
========================================================
-N'hésitez pas à personnaliser la classe `Bootstrap` en fonction de vos besoins. Vous pouvez ajouter des paramètres à la méthode `boot()` pour différencier les projets Web, ou ajouter d'autres méthodes, comme `bootForTests()`, qui initialise l'environnement pour les tests unitaires, `bootForCli()` pour les scripts appelés depuis la ligne de commande, etc.
+N'hésitez pas à personnaliser la classe `Bootstrap` en fonction de vos besoins. Vous pouvez ajouter des paramètres à la méthode `bootWebApplication()` pour différencier les projets web. Vous pouvez également ajouter d'autres méthodes, telles que `bootTestEnvironment()` pour initialiser l'environnement des tests unitaires, `bootConsoleApplication()` pour les scripts appelés à partir de la ligne de commande, etc.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Initialisation du testeur Nette
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // Initialisation du testeur de nappe
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/fr/components.texy b/application/fr/components.texy
index 0b261bac97..a9472f1af9 100644
--- a/application/fr/components.texy
+++ b/application/fr/components.texy
@@ -230,6 +230,28 @@ Dans le modèle, ces messages sont disponibles dans la variable `$flashes` sous
```
+Redirection après un signal .[#toc-redirection-after-a-signal]
+==============================================================
+
+Le traitement d'un signal de composant est souvent suivi d'une redirection. Cette situation est similaire à celle des formulaires : après avoir soumis un formulaire, nous redirigeons également les données pour éviter qu'elles ne soient soumises à nouveau lorsque la page est rafraîchie dans le navigateur.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Étant donné qu'un composant est un élément réutilisable et qu'il ne doit généralement pas dépendre directement de présentateurs spécifiques, les méthodes `redirect()` et `link()` interprètent automatiquement le paramètre comme un signal de composant :
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Si vous devez rediriger vers un autre présentateur ou une autre action, vous pouvez le faire par l'intermédiaire du présentateur :
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Paramètres persistants .[#toc-persistent-parameters]
====================================================
diff --git a/application/fr/presenters.texy b/application/fr/presenters.texy
index bb0010a1f0..538f20ab44 100644
--- a/application/fr/presenters.texy
+++ b/application/fr/presenters.texy
@@ -60,7 +60,7 @@ Similaire à la méthode `render()`. Alors que `render()` a pour but
Il est important que `action()` soit appelé avant `render()`afin qu'à l'intérieur de celui-ci, nous puissions éventuellement modifier le cours suivant du cycle de vie, c'est-à-dire changer le modèle qui sera rendu et également la méthode `render()` qui sera appelée, en utilisant `setView('otherView')`.
-Les paramètres de la requête sont transmis à la méthode. Il est possible et recommandé de spécifier des types pour les paramètres, par exemple `actionShow(int $id, string $slug = null)` - si le paramètre `id` est manquant ou s'il ne s'agit pas d'un nombre entier, le présentateur renvoie l'[erreur 404 |#Error 404 etc.] et met fin à l'opération.
+Les paramètres de la requête sont transmis à la méthode. Il est possible et recommandé de spécifier des types pour les paramètres, par exemple `actionShow(int $id, ?string $slug = null)` - si le paramètre `id` est manquant ou s'il ne s'agit pas d'un nombre entier, le présentateur renvoie l'[erreur 404 |#Error 404 etc.] et met fin à l'opération.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ Dans le modèle, ces messages sont disponibles dans la variable `$flashes` en ta
Erreur 404 etc. .[#toc-error-404-etc]
=====================================
-Lorsque nous ne pouvons pas répondre à la demande, par exemple parce que l'article que nous voulons afficher n'existe pas dans la base de données, nous envoyons l'erreur 404 en utilisant la méthode `error(string $message = null, int $httpCode = 404)`, qui représente l'erreur HTTP 404 :
+Lorsque nous ne pouvons pas répondre à la demande, par exemple parce que l'article que nous voulons afficher n'existe pas dans la base de données, nous envoyons l'erreur 404 en utilisant la méthode `error(?string $message = null, int $httpCode = 404)`, qui représente l'erreur HTTP 404 :
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ La redirection ne se produit pas avec une demande AJAX ou POST, car elle entraî
Vous pouvez également invoquer la canonisation manuellement à l'aide de la méthode `canonicalize()`, qui, comme la méthode `link()`, reçoit le présentateur, les actions et les paramètres comme arguments. Elle crée un lien et le compare à l'URL actuelle. Si elle est différente, elle redirige vers le lien généré.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// redirige si $slug est différent de $realSlug
diff --git a/application/hu/ajax.texy b/application/hu/ajax.texy
index 24ec5880e0..b2a6f90cc9 100644
--- a/application/hu/ajax.texy
+++ b/application/hu/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Először [inicializálni |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] kell a könyvtárat:
+
+```js
+naja.initialize();
+```
+
Ahhoz, hogy egy közönséges linket (jelet) vagy űrlapküldést AJAX-kérelemmé tegyen, egyszerűen jelölje meg az adott linket, űrlapot vagy gombot a `ajax` osztállyal:
```html
diff --git a/application/hu/bootstrap.texy b/application/hu/bootstrap.texy
index 49be7dca25..a05ab01083 100644
--- a/application/hu/bootstrap.texy
+++ b/application/hu/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // A konfigurátor felelős az alkalmazási környezet és a szolgáltatások beállításáért.
+ $this->configurator = new Configurator;
+ // A Nette által generált ideiglenes fájlok (pl. lefordított sablonok) könyvtárának beállítása.
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // A Nette intelligens, és a fejlesztői üzemmód automatikusan bekapcsol,
+ // vagy engedélyezheti egy adott IP-címre a következő sor megjegyzésének feloldásával:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Bekapcsolja a Tracy-t: a végső "svájci bicska" hibakeresési eszköz.
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: automatikusan feltölti az összes osztályt a megadott könyvtárban.
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Konfigurációs fájlok betöltése
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-A webes alkalmazások esetében a kezdő fájl a `index.php`, amely a `www/` nyilvános könyvtárban található. Ez lehetővé teszi a `Bootstrap` osztály számára, hogy inicializálja a környezetet, és visszaadja a `$configurator`, amely létrehozza a DI konténert. Ezután megszerzi a `Application` szolgáltatást, amely a webalkalmazást futtatja:
+A webes alkalmazások kezdőfájlja a `index.php`, amely a `www/` nyilvános könyvtárban található. A `Bootstrap` osztályt használja a környezet inicializálásához és a DI konténer létrehozásához. Ezután megszerzi a `Application` szolgáltatást a konténerből, amely elindítja a webalkalmazást:
```php
-// a környezet inicializálása + konfigurátor objektum kinyerése
-$configurator = App\Bootstrap::boot();
-// DI konténer létrehozása
-$container = $configurator->createContainer();
+$bootstrap = new App\Bootstrap;
+// A környezet inicializálása + DI konténer létrehozása
+$container = $bootstrap->bootWebApplication();
// A DI konténer létrehoz egy Nette\Application\Application objektumot.
$application = $container->getByType(Nette\Application\Application::class);
-// Nette alkalmazás indítása
+// A Nette-alkalmazás elindítása és a bejövő kérések kezelése.
$application->run();
```
@@ -66,19 +91,19 @@ A mód kiválasztása automatikus felismeréssel történik, így általában ne
Ha más esetekben, például egy adott IP-címről hozzáférő programozók számára szeretné engedélyezni a fejlesztési üzemmódot, akkor a `setDebugMode()` címet használhatja:
```php
-$configurator->setDebugMode('23.75.345.200'); // egy vagy több IP-cím
+$this->configurator->setDebugMode('23.75.345.200'); // egy vagy több IP-cím
```
Mindenképpen javasoljuk az IP-cím és a cookie kombinálását. A `nette-debug` cookie-ban tárolunk egy titkos tokent, pl. `secret1234`, és a fejlesztési mód az IP és a cookie ilyen kombinációjával rendelkező programozók számára aktiválódik.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
A fejlesztői módot teljesen ki is kapcsolhatjuk, akár a localhost esetében is:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
A `true` érték keményen bekapcsolja a fejlesztői módot, ami soha nem történhet meg egy termelő szerveren.
@@ -90,7 +115,7 @@ Hibakereső eszköz Tracy .[#toc-debugging-tool-tracy]
Az egyszerű hibakeresés érdekében bekapcsoljuk a [Tracy |tracy:] nevű nagyszerű eszközt. Fejlesztői módban megjeleníti a hibákat, termelési módban pedig a megadott könyvtárba naplózza a hibákat:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Ideiglenes fájlok .[#toc-temporary-files]
A Nette a DI konténer, a RobotLoader, a sablonok stb. számára használja a gyorsítótárat. Ezért szükséges annak a könyvtárnak az elérési útvonalát beállítani, ahol a gyorsítótár tárolásra kerül:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
Linuxon vagy macOS-en állítsa be a `log/` és a `temp/` könyvtárak [írási engedélyeit |nette:troubleshooting#Setting directory permissions].
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Általában a [RobotLoader |robot-loader:] segítségével szeretnénk automatikusan betölteni az osztályokat, ezért el kell indítanunk, és hagynunk kell, hogy betöltse az osztályokat abból a könyvtárból, ahol a `Bootstrap.php` található (azaz `__DIR__`) és annak összes alkönyvtárából:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Időzóna .[#toc-timezone]
A Configurator lehetővé teszi, hogy megadjon egy időzónát az alkalmazásához.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ Fejlesztői üzemmódban a konténer automatikusan frissül minden alkalommal, a
A konfigurációs fájlok betöltése a `addConfig()` segítségével történik:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
A `addConfig()` metódus többször is meghívható több fájl hozzáadásához.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Statikus paraméterek .[#toc-static-parameters]
A konfigurációs fájlokban használt paramétereket a [`parameters` szakaszban |dependency-injection:configuration#parameters] lehet definiálni, és a `addStaticParameters()` metódus (amelynek alias neve `addParameters()`) is átadhatja (vagy felülírhatja). Fontos, hogy a különböző paraméterértékek további DI-konténerek, azaz további osztályok generálását okozzák.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Dinamikus paraméterek .[#toc-dynamic-parameters]
A konténerhez dinamikus paramétereket is hozzáadhatunk, ezek eltérő értékei a statikus paraméterekkel ellentétben nem okoznak új DI-konténerek generálását.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
A környezeti változókat könnyen elérhetővé tehetnénk dinamikus paraméterek segítségével. A konfigurációs fájlokban a `%env.variable%` címen keresztül érhetjük el őket.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Hozzunk létre egy új példányt, és illesszük be a bootstrapbe:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Különböző környezetek .[#toc-different-environments]
====================================================
-Nyugodtan testre szabhatja a `Bootstrap` osztályt, hogy megfeleljen az igényeinek. A `boot()` metódushoz paramétereket adhat a webes projektek megkülönböztetéséhez, vagy más metódusokat is hozzáadhat, például a `bootForTests()`, amely inicializálja a környezetet a unit tesztekhez, a `bootForCli()` a parancssorból hívott szkriptekhez, és így tovább.
+Ne habozzon, ha a `Bootstrap` osztályt saját igényei szerint alakíthatja. A `bootWebApplication()` metódushoz paramétereket adhat hozzá a webes projektek megkülönböztetése érdekében. Alternatívaként más metódusokat is hozzáadhat, például a `bootTestEnvironment()` a környezet inicializálásához a unit tesztekhez, a `bootConsoleApplication()` a parancssorból hívott szkriptekhez stb.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
{
- $configurator = self::boot();
Tester\Environment::setup(); // Nette Tester inicializálása
- return $configurator;
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
+{
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/hu/components.texy b/application/hu/components.texy
index 96d0ee1e96..0e10d16126 100644
--- a/application/hu/components.texy
+++ b/application/hu/components.texy
@@ -230,6 +230,28 @@ A sablonban ezek az üzenetek a `$flashes` változóban állnak rendelkezésre,
```
+Átirányítás jelzést követően .[#toc-redirection-after-a-signal]
+===============================================================
+
+Egy komponensjel feldolgozása után gyakran következik az átirányítás. Ez a helyzet hasonló az űrlapokhoz - egy űrlap elküldése után mi is átirányítunk, hogy megakadályozzuk az adatok újbóli elküldését, amikor az oldal frissül a böngészőben.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Mivel a komponens egy újrafelhasználható elem, és általában nem szabad, hogy közvetlen függőségben álljon az egyes prezenterektől, a `redirect()` és a `link()` metódusok automatikusan komponensjelként értelmezik a paramétert:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Ha át kell irányítani egy másik prezenterre vagy műveletre, akkor ezt a prezenteren keresztül teheti meg:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Állandó paraméterek .[#toc-persistent-parameters]
=================================================
diff --git a/application/hu/presenters.texy b/application/hu/presenters.texy
index f38a06450a..076c632a4c 100644
--- a/application/hu/presenters.texy
+++ b/application/hu/presenters.texy
@@ -60,7 +60,7 @@ Hasonlóan a módszerhez `render()`. Míg a `render()` célja, hogy
Fontos, hogy `action()` előbb hívódik meg, mint a `render()`, így ezen belül esetleg megváltoztathatjuk az életciklus következő menetét, azaz megváltoztathatjuk a megjelenítendő sablont és a metódust is. `render()` ami meghívásra kerül, a `setView('otherView')` segítségével.
-A kérésből származó paramétereket átadjuk a metódusnak. Lehetséges és ajánlott a paraméterek típusainak megadása, pl. `actionShow(int $id, string $slug = null)` - ha a `id` paraméter hiányzik, vagy nem egész szám, a prezenter [404-es hibát |#Error 404 etc.] ad vissza, és megszakítja a műveletet.
+A kérésből származó paramétereket átadjuk a metódusnak. Lehetséges és ajánlott a paraméterek típusainak megadása, pl. `actionShow(int $id, ?string $slug = null)` - ha a `id` paraméter hiányzik, vagy nem egész szám, a prezenter [404-es hibát |#Error 404 etc.] ad vissza, és megszakítja a műveletet.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ A sablonban ezek az üzenetek a `$flashes` változóban `stdClass` objektumként
404-es hiba stb. .[#toc-error-404-etc]
======================================
-Ha nem tudjuk teljesíteni a kérést, mert például a megjeleníteni kívánt cikk nem létezik az adatbázisban, akkor a 404-es hibát dobjuk ki a `error(string $message = null, int $httpCode = 404)` módszerrel, amely a 404-es HTTP hibát jelenti:
+Ha nem tudjuk teljesíteni a kérést, mert például a megjeleníteni kívánt cikk nem létezik az adatbázisban, akkor a 404-es hibát dobjuk ki a `error(?string $message = null, int $httpCode = 404)` módszerrel, amely a 404-es HTTP hibát jelenti:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ Az átirányítás nem történik AJAX vagy POST kérés esetén, mivel az adatv
A kanonizálás manuálisan is meghívható a `canonicalize()` módszerrel, amely a `link()` módszerhez hasonlóan a prezentálót, a műveleteket és a paramétereket kapja argumentumként. Létrehoz egy linket, és összehasonlítja azt az aktuális URL-lel. Ha eltér, akkor átirányít a létrehozott linkre.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// átirányít, ha a $slug különbözik a $realSlug-tól.
diff --git a/application/it/ajax.texy b/application/it/ajax.texy
index 76658ce100..f15f19b518 100644
--- a/application/it/ajax.texy
+++ b/application/it/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Per prima cosa è necessario [inizializzare |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] la libreria:
+
+```js
+naja.initialize();
+```
+
Per rendere un normale link (segnale) o l'invio di un modulo una richiesta AJAX, è sufficiente contrassegnare il rispettivo link, modulo o pulsante con la classe `ajax`:
```html
diff --git a/application/it/bootstrap.texy b/application/it/bootstrap.texy
index 4459c3c534..b338b46064 100644
--- a/application/it/bootstrap.texy
+++ b/application/it/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Il configuratore è responsabile dell'impostazione dell'ambiente applicativo e dei servizi.
+ $this->configurator = new Configurator;
+ // Impostare la directory per i file temporanei generati da Nette (ad esempio, i modelli compilati).
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette è intelligente e la modalità di sviluppo si attiva automaticamente,
+ // oppure si può attivare per un indirizzo IP specifico decommentando la seguente riga:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Abilita Tracy: lo strumento di debug per eccellenza, il "coltellino svizzero".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: carica automaticamente tutte le classi nella cartella data
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Carica i file di configurazione
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-Nel caso delle applicazioni web, il file iniziale è `index.php`, che si trova nella cartella pubblica `www/`. Permette alla classe `Bootstrap` di inizializzare l'ambiente e restituisce la classe `$configurator` che crea il contenitore DI. Quindi ottiene il servizio `Application`, che esegue l'applicazione web:
+Il file iniziale per le applicazioni web è `index.php`, situato nella cartella pubblica `www/`. Utilizza la classe `Bootstrap` per inizializzare l'ambiente e creare un contenitore DI. Quindi, ottiene il servizio `Application` dal contenitore, che lancia l'applicazione web:
```php
-// inizializzare l'ambiente + ottenere l'oggetto Configuratore
-$configurator = App\Bootstrap::boot();
-// creare un contenitore DI
-$container = $configurator->createContainer();
-// Il contenitore DI crea un oggetto Nette\Application\Application
+$bootstrap = new App\Bootstrap;
+// Inizializzare l'ambiente + creare un contenitore DI
+$container = $bootstrap->bootWebApplication();
+// Il contenitore DI crea un oggetto NetteApplicationApplication
$application = $container->getByType(Nette\Application\Application::class);
-// avvia l'applicazione Nette
+// Avviare l'applicazione Nette e gestire la richiesta in arrivo
$application->run();
```
@@ -66,19 +91,19 @@ La selezione della modalità avviene tramite il rilevamento automatico, quindi d
Se si vuole abilitare la modalità di sviluppo in altri casi, ad esempio per i programmatori che accedono da un indirizzo IP specifico, si può usare `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // uno o più indirizzi IP
+$this->configurator->setDebugMode('23.75.345.200'); // uno o più indirizzi IP
```
Consigliamo assolutamente di combinare un indirizzo IP con un cookie. Nel cookie `nette-debug` verrà memorizzato un token segreto, ad esempio `secret1234`, e la modalità di sviluppo verrà attivata per i programmatori con questa combinazione di IP e cookie.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Possiamo anche disattivare completamente la modalità sviluppatore, anche per localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Si noti che il valore `true` attiva la modalità sviluppatore, cosa che non dovrebbe mai accadere su un server di produzione.
@@ -90,7 +115,7 @@ Strumento di debug Tracy .[#toc-debugging-tool-tracy]
Per facilitare il debug, attiviamo l'ottimo strumento [Tracy |tracy:]. In modalità sviluppatore visualizza gli errori e in modalità produzione li registra nella directory specificata:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ File temporanei .[#toc-temporary-files]
Nette utilizza la cache per il contenitore DI, il RobotLoader, i modelli, ecc. Per questo motivo è necessario impostare il percorso della cartella in cui verrà memorizzata la cache:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
Su Linux o macOS, impostare i [permessi di scrittura |nette:troubleshooting#Setting directory permissions] per le directory `log/` e `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Di solito, vogliamo caricare automaticamente le classi usando [RobotLoader |robot-loader:], quindi dobbiamo avviarlo e fargli caricare le classi dalla directory in cui si trova `Bootstrap.php` (cioè `__DIR__`) e da tutte le sue sottodirectory:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Fuso orario .[#toc-timezone]
Il configuratore consente di specificare un fuso orario per l'applicazione.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ In modalità di sviluppo, il contenitore viene aggiornato automaticamente ogni v
I file di configurazione vengono caricati usando `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Il metodo `addConfig()` può essere richiamato più volte per aggiungere più file.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Parametri statici .[#toc-static-parameters]
I parametri usati nei file di configurazione possono essere definiti [nella sezione `parameters` |dependency-injection:configuration#parameters] e anche passati (o sovrascritti) dal metodo `addStaticParameters()` (ha l'alias `addParameters()`). È importante che valori diversi dei parametri causino la generazione di contenitori DI aggiuntivi, cioè di classi aggiuntive.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Parametri dinamici .[#toc-dynamic-parameters]
Possiamo anche aggiungere parametri dinamici al contenitore; i loro diversi valori, a differenza dei parametri statici, non causeranno la generazione di nuovi contenitori DI.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Le variabili d'ambiente possono essere facilmente rese disponibili usando parametri dinamici. Possiamo accedervi tramite `%env.variable%` nei file di configurazione.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Creare una nuova istanza e inserirla in bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Ambienti diversi .[#toc-different-environments]
===============================================
-Sentitevi liberi di personalizzare la classe `Bootstrap` in base alle vostre esigenze. Si possono aggiungere parametri al metodo `boot()` per differenziare i progetti web, oppure aggiungere altri metodi, come `bootForTests()`, che inizializza l'ambiente per i test unitari, `bootForCli()` per gli script chiamati dalla riga di comando e così via.
+Non esitate a personalizzare la classe `Bootstrap` in base alle vostre esigenze. Si possono aggiungere parametri al metodo `bootWebApplication()` per differenziare i progetti web. In alternativa, si possono aggiungere altri metodi, come `bootTestEnvironment()` per inizializzare l'ambiente per i test unitari, `bootConsoleApplication()` per gli script chiamati dalla riga di comando e così via.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Inizializzazione del tester Nette
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // Nette Tester initialization
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/it/components.texy b/application/it/components.texy
index c623b0b7cd..a4198af736 100644
--- a/application/it/components.texy
+++ b/application/it/components.texy
@@ -230,6 +230,28 @@ Nel modello, questi messaggi sono disponibili nella variabile `$flashes` come og
```
+Reindirizzamento dopo un segnale .[#toc-redirection-after-a-signal]
+===================================================================
+
+Dopo l'elaborazione di un segnale di un componente, spesso segue un reindirizzamento. Questa situazione è simile a quella dei moduli: dopo l'invio di un modulo, si effettua un reindirizzamento per evitare che i dati vengano inviati nuovamente quando la pagina viene aggiornata nel browser.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Poiché un componente è un elemento riutilizzabile e di solito non dovrebbe avere una dipendenza diretta da presentatori specifici, i metodi `redirect()` e `link()` interpretano automaticamente il parametro come un segnale di componente:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Se è necessario reindirizzare a un presentatore o a un'azione diversa, lo si può fare attraverso il presentatore:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Parametri persistenti .[#toc-persistent-parameters]
===================================================
diff --git a/application/it/presenters.texy b/application/it/presenters.texy
index 5c8c2d8d80..7f12f07c7f 100644
--- a/application/it/presenters.texy
+++ b/application/it/presenters.texy
@@ -60,7 +60,7 @@ Simile al metodo `render()`. Mentre `render()` è destinato a prepar
È importante che `action()` sia chiamato prima di `render()`quindi al suo interno si può eventualmente modificare il corso successivo del ciclo di vita, cioè cambiare il template che sarà reso e anche il metodo `render()` che sarà chiamato, utilizzando `setView('otherView')`.
-I parametri della richiesta vengono passati al metodo. È possibile e consigliabile specificare i tipi di parametri, ad esempio `actionShow(int $id, string $slug = null)` - se il parametro `id` manca o non è un intero, il presentatore restituisce l'[errore 404 |#Error 404 etc.] e termina l'operazione.
+I parametri della richiesta vengono passati al metodo. È possibile e consigliabile specificare i tipi di parametri, ad esempio `actionShow(int $id, ?string $slug = null)` - se il parametro `id` manca o non è un intero, il presentatore restituisce l'[errore 404 |#Error 404 etc.] e termina l'operazione.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ Nel modello, questi messaggi sono disponibili nella variabile `$flashes` come og
Errore 404 ecc. .[#toc-error-404-etc]
=====================================
-Quando non possiamo soddisfare la richiesta, perché ad esempio l'articolo che vogliamo visualizzare non esiste nel database, lanceremo l'errore 404 usando il metodo `error(string $message = null, int $httpCode = 404)`, che rappresenta l'errore HTTP 404:
+Quando non possiamo soddisfare la richiesta, perché ad esempio l'articolo che vogliamo visualizzare non esiste nel database, lanceremo l'errore 404 usando il metodo `error(?string $message = null, int $httpCode = 404)`, che rappresenta l'errore HTTP 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ Il reindirizzamento non avviene con una richiesta AJAX o POST, perché comporter
Si può anche invocare la canonizzazione manualmente con il metodo `canonicalize()`, che, come il metodo `link()`, riceve come argomenti il presentatore, le azioni e i parametri. Crea un link e lo confronta con l'URL corrente. Se è diverso, reindirizza al link generato.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// reindirizza se $slug è diverso da $realSlug
diff --git a/application/pl/ajax.texy b/application/pl/ajax.texy
index e38121342e..9a6f09bd03 100644
--- a/application/pl/ajax.texy
+++ b/application/pl/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Najpierw należy [zainicjować |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] bibliotekę:
+
+```js
+naja.initialize();
+```
+
Aby uczynić zwykły link (sygnał) lub przesłanie formularza żądaniem AJAX, wystarczy oznaczyć odpowiedni link, formularz lub przycisk klasą `ajax`:
```html
diff --git a/application/pl/bootstrap.texy b/application/pl/bootstrap.texy
index cfbd2d5f09..084d93b416 100644
--- a/application/pl/bootstrap.texy
+++ b/application/pl/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Konfigurator jest odpowiedzialny za konfigurację środowiska aplikacji i usług.
+ $this->configurator = new Configurator;
+ // Ustawienie katalogu dla plików tymczasowych generowanych przez Nette (np. skompilowanych szablonów).
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette jest inteligentny i tryb deweloperski włącza się automatycznie,
+ // lub można go włączyć dla określonego adresu IP, odkomentowując następującą linię:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Włącza Tracy: najlepsze narzędzie do debugowania.
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: automatycznie ładuje wszystkie klasy w podanym katalogu
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Ładowanie plików konfiguracyjnych
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-Podstawowym plikiem w przypadku aplikacji internetowych jest `index.php`, który znajduje się w katalogu publicznym `www/`. Spowoduje to, że klasa Bootstrap zainicjuje środowisko i zwróci `$configurator`, a następnie wyprodukuje kontener DI. Następnie pobiera z niego usługę `Application`, która uruchamia aplikację internetową:
+Początkowym plikiem dla aplikacji internetowych jest `index.php`, znajdujący się w publicznym katalogu `www/`. Używa on klasy `Bootstrap` do zainicjowania środowiska i utworzenia kontenera DI. Następnie uzyskuje usługę `Application` z kontenera, który uruchamia aplikację internetową:
```php
-// inicjalizacja środowiska + uzyskanie obiektu Configurator
-$configurator = App\Bootstrap::boot();
-// tworzenie kontenera DI
-$container = $configurator->createContainer();
-// Kontener DI tworzy obiekt "Nette
+$bootstrap = new App\Bootstrap;
+// Inicjalizacja środowiska + utworzenie kontenera DI
+$container = $bootstrap->bootWebApplication();
+// Kontener DI tworzy obiekt Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// uruchomienie aplikacji Nette
+// Uruchom aplikację Nette i obsłuż przychodzące żądanie
$application->run();
```
@@ -66,19 +91,19 @@ Wybór trybu odbywa się poprzez autodetekcję, więc zazwyczaj nie ma potrzeby
Jeśli chcemy włączyć tryb deweloperski w innych przypadkach, takich jak programiści uzyskujący dostęp z określonego adresu IP, używamy `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // można również określić pole adresu IP
+$this->configurator->setDebugMode('23.75.345.200'); // można również określić pole adresu IP
```
Zdecydowanie zalecamy połączenie adresu IP z plikiem cookie. W pliku cookie `nette-debug` przechowujemy tajny token, np. `secret1234`, i w ten sposób umożliwiamy tryb deweloperski dla programistów uzyskujących dostęp z określonego adresu IP i posiadających token w pliku cookie:
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Możemy również całkowicie wyłączyć tryb deweloperski, nawet dla localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Uwaga, wartość `true` domyślnie włącza tryb deweloperski, co nigdy nie może mieć miejsca na serwerze produkcyjnym.
@@ -90,7 +115,7 @@ Narzędzie do debugowania Tracy .[#toc-debugging-tool-tracy]
Aby ułatwić debugowanie, włączmy wspaniałe narzędzie [Tracy |tracy:]. Wizualizuje błędy w trybie deweloperskim i loguje błędy w trybie produkcyjnym do podanego katalogu:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Pliki tymczasowe .[#toc-temporary-files]
Nette używa buforowania dla kontenera DI, RobotLoader, szablonów itp. Dlatego musisz ustawić ścieżkę do katalogu, w którym będzie przechowywany cache:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
W systemach Linux lub macOS ustaw katalogi `log/` i `temp/` na uprawnienia do [zapisu |nette:troubleshooting#Setting-Directory-Permissions].
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Zazwyczaj będziemy chcieli automatycznie załadować klasy za pomocą [RobotLoader |robot-loader:], więc musimy go uruchomić i kazać mu załadować klasy z katalogu, w którym znajduje się `Bootstrap.php` (czyli `__DIR__`), oraz z wszelkich podkatalogów:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Strefa czasowa .[#toc-timezone]
Domyślną strefę czasową można ustawić za pośrednictwem konfiguratora.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ W trybie deweloperskim kontener jest automatycznie aktualizowany przy każdej zm
Pliki konfiguracyjne są ładowane za pomocą `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Jeśli chcemy dodać więcej plików konfiguracyjnych, możemy wywołać funkcję `addConfig()` wielokrotnie.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Parametry statyczne .[#toc-static-parameters]
Parametry wykorzystywane w plikach konfiguracyjnych można zdefiniować [w sekcji `parameters` |dependency-injection:configuration#parameters], a także przekazać (lub nadpisać) za pomocą metody `addStaticParameters()` (posiada ona alias `addParameters()`). Co ważne, różne wartości parametrów spowodują wygenerowanie dodatkowych kontenerów DI, czyli dodatkowych klas.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Parametry dynamiczne .[#toc-dynamic-parameters]
Do kontenera możemy również dodać parametry dynamiczne, których różne wartości, w przeciwieństwie do parametrów statycznych, nie będą powodowały generowania nowych kontenerów DI.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Możemy po prostu dodać np. zmienne środowiskowe, do których następnie możemy się odwołać w konfiguracji pisząc `%env.variable%`.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
A w bootstrapie wstawiamy obiekt do kontenera:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Różne środowiska .[#toc-different-environments]
===============================================
-Zapraszamy do dostosowania klasy Bootstrap do swoich potrzeb. Możesz dodać parametry do metody `boot()`, aby odróżnić projekty internetowe, lub dodać inne metody, takie jak `bootForTests()`, która inicjalizuje środowisko dla testów jednostkowych, `bootForCli()` dla skryptów wywoływanych z linii poleceń itp.
+Nie wahaj się dostosować klasy `Bootstrap` do swoich potrzeb. Możesz dodać parametry do metody `bootWebApplication()`, aby rozróżnić projekty internetowe. Alternatywnie można dodać inne metody, takie jak `bootTestEnvironment()` do inicjalizacji środowiska dla testów jednostkowych, `bootConsoleApplication()` dla skryptów wywoływanych z wiersza poleceń itp.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Inicjalizacja testera sieci
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // inicializace Nette Testeru
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/pl/components.texy b/application/pl/components.texy
index 740e5f919e..21cbd673e9 100644
--- a/application/pl/components.texy
+++ b/application/pl/components.texy
@@ -230,6 +230,28 @@ Do szablonu wiadomości te są dostępne w zmiennej `$flashes` jako obiekty `std
```
+Przekierowanie po sygnale .[#toc-redirection-after-a-signal]
+============================================================
+
+Po przetworzeniu sygnału komponentu często następuje przekierowanie. Sytuacja ta jest podobna do formularzy - po przesłaniu formularza również przekierowujemy, aby zapobiec ponownemu przesłaniu danych po odświeżeniu strony w przeglądarce.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Ponieważ komponent jest elementem wielokrotnego użytku i zwykle nie powinien mieć bezpośredniej zależności od konkretnych prezenterów, metody `redirect()` i `link()` automatycznie interpretują parametr jako sygnał komponentu:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Jeśli konieczne jest przekierowanie do innego prezentera lub akcji, można to zrobić za pośrednictwem prezentera:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Trwałe parametry .[#toc-persistent-parameters]
==============================================
@@ -430,7 +452,7 @@ class PaginatingControl extends Control
}
```
-Procesem przeciwnym, czyli pobieraniem wartości z persistent properites, zajmuje się metoda `saveState()`.
+Procesem przeciwnym, czyli pobieraniem wartości z persistent properties, zajmuje się metoda `saveState()`.
Sygnały w głąb .[#toc-signaly-do-hloubky]
diff --git a/application/pl/presenters.texy b/application/pl/presenters.texy
index 7f366882c7..f35bddf004 100644
--- a/application/pl/presenters.texy
+++ b/application/pl/presenters.texy
@@ -60,7 +60,7 @@ Podobna metoda `render()`. Podczas gdy `render()` Metoda ma na celu
Ważne jest to, że `action()` jest wywoływany przed `render()`więc możemy w nim potencjalnie zmienić dalszy bieg historii, czyli zmienić szablon do wylosowania, a także metodę `render()`który zostanie wywołany. Odbywa się to za pomocą strony `setView('jineView')`.
-Do metody przekazywane są parametry z żądania. Możliwe i zalecane jest podawanie typów do parametrów, np. `actionShow(int $id, string $slug = null)` - jeśli w parametrze `id` zabraknie lub nie będzie on liczbą całkowitą, prezenter zwróci [błąd 404 |#Error-404-etc] i wyjdzie.
+Do metody przekazywane są parametry z żądania. Możliwe i zalecane jest podawanie typów do parametrów, np. `actionShow(int $id, ?string $slug = null)` - jeśli w parametrze `id` zabraknie lub nie będzie on liczbą całkowitą, prezenter zwróci [błąd 404 |#Error-404-etc] i wyjdzie.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ Wiadomości te są dostępne dla szablonu w zmiennej `$flashes` jako obiekty `st
Error 404 i co. .[#toc-error-404-etc]
=====================================
-Jeśli żądanie nie może zostać spełnione, na przykład dlatego, że artykuł, który chcemy wyświetlić, nie istnieje w bazie danych, rzucamy błąd 404 za pomocą metody `error(string $message = null, int $httpCode = 404)`.
+Jeśli żądanie nie może zostać spełnione, na przykład dlatego, że artykuł, który chcemy wyświetlić, nie istnieje w bazie danych, rzucamy błąd 404 za pomocą metody `error(?string $message = null, int $httpCode = 404)`.
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ Przekierowanie nie nastąpi w przypadku żądań AJAX lub POST, ponieważ spowod
Możesz również wywołać kanonizację ręcznie za pomocą metody `canonicalize()`, która przekaże prezentera, akcję i parametry podobnie jak w przypadku metody `link()`. Tworzy link i porównuje go z bieżącym adresem URL. Jeśli się różni, przekierowuje na wygenerowany link.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// přesměruje, pokud $slug se liší od $realSlug
diff --git a/application/pt/ajax.texy b/application/pt/ajax.texy
index 7eace28064..c2159c60f4 100644
--- a/application/pt/ajax.texy
+++ b/application/pt/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Primeiro, você precisa [inicializar |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] a biblioteca:
+
+```js
+naja.initialize();
+```
+
Para transformar um link comum (sinal) ou o envio de um formulário em uma solicitação AJAX, basta marcar o respectivo link, formulário ou botão com a classe `ajax`:
```html
diff --git a/application/pt/bootstrap.texy b/application/pt/bootstrap.texy
index e95d09a093..1428498866 100644
--- a/application/pt/bootstrap.texy
+++ b/application/pt/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // O configurador é responsável pela configuração do ambiente e dos serviços do aplicativo.
+ $this->configurator = new Configurator;
+ // Defina o diretório para os arquivos temporários gerados pelo Nette (por exemplo, modelos compilados)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // O Nette é inteligente e o modo de desenvolvimento é ativado automaticamente,
+ // ou você pode ativá-lo para um endereço IP específico, descomentando a seguinte linha:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Habilita o Tracy: a melhor ferramenta de depuração do tipo "canivete suíço".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: carrega automaticamente todas as classes no diretório fornecido
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Carregar arquivos de configuração
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-No caso de aplicações web, o arquivo inicial é `index.php`, que está localizado no diretório público `www/`. Ele permite que a classe `Bootstrap` inicialize o ambiente e devolva o `$configurator` que cria o contêiner DI. Em seguida, obtém o serviço `Application`, que executa a aplicação web:
+O arquivo inicial para aplicativos Web é `index.php`, localizado no diretório público `www/`. Ele usa a classe `Bootstrap` para inicializar o ambiente e criar um contêiner DI. Em seguida, ele obtém o serviço `Application` do contêiner, que inicia o aplicativo Web:
```php
-// inicializar o ambiente + obter objeto Configurador
-$configurator = App\Bootstrap::boot();
-// criar um recipiente DI
-$container = $configurator->createContainer();
-// Recipiente DI cria um objeto de aplicação Nette
+$bootstrap = new App\Bootstrap;
+// Inicializar o ambiente + criar um contêiner DI
+$container = $bootstrap->bootWebApplication();
+// O contêiner DI cria um objeto Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// iniciar a aplicação Nette
+// Iniciar o aplicativo Nette e tratar a solicitação de entrada
$application->run();
```
@@ -66,19 +91,19 @@ A seleção do modo é feita por autodetecção, de modo que normalmente não h
Se você quiser ativar o modo de desenvolvimento em outros casos, por exemplo, para programadores que acessam de um endereço IP específico, você pode usar `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // um ou mais endereços IP
+$this->configurator->setDebugMode('23.75.345.200'); // um ou mais endereços IP
```
Definitivamente, recomendamos combinar um endereço IP com um cookie. Armazenaremos um token secreto no cookie `nette-debug`, por exemplo `secret1234`, e o modo de desenvolvimento será ativado para programadores com esta combinação de IP e cookie.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Também podemos desligar completamente o modo desenvolvedor, mesmo para o localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Note que o valor `true` liga o modo desenvolvedor por hard, o que nunca deveria acontecer em um servidor de produção.
@@ -90,7 +115,7 @@ Ferramenta de depuração Tracy .[#toc-debugging-tool-tracy]
Para facilitar a depuração, vamos acionar a grande ferramenta [Tracy |tracy:]. No modo desenvolvedor ela visualiza os erros e no modo de produção registra os erros no diretório especificado:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Arquivos temporários .[#toc-temporary-files]
Nette utiliza o cache para contêiner DI, RobotLoader, modelos, etc. Portanto, é necessário definir o caminho para o diretório onde o cache será armazenado:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
No Linux ou macOS, defina as [permissões de escrita |nette:troubleshooting#Setting directory permissions] para os diretórios `log/` e `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Normalmente, queremos carregar automaticamente as classes usando [o RobotLoader |robot-loader:], então temos que iniciá-lo e deixá-lo carregar classes do diretório onde se encontra `Bootstrap.php` (ou seja, `__DIR__`) e todos os seus subdiretórios:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Fuso horário .[#toc-timezone]
O Configurador permite que você especifique um fuso horário para sua aplicação.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ No modo de desenvolvimento, o recipiente é atualizado automaticamente cada vez
Os arquivos de configuração são carregados usando `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
O método `addConfig()` pode ser chamado várias vezes para adicionar vários arquivos.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Parâmetros estáticos .[#toc-static-parameters]
Os parâmetros usados nos arquivos de configuração podem ser definidos [na seção `parameters` |dependency-injection:configuration#parameters] e também passados (ou sobrescritos) pelo método `addStaticParameters()` (tem o pseudônimo `addParameters()`). É importante que diferentes valores de parâmetros causem a geração de recipientes DI adicionais, ou seja, classes adicionais.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Parâmetros dinâmicos .[#toc-dynamic-parameters]
Também podemos adicionar parâmetros dinâmicos ao recipiente, seus diferentes valores, ao contrário dos parâmetros estáticos, não causarão a geração de novos recipientes DI.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
As variáveis ambientais poderiam ser facilmente disponibilizadas usando parâmetros dinâmicos. Podemos acessá-las via `%env.variable%` em arquivos de configuração.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Criar uma nova instância e inseri-la no bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Diferentes Ambientes .[#toc-different-environments]
===================================================
-Sinta-se à vontade para personalizar a classe `Bootstrap` de acordo com suas necessidades. Você pode adicionar parâmetros ao método `boot()` para diferenciar projetos web, ou adicionar outros métodos, tais como `bootForTests()`, que inicializa o ambiente para testes unitários, `bootForCli()` para scripts chamados a partir da linha de comando, e assim por diante.
+Não hesite em personalizar a classe `Bootstrap` de acordo com suas necessidades. Você pode adicionar parâmetros ao método `bootWebApplication()` para diferenciar os projetos da Web. Como alternativa, você pode adicionar outros métodos, como `bootTestEnvironment()` para inicializar o ambiente para testes de unidade, `bootConsoleApplication()` para scripts chamados pela linha de comando e assim por diante.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Inicialização do Nette Tester
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // Nette Tester initialization
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/pt/components.texy b/application/pt/components.texy
index 9cfe7557f5..502dc15cdc 100644
--- a/application/pt/components.texy
+++ b/application/pt/components.texy
@@ -230,6 +230,28 @@ No modelo, estas mensagens estão disponíveis na variável `$flashes` como obje
```
+Redirecionamento após um sinal .[#toc-redirection-after-a-signal]
+=================================================================
+
+Depois de processar um sinal de componente, o redirecionamento geralmente é feito. Essa situação é semelhante à dos formulários: após o envio de um formulário, também redirecionamos para evitar o reenvio de dados quando a página é atualizada no navegador.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Como um componente é um elemento reutilizável e normalmente não deve ter uma dependência direta de apresentadores específicos, os métodos `redirect()` e `link()` interpretam automaticamente o parâmetro como um sinal de componente:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Se precisar redirecionar para um apresentador ou ação diferente, você poderá fazer isso por meio do apresentador:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Parâmetros Persistentes .[#toc-persistent-parameters]
=====================================================
@@ -430,7 +452,7 @@ class PaginatingControl extends Control
}
```
-O processo oposto, ou seja, a coleta de valores de properites persistentes, é tratado pelo método `saveState()`.
+O processo oposto, ou seja, a coleta de valores de properties persistentes, é tratado pelo método `saveState()`.
Sinais em profundidade .[#toc-signals-in-depth]
diff --git a/application/pt/presenters.texy b/application/pt/presenters.texy
index 58df8e8539..b6537f16c6 100644
--- a/application/pt/presenters.texy
+++ b/application/pt/presenters.texy
@@ -60,7 +60,7 @@ Semelhante ao método `render()`. Enquanto `render()` é destinado a
É importante que `action()` é chamado antes `render()`Assim, dentro dele podemos possivelmente mudar o próximo ciclo de vida, ou seja, mudar o modelo que será apresentado e também o método `render()` que será chamado, usando `setView('otherView')`.
-Os parâmetros do pedido são passados para o método. É possível e recomendado especificar tipos para os parâmetros, por exemplo `actionShow(int $id, string $slug = null)` - se o parâmetro `id` estiver faltando ou se não for um número inteiro, o apresentador retorna o [erro 404 |#Error 404 etc.] e encerra a operação.
+Os parâmetros do pedido são passados para o método. É possível e recomendado especificar tipos para os parâmetros, por exemplo `actionShow(int $id, ?string $slug = null)` - se o parâmetro `id` estiver faltando ou se não for um número inteiro, o apresentador retorna o [erro 404 |#Error 404 etc.] e encerra a operação.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ No modelo, estas mensagens estão disponíveis na variável `$flashes` como obje
Erro 404 etc. .[#toc-error-404-etc]
===================================
-Quando não pudermos atender ao pedido porque, por exemplo, o artigo que queremos exibir não existe no banco de dados, vamos jogar fora o erro 404 usando o método `error(string $message = null, int $httpCode = 404)`, que representa o erro HTTP 404:
+Quando não pudermos atender ao pedido porque, por exemplo, o artigo que queremos exibir não existe no banco de dados, vamos jogar fora o erro 404 usando o método `error(?string $message = null, int $httpCode = 404)`, que representa o erro HTTP 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ O redirecionamento não ocorre com um pedido AJAX ou POST porque resultaria em p
Você também pode invocar a canonização manualmente usando o método `canonicalize()`, que, como o método `link()`, recebe o apresentador, ações e parâmetros como argumentos. Ele cria um link e o compara com a URL atual. Se for diferente, ele se redireciona para o link gerado.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// redireciona se $slug for diferente de $realSlug
diff --git a/application/ro/ajax.texy b/application/ro/ajax.texy
index 3f20c912bc..03eec3fac5 100644
--- a/application/ro/ajax.texy
+++ b/application/ro/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Mai întâi trebuie să [inițializați |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] biblioteca:
+
+```js
+naja.initialize();
+```
+
Pentru a transforma un link obișnuit (semnal) sau un formular de trimitere într-o cerere AJAX, este suficient să marcați link-ul, formularul sau butonul respectiv cu clasa `ajax`:
```html
diff --git a/application/ro/bootstrap.texy b/application/ro/bootstrap.texy
index 9daa091f0e..97b1a1fe30 100644
--- a/application/ro/bootstrap.texy
+++ b/application/ro/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Configuratorul este responsabil de configurarea mediului și a serviciilor aplicației.
+ $this->configurator = new Configurator;
+ // Setați directorul pentru fișierele temporare generate de Nette (de exemplu, șabloane compilate)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette este inteligent, iar modul de dezvoltare se activează automat,
+ // sau îl puteți activa pentru o anumită adresă IP prin decomentarea următoarei linii:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Activează Tracy: instrumentul suprem de depanare "swiss army knife".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: Încarcă automat toate clasele din directorul dat
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Încarcă fișierele de configurare
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-În cazul aplicațiilor web, fișierul inițial este `index.php`, care se află în directorul public `www/`. Acesta permite clasei `Bootstrap` să inițializeze mediul și să returneze `$configurator` care creează containerul DI. Apoi se obține serviciul `Application`, care execută aplicația web:
+Fișierul inițial pentru aplicațiile web este `index.php`, situat în directorul public `www/`. Acesta utilizează clasa `Bootstrap` pentru a inițializa mediul și a crea un container DI. Apoi, obține serviciul `Application` din container, care lansează aplicația web:
```php
-// inițializarea mediului + obținerea obiectului Configurator
-$configurator = App\Bootstrap::boot();
-// creați un container DI
-$container = $configurator->createContainer();
-// containerul DI creează un obiect Nette\Application\Application
+$bootstrap = new App\Bootstrap;
+// Inițializarea mediului + crearea unui container DI
+$container = $bootstrap->bootWebApplication();
+// Containerul DI creează un obiect Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// pornește aplicația Nette
+// Porniți aplicația Nette și tratați cererea de intrare
$application->run();
```
@@ -66,19 +91,19 @@ Selectarea modului se face prin autodetecție, astfel încât, de obicei, nu est
Dacă doriți să activați modul de dezvoltare în alte cazuri, de exemplu, pentru programatorii care accesează de la o anumită adresă IP, puteți utiliza `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // una sau mai multe adrese IP
+$this->configurator->setDebugMode('23.75.345.200'); // una sau mai multe adrese IP
```
Vă recomandăm cu siguranță să combinați o adresă IP cu un cookie. Vom stoca un token secret în cookie-ul `nette-debug`, de exemplu `secret1234`, iar modul de dezvoltare va fi activat pentru programatorii cu această combinație de IP și cookie.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
De asemenea, putem dezactiva complet modul de dezvoltare, chiar și pentru localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Rețineți că valoarea `true` activează modul dezvoltator din greu, ceea ce nu ar trebui să se întâmple niciodată pe un server de producție.
@@ -90,7 +115,7 @@ Instrumentul de depanare Tracy .[#toc-debugging-tool-tracy]
Pentru o depanare mai ușoară, vom porni minunata unealtă [Tracy |tracy:]. În modul dezvoltator, acesta vizualizează erorile, iar în modul de producție înregistrează erorile în directorul specificat:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Temporary Files .[#toc-temporary-files]
Nette utilizează memoria cache pentru DI container, RobotLoader, șabloane etc. Prin urmare, este necesar să setați calea către directorul în care va fi stocată memoria cache:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
Pe Linux sau macOS, setați [permisiunile de scriere |nette:troubleshooting#Setting directory permissions] pentru directoarele `log/` și `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
De obicei, vom dori să încărcăm automat clasele folosind [RobotLoader |robot-loader:], așa că trebuie să îl pornim și să îl lăsăm să încarce clasele din directorul în care se află `Bootstrap.php` (adică `__DIR__`) și din toate subdirectoarele sale:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Fusul orar .[#toc-timezone]
Configurator vă permite să specificați un fus orar pentru aplicația dumneavoastră.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ Fișierele de configurare sunt de obicei scrise în [formatul NEON |neon:format]
Fișierele de configurare sunt încărcate utilizând `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Metoda `addConfig()` poate fi apelată de mai multe ori pentru a adăuga mai multe fișiere.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Parametrii statici .[#toc-static-parameters]
Parametrii utilizați în fișierele de configurare pot fi definiți [în secțiunea `parameters` |dependency-injection:configuration#parameters] și, de asemenea, pot fi trecuți (sau suprascriși) prin metoda `addStaticParameters()` (are pseudonimul `addParameters()`). Este important ca valorile diferite ale parametrilor să determine generarea de containere DI suplimentare, adică de clase suplimentare.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Parametrii dinamici .[#toc-dynamic-parameters]
De asemenea, putem adăuga parametri dinamici la container, valorile lor diferite, spre deosebire de parametrii statici, nu vor determina generarea de noi containere DI.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Variabilele de mediu ar putea fi puse cu ușurință la dispoziție prin intermediul parametrilor dinamici. Le putem accesa prin intermediul `%env.variable%` în fișierele de configurare.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Creați o nouă instanță și inserați-o în bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Diferite medii .[#toc-different-environments]
=============================================
-Nu ezitați să personalizați clasa `Bootstrap` pentru a se potrivi nevoilor dumneavoastră. Puteți adăuga parametri la metoda `boot()` pentru a diferenția proiectele web sau puteți adăuga alte metode, cum ar fi `bootForTests()`, care inițializează mediul pentru testele unitare, `bootForCli()` pentru scripturile apelate din linia de comandă și așa mai departe.
+Nu ezitați să personalizați clasa `Bootstrap` în funcție de nevoile dumneavoastră. Puteți adăuga parametri la metoda `bootWebApplication()` pentru a face diferența între proiectele web. Alternativ, puteți adăuga alte metode, cum ar fi `bootTestEnvironment()` pentru a inițializa mediul pentru testele unitare, `bootConsoleApplication()` pentru scripturile apelate din linia de comandă și așa mai departe.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
{
- $configurator = self::boot();
Tester\Environment::setup(); // Inițializarea Nette Tester
- return $configurator;
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
+{
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/ro/components.texy b/application/ro/components.texy
index d988ba261f..1d48351bbd 100644
--- a/application/ro/components.texy
+++ b/application/ro/components.texy
@@ -230,6 +230,28 @@ $this->redirect(/* ... */); // și redirecționarea
```
+Redirecționarea după un semnal .[#toc-redirection-after-a-signal]
+=================================================================
+
+După procesarea unui semnal de componentă, urmează adesea redirecționarea. Această situație este similară formularelor - după trimiterea unui formular, redirecționăm, de asemenea, pentru a preveni retrimiterea datelor atunci când pagina este reîmprospătată în browser.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Deoarece o componentă este un element reutilizabil și de obicei nu ar trebui să aibă o dependență directă de anumiți prezentatori, metodele `redirect()` și `link()` interpretează automat parametrul ca fiind un semnal de componentă:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Dacă trebuie să redirecționați către un alt prezentator sau acțiune, puteți face acest lucru prin intermediul prezentatorului:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Parametrii persistenți .[#toc-persistent-parameters]
====================================================
diff --git a/application/ro/presenters.texy b/application/ro/presenters.texy
index ff6009176f..56eef37cb0 100644
--- a/application/ro/presenters.texy
+++ b/application/ro/presenters.texy
@@ -60,7 +60,7 @@ Similar cu metoda `render()`. În timp ce `render()` este destinată
Este important ca `action()` este apelat înainte de `render()`, astfel încât în interiorul acesteia să putem eventual să schimbăm următorul curs al ciclului de viață, adică să schimbăm șablonul care va fi redat și, de asemenea, metoda `render()` care va fi apelată, folosind `setView('otherView')`.
-Parametrii din cerere sunt trecuți către metodă. Este posibil și recomandat să se precizeze tipurile pentru parametri, de exemplu `actionShow(int $id, string $slug = null)` - dacă parametrul `id` lipsește sau dacă nu este un număr întreg, prezentatorul returnează [eroarea 404 |#Error 404 etc.] și încheie operațiunea.
+Parametrii din cerere sunt trecuți către metodă. Este posibil și recomandat să se precizeze tipurile pentru parametri, de exemplu `actionShow(int $id, ?string $slug = null)` - dacă parametrul `id` lipsește sau dacă nu este un număr întreg, prezentatorul returnează [eroarea 404 |#Error 404 etc.] și încheie operațiunea.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ $this->redirect(/* ... */);
Eroare 404 etc. .[#toc-error-404-etc]
=====================================
-Atunci când nu putem îndeplini cererea deoarece, de exemplu, articolul pe care dorim să îl afișăm nu există în baza de date, vom arunca eroarea 404 folosind metoda `error(string $message = null, int $httpCode = 404)`, care reprezintă eroarea HTTP 404:
+Atunci când nu putem îndeplini cererea deoarece, de exemplu, articolul pe care dorim să îl afișăm nu există în baza de date, vom arunca eroarea 404 folosind metoda `error(?string $message = null, int $httpCode = 404)`, care reprezintă eroarea HTTP 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ Redirecționarea nu are loc cu o cerere AJAX sau POST, deoarece ar duce la pierd
De asemenea, puteți invoca manual canonizarea folosind metoda `canonicalize()`, care, ca și metoda `link()`, primește ca argumente prezentatorul, acțiunile și parametrii. Aceasta creează o legătură și o compară cu URL-ul curent. Dacă este diferit, redirecționează către link-ul generat.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// redirecționează dacă $slug este diferit de $realSlug
diff --git a/application/ru/ajax.texy b/application/ru/ajax.texy
index bed9143e1e..ffcb026607 100644
--- a/application/ru/ajax.texy
+++ b/application/ru/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Сначала нужно [инициализировать |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] библиотеку:
+
+```js
+naja.initialize();
+```
+
Чтобы превратить обычную ссылку (сигнал) или отправку формы в AJAX-запрос, достаточно пометить соответствующую ссылку, форму или кнопку классом `ajax`:
```html
diff --git a/application/ru/bootstrap.texy b/application/ru/bootstrap.texy
index a0036cf7a1..82e18f8d6b 100644
--- a/application/ru/bootstrap.texy
+++ b/application/ru/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Конфигуратор отвечает за настройку среды и служб приложения.
+ $this->configurator = new Configurator;
+ // Задайте директорию для временных файлов, создаваемых Nette (например, скомпилированных шаблонов).
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette умный, и режим разработки включается автоматически,
+ // или вы можете включить его для определенного IP-адреса, откомментировав следующую строку:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Включает Tracy: основной инструмент отладки в виде "армейского ножа".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: автозагрузка всех классов в заданной директории
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Загрузка конфигурационных файлов
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php
=========
-В случае веб-приложений начальным файлом является `index.php`, который находится в общедоступном каталоге `www/`. Он позволяет классу `Bootstrap` инициализировать среду и возвращает `$configurator`, который создает контейнер DI. Затем он получает сервис `Application`, запускающий веб-приложение:
+Начальным файлом для веб-приложений является `index.php`, расположенный в публичной директории `www/`. Он использует класс `Bootstrap` для инициализации среды и создания контейнера DI. Затем он получает из контейнера службу `Application`, которая запускает веб-приложение:
```php
-// инициализируем среду + получаем объект Configurator
-$configurator = App\Bootstrap::boot();
-// создаем DI-контейнер
-$container = $configurator->createContainer();
-// DI-контейнер создайет объект Nette\Application\Application
+$bootstrap = new App\Bootstrap;
+// Инициализация среды + создание DI-контейнера
+$container = $bootstrap->bootWebApplication();
+// DI-контейнер создает объект Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// запускаем приложение Nette
+// Запуск приложения Nette и обработка входящего запроса
$application->run();
```
@@ -66,19 +91,19 @@ Nette различает два основных режима, в которых
Если вы хотите включить режим разработки в других случаях, например, для программистов, получающих доступ с определенного IP-адреса, вы можете использовать `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // один или более IP-адресов
+$this->configurator->setDebugMode('23.75.345.200'); // один или более IP-адресов
```
Мы определенно рекомендуем сочетать IP-адрес с файлом cookie. Мы будем хранить секретный токен в cookie `nette-debug', например, `secret1234`, и режим разработки будет активирован для программистов с такой комбинацией IP и cookie.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Можно полностью отключить режим разработчика, даже для localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Обратите внимание, что значение `true` жестко включает режим разработчика, чего никогда не должно происходить на рабочем сервере.
@@ -90,7 +115,7 @@ $configurator->setDebugMode(false);
Для облегчения отладки мы включим замечательный инструмент [Tracy |tracy:]. В режиме разработчика он визуализирует ошибки, а в режиме производства — записывает ошибки в указанный каталог:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ $configurator->enableTracy($rootDir . '/log');
Nette использует кэш для DI-контейнера, RobotLoader, шаблонов и т. д. Поэтому необходимо задать путь к директории, где будет храниться кэш:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
В Linux или macOS установите [права на запись |nette:troubleshooting#Setting-Directory-Permissions] для каталогов `log/` и `temp/`.
@@ -112,7 +137,7 @@ RobotLoader
Обычно мы хотим автоматически загружать классы с помощью [RobotLoader |robot-loader:], поэтому мы должны запустить его и позволить ему загрузить классы из каталога, в котором находится `Bootstrap.php` (т. е. `__DIR__`) и все его подкаталоги:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ $configurator->createRobotLoader()
Configurator позволяет указать часовой пояс для вашего приложения.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ $configurator->setTimeZone('Europe/Prague');
Файлы конфигурации загружаются с помощью `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Метод `addConfig()` может быть вызван несколько раз для добавления нескольких файлов.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ if (PHP_SAPI === 'cli') {
Параметры, используемые в файлах конфигурации, могут быть определены [в секции `parameters`|dependency-injection:configuration#parameters] и подхвачены (или перезаписаны) методом `addStaticParameters()` (у него есть алиас `addParameters()`). Важно, что разные значения параметров вызывают генерацию дополнительных DI-контейнеров, то есть дополнительных классов.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ $configurator->addStaticParameters([
Можно также добавить динамические параметры в контейнер. Их разные значения, в отличие от статических параметров, не приведут к генерации новых DI-контейнеров.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Переменные среды могут быть легко доступны с использованием динамических параметров. Мы можем получить доступ к ним через `%env.variable%` в файлах конфигурации.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Создаём новый экземпляр и вставляем его в Bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Разные среды .[#toc-different-environments]
===========================================
-Не стесняйтесь настроить класс `Bootstrap` в соответствии с вашими потребностями. Вы можете добавлять параметры в метод `boot()` для разделения веб-проектов, или добавлять другие методы, такие как `bootForTests()`, которые инициализируют среду для модульных тестов, `bootForCli()` для скриптов, вызываемых из командной строки, и так далее.
+Не стесняйтесь настраивать класс `Bootstrap` в соответствии с вашими потребностями. Вы можете добавить параметры в метод `bootWebApplication()`, чтобы различать веб-проекты. Также можно добавить другие методы, например `bootTestEnvironment()` для инициализации окружения для модульных тестов, `bootConsoleApplication()` для скриптов, вызываемых из командной строки, и так далее.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Инициализация тестера Nette Tester
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // Инициализация Nette Tester
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/ru/components.texy b/application/ru/components.texy
index 9c9fa01111..31c39481d0 100644
--- a/application/ru/components.texy
+++ b/application/ru/components.texy
@@ -230,6 +230,28 @@ $this->redirect(/* ... */); // делаем редирект
```
+Перенаправление после сигнала .[#toc-redirection-after-a-signal]
+================================================================
+
+После обработки сигнала компонента часто следует перенаправление. Эта ситуация похожа на ситуацию с формами - после отправки формы мы также делаем перенаправление, чтобы предотвратить повторную отправку данных при обновлении страницы в браузере.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Поскольку компонент - это многократно используемый элемент и обычно не должен иметь прямой зависимости от конкретных презентаторов, методы `redirect()` и `link()` автоматически интерпретируют параметр как сигнал компонента:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Если вам нужно перенаправить на другого ведущего или действие, вы можете сделать это через ведущего:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Постоянные параметры .[#toc-persistent-parameters]
==================================================
diff --git a/application/ru/presenters.texy b/application/ru/presenters.texy
index e2341e5446..ac48e3a344 100644
--- a/application/ru/presenters.texy
+++ b/application/ru/presenters.texy
@@ -60,7 +60,7 @@ class ArticlePresenter extends Nette\Application\UI\Presenter
Важно, что `action()` вызывается перед `render()`, поэтому внутри него мы можем, возможно, изменить следующий ход жизненного цикла, т. е. изменить шаблон, который будет отображаться, а также метод `render()`, который будет вызываться, используя `setView('otherView')`.
-В метод передаются параметры из запроса. Можно и рекомендуется указывать типы для параметров, например `actionShow(int $id, string $slug = null)` — если параметр `id` отсутствует или если он не является целым числом, презентер возвращает [ошибку 404|#Error-404-etc] и завершает операцию.
+В метод передаются параметры из запроса. Можно и рекомендуется указывать типы для параметров, например `actionShow(int $id, ?string $slug = null)` — если параметр `id` отсутствует или если он не является целым числом, презентер возвращает [ошибку 404|#Error-404-etc] и завершает операцию.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ $this->redirect(/* ... */);
Ошибка 404 и т. д. .[#toc-error-404-etc]
========================================
-Когда мы не можем выполнить запрос, потому что, например, статья, которую мы хотим отобразить, не существует в базе данных, мы выбросим ошибку 404, используя метод `error(string $message = null, int $httpCode = 404)`, который представляет HTTP-ошибку 404:
+Когда мы не можем выполнить запрос, потому что, например, статья, которую мы хотим отобразить, не существует в базе данных, мы выбросим ошибку 404, используя метод `error(?string $message = null, int $httpCode = 404)`, который представляет HTTP-ошибку 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ class ProductPresenter extends Nette\Application\UI\Presenter
Вы также можете вызвать канонизацию вручную с помощью метода `canonicalize()`, который, как и метод `link()`, получает в качестве аргументов презентера, действия и параметры. Он создает ссылку и сравнивает её с текущим URL. Если они отличаются, то происходит перенаправление на сгенерированную ссылку.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// перенаправляет, если $slug отличается от $realSlug
diff --git a/application/sl/ajax.texy b/application/sl/ajax.texy
index bfbc97906b..320e94b27c 100644
--- a/application/sl/ajax.texy
+++ b/application/sl/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Najprej morate knjižnico [inicializirati |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization]:
+
+```js
+naja.initialize();
+```
+
Če želite, da običajna povezava (signal) ali oddaja obrazca postane zahteva AJAX, preprosto označite ustrezno povezavo, obrazec ali gumb z razredom `ajax`:
```html
diff --git a/application/sl/bootstrap.texy b/application/sl/bootstrap.texy
index 81ef42aa3d..33f36e50e8 100644
--- a/application/sl/bootstrap.texy
+++ b/application/sl/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Konfigurator je odgovoren za nastavitev okolja aplikacije in storitev.
+ $this->configurator = new Configurator;
+ // Nastavite imenik za začasne datoteke, ki jih ustvari Nette (npr. sestavljene predloge).
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Program Nette je pameten in razvojni način se vklopi samodejno,
+ // lahko pa ga za določen naslov IP omogočite tako, da odkomentirate naslednjo vrstico:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Omogoči Tracy: najboljše orodje za razhroščevanje "švicarskega noža".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: samodejno naloži vse razrede v danem imeniku
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Nalaganje konfiguracijskih datotek
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-Pri spletnih aplikacijah je začetna datoteka `index.php`, ki se nahaja v javnem imeniku `www/`. Omogoča, da razred `Bootstrap` inicializira okolje in vrne `$configurator`, ki ustvari vsebnik DI. Nato pridobi storitev `Application`, ki izvaja spletno aplikacijo:
+Začetna datoteka za spletne aplikacije je `index.php`, ki se nahaja v javnem imeniku `www/`. Uporablja razred `Bootstrap` za inicializacijo okolja in ustvarjanje vsebnika DI. Nato iz vsebnika pridobi storitev `Application`, ki zažene spletno aplikacijo:
```php
-// inicializacija okolja + pridobitev predmeta Configurator
-$configurator = App\Bootstrap::boot();
-// ustvarite vsebnik DI
-$container = $configurator->createContainer();
+$bootstrap = new App\Bootstrap;
+// Inicializacija okolja + ustvarjanje vsebnika DI
+$container = $bootstrap->bootWebApplication();
// vsebnik DI ustvari objekt Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// zaženite aplikacijo Nette
+// Zagnati aplikacijo Nette in obdelati vhodno zahtevo
$application->run();
```
@@ -66,19 +91,19 @@ Izbira načina poteka s samodejnim zaznavanjem, zato običajno ni treba ničesar
Če želite omogočiti razvojni način v drugih primerih, na primer za programerje, ki dostopajo z določenega naslova IP, lahko uporabite `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // enega ali več naslovov IP.
+$this->configurator->setDebugMode('23.75.345.200'); // enega ali več naslovov IP.
```
Vsekakor priporočamo kombinacijo naslova IP s piškotkom. V piškotek `nette-debug` bomo shranili tajni žeton, npr. `secret1234`, razvojni način pa bo aktiviran za programerje s to kombinacijo IP in piškotka.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Razvojni način lahko tudi popolnoma izklopimo, tudi za lokalni gostitelj:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Vrednost `true` vklopi način za razvijalce, kar se na produkcijskem strežniku ne bi smelo zgoditi.
@@ -90,7 +115,7 @@ Orodje za razhroščevanje Tracy .[#toc-debugging-tool-tracy]
Za lažje razhroščevanje bomo vklopili odlično orodje [Tracy |tracy:]. V načinu za razvijalce vizualizira napake, v produkcijskem načinu pa napake beleži v določen imenik:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Začasne datoteke .[#toc-temporary-files]
Nette uporablja predpomnilnik za vsebnik DI, RobotLoader, predloge itd. Zato je treba nastaviti pot do imenika, v katerem bo shranjen predpomnilnik:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
V operacijskem sistemu Linux ali macOS nastavite [dovoljenja za pisanje za |nette:troubleshooting#Setting directory permissions] imenike `log/` in `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Običajno bomo želeli samodejno naložiti razrede z [RobotLoaderjem |robot-loader:], zato ga moramo zagnati in mu omogočiti, da naloži razrede iz imenika, kjer se nahaja `Bootstrap.php` (tj. `__DIR__`), in vseh njegovih podimenikov:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Druga možnost je, da uporabimo samo samodejno nalaganje [Composer |best-practic
Configurator vam omogoča, da določite časovni pas za svojo aplikacijo.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ V razvojnem načinu se vsebnik samodejno posodobi vsakič, ko spremenite kodo al
Konfiguracijske datoteke se naložijo z uporabo `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Metodo `addConfig()` lahko za dodajanje več datotek pokličete večkrat.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Statični parametri .[#toc-static-parameters]
Parametre, ki se uporabljajo v konfiguracijskih datotekah, je mogoče opredeliti [v razdelku `parameters` |dependency-injection:configuration#parameters] in jih tudi posredovati (ali prepisati) z metodo `addStaticParameters()` (ima vzdevek `addParameters()`). Pomembno je, da različne vrednosti parametrov povzročijo generiranje dodatnih vsebnikov DI, tj. dodatnih razredov.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Dinamični parametri .[#toc-dynamic-parameters]
Kontejnerju lahko dodamo tudi dinamične parametre, katerih različne vrednosti za razliko od statičnih parametrov ne bodo povzročile generiranja novih DI kontejnerjev.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Spremenljivke okolja bi lahko preprosto dali na voljo z dinamičnimi parametri. Do njih lahko dostopamo prek spletne strani `%env.variable%` v konfiguracijskih datotekah.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Ustvarite nov primerek in ga vstavite v bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Različna okolja .[#toc-different-environments]
==============================================
-Razred `Bootstrap` lahko prilagodite svojim potrebam. Metodi `boot()` lahko dodate parametre za razlikovanje med spletnimi projekti ali dodate druge metode, kot so `bootForTests()`, ki inicializira okolje za teste enote, `bootForCli()` za skripte, ki se kličejo iz ukazne vrstice, in tako naprej.
+Ne oklevajte, če želite razred `Bootstrap` prilagoditi svojim potrebam. Metodi `bootWebApplication()` lahko dodate parametre za razlikovanje med spletnimi projekti. Lahko pa dodate tudi druge metode, na primer `bootTestEnvironment()` za inicializacijo okolja za teste enote, `bootConsoleApplication()` za skripte, ki se kličejo iz ukazne vrstice, in tako naprej.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
{
- $configurator = self::boot();
Tester\Environment::setup(); // Inicializacija Nette Testerja
- return $configurator;
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
+{
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/sl/components.texy b/application/sl/components.texy
index dd8ce1e37d..344d660993 100644
--- a/application/sl/components.texy
+++ b/application/sl/components.texy
@@ -230,6 +230,28 @@ V predlogi so ta sporočila na voljo v spremenljivki `$flashes` kot objekti `std
```
+Preusmeritev po signalu .[#toc-redirection-after-a-signal]
+==========================================================
+
+Po obdelavi signala komponente pogosto sledi preusmeritev. Ta situacija je podobna obrazcem - po oddaji obrazca prav tako preusmerimo, da preprečimo ponovno oddajo podatkov ob osvežitvi strani v brskalniku.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Ker je komponenta element za večkratno uporabo in običajno ne sme biti neposredno odvisna od določenih predstavnikov, metodi `redirect()` in `link()` samodejno interpretirata parameter kot signal komponente:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Če želite preusmeriti na drug predstavnik ali dejanje, lahko to storite prek predstavnika:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Trajni parametri .[#toc-persistent-parameters]
==============================================
diff --git a/application/sl/presenters.texy b/application/sl/presenters.texy
index b5b538b2a2..1f1e6b993b 100644
--- a/application/sl/presenters.texy
+++ b/application/sl/presenters.texy
@@ -60,7 +60,7 @@ Podobno kot pri metodi `render()`. Medtem ko `render()` je namenjena
Pomembno je, da `action()` se pokliče pred `render()`, tako da lahko znotraj njega morebiti spremenimo naslednji potek življenjskega cikla, tj. spremenimo predlogo, ki se bo izrisala, in tudi metodo `render()` ki bo poklicana, z uporabo `setView('otherView')`.
-Parametri iz zahteve se posredujejo metodi. Za parametre je mogoče in priporočljivo določiti tipe, npr. `actionShow(int $id, string $slug = null)` - če parameter `id` manjka ali če ni celo število, predstavnik vrne [napako 404 |#Error 404 etc.] in zaključi operacijo.
+Parametri iz zahteve se posredujejo metodi. Za parametre je mogoče in priporočljivo določiti tipe, npr. `actionShow(int $id, ?string $slug = null)` - če parameter `id` manjka ali če ni celo število, predstavnik vrne [napako 404 |#Error 404 etc.] in zaključi operacijo.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ V predlogi so ta sporočila na voljo v spremenljivki `$flashes` kot objekti `std
Napaka 404 itd. .[#toc-error-404-etc]
=====================================
-Kadar ne moremo izpolniti zahteve, ker na primer članek, ki ga želimo prikazati, ne obstaja v zbirki podatkov, bomo z metodo `error(string $message = null, int $httpCode = 404)`, ki predstavlja napako HTTP 404, vrgli napako 404:
+Kadar ne moremo izpolniti zahteve, ker na primer članek, ki ga želimo prikazati, ne obstaja v zbirki podatkov, bomo z metodo `error(?string $message = null, int $httpCode = 404)`, ki predstavlja napako HTTP 404, vrgli napako 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ Preusmeritev se ne izvede pri zahtevi AJAX ali POST, ker bi povzročila izgubo p
Kanonizacijo lahko sprožite tudi ročno z metodo `canonicalize()`, ki tako kot metoda `link()` kot argumente prejme predstavnika, dejanja in parametre. Ustvari povezavo in jo primerja s trenutnim naslovom URL. Če se razlikuje, preusmeri na ustvarjeno povezavo.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// preusmeri, če se $slug razlikuje od $realSlug
diff --git a/application/tr/ajax.texy b/application/tr/ajax.texy
index 05804fd81c..007283e44d 100644
--- a/application/tr/ajax.texy
+++ b/application/tr/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Öncelikle kütüphaneyi [başlatmanız |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] gerekir:
+
+```js
+naja.initialize();
+```
+
Sıradan bir bağlantıyı (sinyal) veya form gönderimini AJAX isteği haline getirmek için ilgili bağlantıyı, formu veya düğmeyi `ajax` sınıfıyla işaretlemeniz yeterlidir:
```html
diff --git a/application/tr/bootstrap.texy b/application/tr/bootstrap.texy
index 89a829e55b..1513e7fe3a 100644
--- a/application/tr/bootstrap.texy
+++ b/application/tr/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Yapılandırıcı, uygulama ortamını ve hizmetlerini ayarlamaktan sorumludur.
+ $this->configurator = new Configurator;
+ // Nette tarafından oluşturulan geçici dosyalar için dizini ayarlayın (örn. derlenmiş şablonlar)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette akıllıdır ve geliştirme modu otomatik olarak açılır,
+ // ya da aşağıdaki satırın yorumunu kaldırarak belirli bir IP adresi için etkinleştirebilirsiniz:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Tracy'yi etkinleştirir: nihai "İsviçre çakısı" hata ayıklama aracı.
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: verilen dizindeki tüm sınıfları otomatik yükler
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Yapılandırma dosyalarını yükle
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-Web uygulamaları söz konusu olduğunda, başlangıç dosyası `index.php` olup `www/` genel dizininde bulunur. Ortamı başlatmak için `Bootstrap` sınıfına izin verir ve DI konteynerini oluşturan `$configurator` sınıfını döndürür. Daha sonra web uygulamasını çalıştıran `Application` hizmetini elde eder:
+Web uygulamaları için başlangıç dosyası `index.php`, `www/` genel dizininde bulunur. Ortamı başlatmak ve bir DI konteyneri oluşturmak için `Bootstrap` sınıfını kullanır. Ardından, web uygulamasını başlatan kapsayıcıdan `Application` hizmetini alır:
```php
-// ortamı başlat + Configurator nesnesini al
-$configurator = App\Bootstrap::boot();
-// bir DI konteyneri oluşturun
-$container = $configurator->createContainer();
-// DI container bir Nette\Application\Application nesnesi oluşturur
+$bootstrap = new App\Bootstrap;
+// Ortamı başlatma + bir DI konteyneri oluşturma
+$container = $bootstrap->bootWebApplication();
+// DI konteyneri bir Nette\Application\Application nesnesi oluşturur
$application = $container->getByType(Nette\Application\Application::class);
-// Nette uygulamasını başlat
+// Nette uygulamasını başlatın ve gelen isteği işleyin
$application->run();
```
@@ -66,19 +91,19 @@ Mod seçimi otomatik algılama ile yapılır, bu nedenle genellikle herhangi bir
Geliştirme modunu diğer durumlarda, örneğin belirli bir IP adresinden erişen programcılar için etkinleştirmek istiyorsanız, `setDebugMode()` adresini kullanabilirsiniz:
```php
-$configurator->setDebugMode('23.75.345.200'); // bir veya daha fazla IP adresi
+$this->configurator->setDebugMode('23.75.345.200'); // bir veya daha fazla IP adresi
```
Bir IP adresini bir çerezle birleştirmenizi kesinlikle öneririz. `nette-debug` çerezine gizli bir belirteç depolayacağız, örneğin `secret1234` ve geliştirme modu, bu IP ve çerez kombinasyonuna sahip programcılar için etkinleştirilecektir.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Ayrıca localhost için bile geliştirici modunu tamamen kapatabiliriz:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
`true` değerinin, bir üretim sunucusunda asla gerçekleşmemesi gereken geliştirici modunu zorlayarak açtığını unutmayın.
@@ -90,7 +115,7 @@ Hata Ayıklama Aracı Tracy .[#toc-debugging-tool-tracy]
Kolay hata ayıklama için harika araç [Tracy'yi |tracy:] açacağız. Geliştirici modunda hataları görselleştirir ve üretim modunda hataları belirtilen dizine kaydeder:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ Geçici Dosyalar .[#toc-temporary-files]
Nette, DI konteyneri, RobotLoader, şablonlar vb. için önbelleği kullanır. Bu nedenle, önbelleğin depolanacağı dizinin yolunu ayarlamak gerekir:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
Linux veya macOS üzerinde, `log/` ve `temp/` dizinleri için [yazma izinlerini |nette:troubleshooting#Setting directory permissions] ayarlayın.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Genellikle, [RobotLoader'ı |robot-loader:] kullanarak sınıfları otomatik olarak yüklemek isteyeceğiz, bu yüzden onu başlatmalı ve `Bootstrap.php` 'un bulunduğu dizinden (yani `__DIR__`) ve tüm alt dizinlerinden sınıfları yüklemesine izin vermeliyiz:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ Zaman Dilimi .[#toc-timezone]
Yapılandırıcı, uygulamanız için bir saat dilimi belirlemenize olanak tanır.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ Geliştirme modunda, kodu veya yapılandırma dosyalarını her değiştirdiğin
Yapılandırma dosyaları `addConfig()` kullanılarak yüklenir:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Birden fazla dosya eklemek için `addConfig()` yöntemi birden fazla kez çağrılabilir.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ Statik Parametreler .[#toc-static-parameters]
Yapılandırma dosyalarında kullanılan parametreler [`parameters` bölümünde |dependency-injection:configuration#parameters] tanımlanabilir ve ayrıca `addStaticParameters()` yöntemi ( `addParameters()` takma adı vardır) tarafından geçirilebilir (veya üzerine yazılabilir). Farklı parametre değerlerinin ek DI konteynerlerinin, yani ek sınıfların oluşturulmasına neden olması önemlidir.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ Dinamik Parametreler .[#toc-dynamic-parameters]
Konteynere dinamik parametreler de ekleyebiliriz, statik parametrelerin aksine farklı değerleri yeni DI konteynerlerinin oluşturulmasına neden olmaz.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Ortam değişkenleri dinamik parametreler kullanılarak kolayca kullanılabilir hale getirilebilir. Bunlara yapılandırma dosyalarındaki `%env.variable%` adresinden erişebiliriz.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Yeni bir örnek oluşturun ve bootstrap'e ekleyin:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Farklı Ortamlar .[#toc-different-environments]
==============================================
-`Bootstrap` sınıfını ihtiyaçlarınıza göre özelleştirmekten çekinmeyin. Web projelerini farklılaştırmak için `boot()` yöntemine parametreler ekleyebilir veya birim testleri için ortamı başlatan `bootForTests()`, komut satırından çağrılan komut dosyaları için `bootForCli()` gibi başka yöntemler ekleyebilirsiniz.
+ `Bootstrap` sınıfını ihtiyaçlarınıza göre özelleştirmekten çekinmeyin. Web projeleri arasında ayrım yapmak için `bootWebApplication()` yöntemine parametreler ekleyebilirsiniz. Alternatif olarak, birim testleri için ortamı başlatmak üzere `bootTestEnvironment()`, komut satırından çağrılan betikler için `bootConsoleApplication()` gibi başka yöntemler de ekleyebilirsiniz.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Nette Tester başlatma
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // Nette Tester initialization
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/tr/components.texy b/application/tr/components.texy
index 5e1c447262..cae382b8da 100644
--- a/application/tr/components.texy
+++ b/application/tr/components.texy
@@ -230,6 +230,28 @@ $this->redirect(/* ... */); // ve yeniden yönlendir
```
+Sinyalden Sonra Yeniden Yönlendirme .[#toc-redirection-after-a-signal]
+======================================================================
+
+Bir bileşen sinyali işlendikten sonra genellikle yeniden yönlendirme yapılır. Bu durum formlara benzer - bir form gönderildikten sonra, sayfa tarayıcıda yenilendiğinde verilerin yeniden gönderilmesini önlemek için de yönlendirme yaparız.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Bir bileşen yeniden kullanılabilir bir öğe olduğundan ve genellikle belirli sunuculara doğrudan bağımlı olmaması gerektiğinden, `redirect()` ve `link()` yöntemleri parametreyi otomatik olarak bir bileşen sinyali olarak yorumlar:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Farklı bir sunum yapan kişiye veya eyleme yönlendirmeniz gerekiyorsa, bunu sunum yapan kişi aracılığıyla yapabilirsiniz:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Kalıcı Parametreler .[#toc-persistent-parameters]
=================================================
diff --git a/application/tr/presenters.texy b/application/tr/presenters.texy
index 7c862b57b1..78a564da6d 100644
--- a/application/tr/presenters.texy
+++ b/application/tr/presenters.texy
@@ -60,7 +60,7 @@ Yönteme benzer şekilde `render()`. O sırada `render()` 'de daha s
Bu önemlidir `action()` daha önce çağrılır `render()`Bu nedenle, içinde muhtemelen yaşam döngüsünün bir sonraki seyrini değiştirebiliriz, yani oluşturulacak şablonu ve ayrıca yöntemi değiştirebiliriz `render()` `setView('otherView')` kullanılarak çağrılacaktır.
-İstekten gelen parametreler yönteme aktarılır. Parametreler için tür belirtmek mümkündür ve önerilir, örneğin `actionShow(int $id, string $slug = null)` - `id` parametresi eksikse veya tamsayı değilse, sunum yapan kişi [404 hatası |#Error 404 etc.] döndürür ve işlemi sonlandırır.
+İstekten gelen parametreler yönteme aktarılır. Parametreler için tür belirtmek mümkündür ve önerilir, örneğin `actionShow(int $id, ?string $slug = null)` - `id` parametresi eksikse veya tamsayı değilse, sunum yapan kişi [404 hatası |#Error 404 etc.] döndürür ve işlemi sonlandırır.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ $this->redirect(/* ... */);
Hata 404 vb. .[#toc-error-404-etc]
==================================
-Örneğin görüntülemek istediğimiz makale veritabanında bulunmadığı için isteği yerine getiremediğimizde, HTTP hatası 404'ü temsil eden `error(string $message = null, int $httpCode = 404)` yöntemini kullanarak 404 hatasını atacağız:
+Örneğin görüntülemek istediğimiz makale veritabanında bulunmadığı için isteği yerine getiremediğimizde, HTTP hatası 404'ü temsil eden `error(?string $message = null, int $httpCode = 404)` yöntemini kullanarak 404 hatasını atacağız:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ Yeniden yönlendirme bir AJAX veya POST isteği ile gerçekleşmez çünkü veri
Ayrıca, `link()` yöntemi gibi sunum yapan kişiyi, eylemleri ve parametreleri bağımsız değişken olarak alan `canonicalize()` yöntemini kullanarak kanonlaştırmayı manuel olarak da çağırabilirsiniz. Bir bağlantı oluşturur ve bunu geçerli URL ile karşılaştırır. Farklıysa, oluşturulan bağlantıya yönlendirir.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// eğer $slug, $realSlug'dan farklıysa yönlendirir
diff --git a/application/uk/ajax.texy b/application/uk/ajax.texy
index b6d0aac241..9a6e49c71c 100644
--- a/application/uk/ajax.texy
+++ b/application/uk/ajax.texy
@@ -77,6 +77,12 @@ npm install naja
```
+Спочатку потрібно [ініціалізувати |https://naja.js.org/#/guide/01-install-setup-naja?id=initialization] бібліотеку:
+
+```js
+naja.initialize();
+```
+
Щоб зробити звичайне посилання (сигнал) або відправку форми AJAX-запитом, просто позначте відповідне посилання, форму або кнопку класом `ajax`:
```html
diff --git a/application/uk/bootstrap.texy b/application/uk/bootstrap.texy
index fa1a842ec0..aef63e390f 100644
--- a/application/uk/bootstrap.texy
+++ b/application/uk/bootstrap.texy
@@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator;
class Bootstrap
{
- public static function boot(): Configurator
+ private Configurator $configurator;
+ private string $rootDir;
+
+ public function __construct()
+ {
+ $this->rootDir = dirname(__DIR__);
+ // Конфігуратор відповідає за налаштування середовища та служб програми.
+ $this->configurator = new Configurator;
+ // Встановіть каталог для тимчасових файлів, що генеруються Nette (наприклад, скомпільовані шаблони)
+ $this->configurator->setTempDirectory($this->rootDir . '/temp');
+ }
+
+ public function bootWebApplication(): Nette\DI\Container
{
- $rootDir = dirname(__DIR__);
- $configurator = new Configurator;
- //$configurator->setDebugMode('secret@23.75.345.200');
- $configurator->enableTracy($rootDir . '/log');
- $configurator->setTempDirectory($rootDir . '/temp');
- $configurator->createRobotLoader()
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+ }
+
+ private function initializeEnvironment(): void
+ {
+ // Nette розумний, і режим розробки вмикається автоматично,
+ // або ви можете увімкнути його для певної IP-адреси, не коментуючи наступний рядок:
+ // $this->configurator->setDebugMode('secret@23.75.345.200');
+
+ // Вмикає Tracy: найкращий інструмент налагодження "швейцарський армійський ніж".
+ $this->configurator->enableTracy($this->rootDir . '/log');
+
+ // RobotLoader: автозавантаження всіх класів у вказаному каталозі
+ $this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
- $configurator->addConfig($rootDir . '/config/common.neon');
- return $configurator;
+ }
+
+ private function setupContainer(): void
+ {
+ // Завантажити конфігураційні файли
+ $this->configurator->addConfig($this->rootDir . '/config/common.neon');
}
}
```
@@ -40,16 +66,15 @@ class Bootstrap
index.php .[#toc-index-php]
===========================
-У випадку веб-додатків початковим файлом є `index.php`, який знаходиться у загальнодоступному каталозі `www/`. Він дозволяє класу `Bootstrap` ініціалізувати середовище і повертає `$configurator`, який створює контейнер DI. Потім він отримує сервіс `Application`, який запускає веб-додаток:
+Початковим файлом для веб-додатків є `index.php`, розташований у загальнодоступному каталозі `www/`. Він використовує клас `Bootstrap` для ініціалізації середовища і створення DI-контейнера. Потім він отримує сервіс `Application` з контейнера, який запускає веб-додаток:
```php
-// ініціалізуємо середовище + отримуємо об'єкт Configurator
-$configurator = App\Bootstrap::boot();
-// створюємо DI-контейнер
-$container = $configurator->createContainer();
-// DI-контейнер створює об'єкт Nette\Application\Application
+$bootstrap = new App\Bootstrap;
+// Ініціалізація середовища + створення контейнера DI
+$container = $bootstrap->bootWebApplication();
+// Контейнер DI створює об'єкт Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
-// запускаємо додаток Nette
+// Запустіть додаток Nette та обробіть вхідний запит
$application->run();
```
@@ -66,19 +91,19 @@ Nette розрізняє два основні режими, в яких вик
Якщо ви хочете ввімкнути режим розробки в інших випадках, наприклад, для програмістів, які отримують доступ з певної IP-адреси, ви можете використовувати `setDebugMode()`:
```php
-$configurator->setDebugMode('23.75.345.200'); // одна або більше IP-адрес
+$this->configurator->setDebugMode('23.75.345.200'); // одна або більше IP-адрес
```
Ми безумовно рекомендуємо поєднувати IP-адресу з файлом cookie. Ми зберігатимемо секретний токен у cookie `nette-debug', например, `secret1234`, і режим розробки буде активовано для програмістів із такою комбінацією IP і cookie.
```php
-$configurator->setDebugMode('secret1234@23.75.345.200');
+$this->configurator->setDebugMode('secret1234@23.75.345.200');
```
Можна повністю вимкнути режим розробника, навіть для localhost:
```php
-$configurator->setDebugMode(false);
+$this->configurator->setDebugMode(false);
```
Зверніть увагу, що значення `true` жорстко вмикає режим розробника, чого ніколи не повинно відбуватися на робочому сервері.
@@ -90,7 +115,7 @@ $configurator->setDebugMode(false);
Для полегшення налагодження ми увімкнемо чудовий інструмент [Tracy |tracy:]. У режимі розробника він візуалізує помилки, а в режимі виробництва - записує помилки в зазначений каталог:
```php
-$configurator->enableTracy($rootDir . '/log');
+$this->configurator->enableTracy($this->rootDir . '/log');
```
@@ -100,7 +125,7 @@ $configurator->enableTracy($rootDir . '/log');
Nette використовує кеш для DI-контейнера, RobotLoader, шаблонів тощо. Тому необхідно задати шлях до директорії, де зберігатиметься кеш:
```php
-$configurator->setTempDirectory($rootDir . '/temp');
+$this->configurator->setTempDirectory($this->rootDir . '/temp');
```
У Linux або macOS встановіть [права на запис |nette:troubleshooting#Setting-Directory-Permissions] для каталогів `log/` і `temp/`.
@@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader]
Зазвичай ми хочемо автоматично завантажувати класи за допомогою [RobotLoader |robot-loader:], тому ми повинні запустити його і дозволити йому завантажити класи з каталогу, в якому знаходиться `Bootstrap.php` (тобто `__DIR__`) і всі його підкаталоги:
```php
-$configurator->createRobotLoader()
+$this->configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();
```
@@ -126,7 +151,7 @@ $configurator->createRobotLoader()
Configurator дає змогу вказати часовий пояс для вашого застосунку.
```php
-$configurator->setTimeZone('Europe/Prague');
+$this->configurator->setTimeZone('Europe/Prague');
```
@@ -143,16 +168,17 @@ $configurator->setTimeZone('Europe/Prague');
Файли конфігурації завантажуються за допомогою `addConfig()`:
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
+$this->configurator->addConfig($this->rootDir . '/config/common.neon');
```
Метод `addConfig()` може бути викликаний кілька разів для додавання декількох файлів.
```php
-$configurator->addConfig($rootDir . '/config/common.neon');
-$configurator->addConfig($rootDir . '/config/services.neon');
+$configDir = $this->rootDir . '/config';
+$this->configurator->addConfig($configDir . '/common.neon');
+$this->configurator->addConfig($configDir . '/services.neon');
if (PHP_SAPI === 'cli') {
- $configurator->addConfig($rootDir . '/config/cli.php');
+ $this->configurator->addConfig($configDir . '/cli.php');
}
```
@@ -169,7 +195,7 @@ if (PHP_SAPI === 'cli') {
Параметри, що використовуються у файлах конфігурації, можуть бути визначені [в секції `parameters` |dependency-injection:configuration#parameters] і підхоплені (або перезаписані) методом `addStaticParameters()` (у нього є аліас `addParameters()`). Важливо, що різні значення параметрів викликають генерацію додаткових DI-контейнерів, тобто додаткових класів.
```php
-$configurator->addStaticParameters([
+$this->configurator->addStaticParameters([
'projectId' => 23,
]);
```
@@ -183,7 +209,7 @@ $configurator->addStaticParameters([
Можна також додати динамічні параметри в контейнер. Їхні різні значення, на відміну від статичних параметрів, не призведуть до генерації нових DI-контейнерів.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```
@@ -191,7 +217,7 @@ $configurator->addDynamicParameters([
Змінні середовища можуть бути легко доступні з використанням динамічних параметрів. Ми можемо отримати доступ до них через `%env.variable%` у файлах конфігурації.
```php
-$configurator->addDynamicParameters([
+$this->configurator->addDynamicParameters([
'env' => getenv(),
]);
```
@@ -226,7 +252,7 @@ services:
Створюємо новий екземпляр і вставляємо його в Bootstrap:
```php
-$configurator->addServices([
+$this->configurator->addServices([
'myservice' => new App\Model\MyCustomService('foobar'),
]);
```
@@ -235,13 +261,21 @@ $configurator->addServices([
Різні середовища .[#toc-different-environments]
===============================================
-Не соромтеся налаштувати клас `Bootstrap` відповідно до ваших потреб. Ви можете додавати параметри до методу `boot()` для розділення веб-проєктів, або додавати інші методи, як-от `bootForTests()`, які ініціалізують середовище для модульних тестів, `bootForCli()` для скриптів, що викликаються з командного рядка, і так далі.
+Не соромтеся налаштовувати клас `Bootstrap` відповідно до ваших потреб. Ви можете додати параметри до методу `bootWebApplication()`, щоб розрізняти веб-проекти. Крім того, ви можете додати інші методи, такі як `bootTestEnvironment()` для ініціалізації середовища для модульних тестів, `bootConsoleApplication()` для скриптів, що викликаються з командного рядка, і так далі.
```php
-public static function bootForTests(): Configurator
+public function bootTestEnvironment(): Nette\DI\Container
+{
+ Tester\Environment::setup(); // Ініціалізація Nette Tester
+ $this->setupContainer();
+ return $this->configurator->createContainer();
+}
+
+public function bootConsoleApplication(): Nette\DI\Container
{
- $configurator = self::boot();
- Tester\Environment::setup(); // Инициализация Nette Tester
- return $configurator;
+ $this->configurator->setDebugMode(false);
+ $this->initializeEnvironment();
+ $this->setupContainer();
+ return $this->configurator->createContainer();
}
```
diff --git a/application/uk/components.texy b/application/uk/components.texy
index 37b1d65983..b8b4c592e4 100644
--- a/application/uk/components.texy
+++ b/application/uk/components.texy
@@ -230,6 +230,28 @@ $this->redirect(/* ... */); // робимо редирект
```
+Перенаправлення за сигналом .[#toc-redirection-after-a-signal]
+==============================================================
+
+Після обробки сигналу компонента часто відбувається перенаправлення. Ця ситуація схожа на форми - після відправлення форми ми також виконуємо перенаправлення, щоб запобігти повторному відправленню даних при оновленні сторінки в браузері.
+
+```php
+$this->redirect('this') // redirects to the current presenter and action
+```
+
+Оскільки компонент є елементом багаторазового використання і зазвичай не повинен мати прямої залежності від конкретних доповідачів, методи `redirect()` і `link()` автоматично інтерпретують параметр як сигнал компонента:
+
+```php
+$this->redirect('click') // redirects to the 'click' signal of the same component
+```
+
+Якщо вам потрібно перенаправити на іншого доповідача або дію, ви можете зробити це через доповідача:
+
+```php
+$this->getPresenter()->redirect('Product:show'); // redirects to a different presenter/action
+```
+
+
Постійні параметри .[#toc-persistent-parameters]
================================================
diff --git a/application/uk/presenters.texy b/application/uk/presenters.texy
index e16481509e..47e3d7b0c0 100644
--- a/application/uk/presenters.texy
+++ b/application/uk/presenters.texy
@@ -60,7 +60,7 @@ class ArticlePresenter extends Nette\Application\UI\Presenter
Важливо, що `action()` викликається перед `render()`, тому всередині нього ми можемо, можливо, змінити наступний хід життєвого циклу, тобто змінити шаблон, який буде відображатися, а також метод `render()`, який буде викликатися, використовуючи `setView('otherView')`.
-У метод передаються параметри із запиту. Можна і рекомендується вказувати типи для параметрів, наприклад `actionShow(int $id, string $slug = null)` - якщо параметр `id` відсутній або якщо він не є цілим числом, презентер повертає [помилку 404 |#Error-404-etc] і завершує операцію.
+У метод передаються параметри із запиту. Можна і рекомендується вказувати типи для параметрів, наприклад `actionShow(int $id, ?string $slug = null)` - якщо параметр `id` відсутній або якщо він не є цілим числом, презентер повертає [помилку 404 |#Error-404-etc] і завершує операцію.
`handle(args...)` .{toc: handle()}
@@ -205,7 +205,7 @@ $this->redirect(/* ... */);
Помилка 404 тощо. .[#toc-error-404-etc]
=======================================
-Коли ми не можемо виконати запит, тому що, наприклад, стаття, яку ми хочемо відобразити, не існує в базі даних, ми викинемо помилку 404, використовуючи метод `error(string $message = null, int $httpCode = 404)`, який представляє HTTP-помилку 404:
+Коли ми не можемо виконати запит, тому що, наприклад, стаття, яку ми хочемо відобразити, не існує в базі даних, ми викинемо помилку 404, використовуючи метод `error(?string $message = null, int $httpCode = 404)`, який представляє HTTP-помилку 404:
```php
public function renderShow(int $id): void
@@ -384,7 +384,7 @@ class ProductPresenter extends Nette\Application\UI\Presenter
Ви також можете викликати канонізацію вручну за допомогою методу `canonicalize()`, який, як і метод `link()`, отримує як аргументи презентера, дії та параметри. Він створює посилання і порівнює його з поточним URL. Якщо вони відрізняються, то відбувається перенаправлення на згенероване посилання.
```php
-public function actionShow(int $id, string $slug = null): void
+public function actionShow(int $id, ?string $slug = null): void
{
$realSlug = $this->facade->getSlugForId($id);
// перенаправляє, якщо $slug відрізняється від $realSlug
diff --git a/best-practices/cs/composer.texy b/best-practices/cs/composer.texy
index 8ea7581472..137b09c745 100644
--- a/best-practices/cs/composer.texy
+++ b/best-practices/cs/composer.texy
@@ -58,7 +58,7 @@ composer update
Composer stáhne Nette Database do složky `vendor/`. Dále vytvoří soubor `composer.lock`, který obsahuje informace o tom, které verze knihoven přesně nainstaloval.
-Composer vygeneruje soubor `vendor/autoload.php`, který můžeme jednoduše zainkludovat a začít používat knihovny bez jakékoli další práce:
+Composer vygeneruje soubor `vendor/autoload.php`, který můžeme jednoduše inkludovat a začít používat knihovny bez jakékoli další práce:
```php
require __DIR__ . '/vendor/autoload.php';
diff --git a/best-practices/cs/inject-method-attribute.texy b/best-practices/cs/inject-method-attribute.texy
index 9bd667a09f..b3e80f1266 100644
--- a/best-practices/cs/inject-method-attribute.texy
+++ b/best-practices/cs/inject-method-attribute.texy
@@ -61,7 +61,7 @@ class MyPresenter extends Nette\Application\UI\Presenter
Výhodou tohoto způsobu předávání závislostí byla velice úsporná podoba zápisu. Nicméně s příchodem [constructor property promotion |https://blog.nette.org/cs/php-8-0-kompletni-prehled-novinek#toc-constructor-property-promotion] se jeví snazší použít konstruktor.
-Naopak tento způsob trpí stejnými nedostatky, jako předávání závislosti do properites obecně: nemáme kontrolu nad změnami v proměnné a zároveň se proměnná stává součástí veřejného rozhraní třídy, což je nežádnoucí.
+Naopak tento způsob trpí stejnými nedostatky, jako předávání závislosti do properties obecně: nemáme kontrolu nad změnami v proměnné a zároveň se proměnná stává součástí veřejného rozhraní třídy, což je nežádnoucí.
{{sitename: Best Practices}}
diff --git a/best-practices/cs/lets-create-contact-form.texy b/best-practices/cs/lets-create-contact-form.texy
index 80503acf55..aa24fb819f 100644
--- a/best-practices/cs/lets-create-contact-form.texy
+++ b/best-practices/cs/lets-create-contact-form.texy
@@ -131,7 +131,7 @@ Zatím se odesílá prostý textový email obsahující pouze zprávu odeslanou