Skip to content

Commit

Permalink
new directory structure
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Apr 18, 2024
1 parent 2bc73e2 commit 374af9d
Show file tree
Hide file tree
Showing 276 changed files with 1,436 additions and 1,532 deletions.
25 changes: 11 additions & 14 deletions application/bg/how-it-works.texy
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@
/--pre
<b>web-project/</b>
├── <b>app/</b> ← каталог с приложением
│ ├── <b>Presenters/</b> ← классы презентеров
│ │ ── <b>HomePresenter.php</b> ← Класс презентера главной страницы
│ └── <b>templates/</b> ← директория шаблонов
│ │ ├── <b>@layout.latte</b> ← шаблон общего макета
│ │ └── <b>Home/</b> ← шаблоны презентера главной страницы
│ │ ── <b>default.latte</b> ← шаблон действия `default`
── <b>Router/</b> ← конфигурация URL-адресов
│ ├── <b>Основни/</b> ← основни необходими класове
│ │ ── <b>RouterFactory.php</b> ← конфигуриране на URL адреси
── <b>UI/</b> ← презентатори, шаблони и др.
│ │ ├── <b>@layout.latte</b> ← шаблон на споделено оформление
│ │ └── <b>Home/</b> ← Директория за водещи
│ │ ── <b>HomePresenter.php</b> ← Клас на Home Presenter
│ └── <b>default.latte</b> ← шаблон за действие default
│ └── <b>Bootstrap.php</b> ← загрузочный класс Bootstrap
├── <b>bin/</b> ← скрипты командной строки
├── <b>config/</b> ← файлы конфигурации
Expand Down Expand Up @@ -91,7 +91,7 @@ Nette е наставник, който ви напътства да пишет

Приложението започва с искане към т.нар. маршрутизатор да реши на кой от презентаторите да изпрати текущата заявка за обработка. Маршрутизаторът решава чия е отговорността. Той разглежда входния URL адрес `https://example.com/product/123`, който иска продукт `показать` с `id: 123` като действие. Добър навик е да записвате двойките водещ + действие, разделени с двоеточие: `Продукт:показать`.

Следователно маршрутизаторът е преобразувал URL адреса в двойка `Presenter:action` + параметри, в нашия случай `Product:show` + `id`: 123`. Вы можете увидеть, как выглядит маршрутизатор в файле `app/Router/RouterFactory.php`, и ще го опишем подробно в главата [Маршрутизация |routing].
Следователно маршрутизаторът е преобразувал URL адреса в двойка `Presenter:action` + параметри, в нашия случай `Product:show` + `id`: 123`. Вы можете увидеть, как выглядит маршрутизатор в файле `app/Core/RouterFactory.php`, и ще го опишем подробно в главата [Маршрутизация |routing].

Да продължим. Приложението вече знае името на водещия и може да продължи. Чрез създаване на обект `ProductPresenter`, който е кодът на предентера `Product`. По-точно, той иска от контейнера DI да създаде презентатора, тъй като създаването на обекти е негова работа.

Expand Down Expand Up @@ -121,12 +121,9 @@ class ProductPresenter extends Nette\Application\UI\Presenter

След това водещият връща отговор. Това може да бъде HTML страница, изображение, XML документ, файл, изпратен от диска, JSON или пренасочване към друга страница. Важно е да се отбележи, че ако не посочим изрично как да се отговори (какъвто е случаят с `ProductPresenter`), отговорът ще бъде шаблон, показващ HTML страница. Защо? Ами защото в 99% от случаите искаме да покажем шаблон, водещият приема това поведение по подразбиране и иска да улесни работата ни. Това е гледната точка на Нете.

Дори не е необходимо да указваме кой шаблон да се покаже, той сам извежда пътя до него според проста логика. В случая с водещия `Product` и действието `show`, той се опитва да провери дали някой от тези файлове с шаблони съществува спрямо директорията, в която се намира класът `ProductPresenter`:
Дори не е необходимо да посочваме кой шаблон да се визуализира; рамката сама ще определи пътя. В случая с действието `show` тя просто се опитва да зареди шаблона `show.latte` в директорията с класа `ProductPresenter`. Тя също така се опитва да намери оформлението във файла `@layout.latte` (повече за [търсенето на шаблони |templates#Search for Templates]).

- `templates/Product/show.latte`
- `templates/Product.show.latte`

След това се показва шаблонът. Задачата на водещия и на цялото приложение вече е изпълнена. Ако шаблонът не съществува, ще бъде върната страница за грешка 404. Можете да прочетете повече за водещите на страницата [Водещи |presenters].
Впоследствие шаблоните се визуализират. С това задачата на презентатора и на цялото приложение е изпълнена и работата е приключила. Ако шаблонът не съществува, ще бъде върната страница с грешка 404. Можете да прочетете повече за презентаторите на страницата [Презентатори |presenters].

[* request-flow.svg *]

Expand All @@ -137,7 +134,7 @@ class ProductPresenter extends Nette\Application\UI\Presenter
3) маршрутизаторът декодира URL адреса като двойка `Home:default`
4) обектът е създаден `HomePresenter`
5) извиква се методът `renderDefault()` (ако съществува)
6) шаблонът `templates/Home/default.latte` с оформлението `templates/@layout.latte` се визуализира
6) шаблонът `default.latte` с оформлението `@layout.latte` се визуализира


Може би сега ще се сблъскате с много нови концепции, но ние смятаме, че те имат смисъл. Създаването на приложения в Nette е лесно.
Expand Down
10 changes: 5 additions & 5 deletions application/bg/routing.texy
Original file line number Diff line number Diff line change
Expand Up @@ -477,10 +477,10 @@ $router->addRoute('index<?.html \.html?|\.php|>', /* ... */);
Интеграция .[#toc-integration]
==============================

За да свържем маршрутизатора си с приложението, трябва да информираме за това контейнера DI. Най-лесният начин е да се подготви фабрика, която ще създаде обект маршрутизатор, и да се каже на конфигурацията на контейнера да го използва. Да предположим, че напишем метод за това, `App\Router\RouterFactory::createRouter()`:
За да свържем маршрутизатора си с приложението, трябва да информираме за това контейнера DI. Най-лесният начин е да се подготви фабрика, която ще създаде обект маршрутизатор, и да се каже на конфигурацията на контейнера да го използва. Да предположим, че напишем метод за това, `App\Core\RouterFactory::createRouter()`:

```php
namespace App\Router;
namespace App\Core;

use Nette\Application\Routers\RouteList;

Expand All @@ -499,7 +499,7 @@ class RouterFactory

```neon
services:
- App\Router\RouterFactory::createRouter
- App\Core\RouterFactory::createRouter
```

Всички зависимости, като например връзки към бази данни и т.н., се предават на метода на фабриката като параметри, като се използва [автоматично свързване |dependency-injection:autowiring]:
Expand Down Expand Up @@ -663,7 +663,7 @@ $router->addRoute(/* ... */);
Затова отново ще добавим метод, който ще създаде например маршрутизатор:

```php
namespace App\Router;
namespace App\Core;

use Nette\Routing\RouteList;

Expand Down Expand Up @@ -694,7 +694,7 @@ $httpRequest = $container->getByType(Nette\Http\IRequest::class);
Или ще създадем обектите директно:

```php
$router = App\Router\RouterFactory::createRouter();
$router = App\Core\RouterFactory::createRouter();
$httpRequest = (new Nette\Http\RequestFactory)->fromGlobals();
```

Expand Down
6 changes: 3 additions & 3 deletions application/bg/templates.texy
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ class ArticleTemplate extends Nette\Bridges\ApplicationLatte\Template
Можете също така да си позволите лукса да шепнете в шаблоните, просто инсталирайте плъгина Latte в PhpStorm и поставете името на класа в началото на шаблона, за повече информация вижте статията "Latte: как да въведем системата":https://blog.nette.org/bg/latte-kak-da-izpolzvame-sistemata-ot-tipove:

```latte
{templateType App\Presenters\ArticleTemplate}
{templateType App\UI\Article\ArticleTemplate}
...
```

Expand Down Expand Up @@ -176,7 +176,7 @@ public function beforeRender(): void
Версия 3 на Latte предлага по-усъвършенстван начин за създаване на [разширение за |latte:creating-extension] всеки уеб проект. Ето кратък пример за такъв клас:

```php
namespace App\Templating;
namespace App\UI\Accessory;

final class LatteExtension extends Latte\Extension
{
Expand Down Expand Up @@ -214,7 +214,7 @@ final class LatteExtension extends Latte\Extension
```neon
latte:
extensions:
- App\Templating\LatteExtension
- App\UI\Accessory\LatteExtension
```


Expand Down
25 changes: 11 additions & 14 deletions application/cs/how-it-works.texy
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ Adresářová struktura vypadá nějak takto:
/--pre
<b>web-project/</b>
├── <b>app/</b> ← adresář s aplikací
│ ├── <b>Presenters/</b> ← presentery a šablony
│ │ ── <b>HomePresenter.php</b> ← třída presenteru Home
│ └── <b>templates/</b> ← adresář se šablonami
│ │ ├── <b>@layout.latte</b> ← šablona layoutu
└── <b>Home/</b> ← šablony presenteru Home
── <b>default.latte</b> ← šablona akce 'default'
── <b>Router/</b> ← konfigurace URL adres
│ ├── <b>Core/</b> ← základní třídy nutné pro chod
│ │ ── <b>RouterFactory.php</b> ← konfigurace URL adres
── <b>UI/</b> ← presentery, šablony & spol.
│ │ ├── <b>@layout.latte</b> ← šablona layoutu
│ └── <b>Home/</b> ← adresář presenteru Home
── <b>HomePresenter.php</b> ← třída presenteru Home
│ └── <b>default.latte</b> ← šablona akce default
│ └── <b>Bootstrap.php</b> ← zaváděcí třída Bootstrap
├── <b>bin/</b> ← skripty spouštěné z příkazové řádky
├── <b>config/</b> ← konfigurační soubory
Expand Down Expand Up @@ -91,7 +91,7 @@ Aplikace psané v Nette se člení do spousty tzv. presenterů (v jiných framew

Application začne tím, že požádá tzv. router, aby rozhodl, kterému z presenterů předat aktuální požadavek k vyřízení. Router rozhodne, čí je to zodpovědnost. Podívá se na vstupní URL `https://example.com/product/123` a na základě toho, jak je nastavený, rozhodne, že tohle je práce např. pro **presenter** `Product`, po kterém bude chtít jako **akci** zobrazení (`show`) produktu s `id: 123`. Dvojici presenter + akce je dobrým zvykem zapisovat oddělené dvojtečkou jako `Product:show`.

Tedy router transformoval URL na dvojici `Presenter:action` + parametry, v našem případě `Product:show` + `id: 123`. Jak takový router vypadá se můžete podívat v souboru `app/Router/RouterFactory.php` a podrobně ho popisujeme v kapitole [Routing].
Tedy router transformoval URL na dvojici `Presenter:action` + parametry, v našem případě `Product:show` + `id: 123`. Jak takový router vypadá se můžete podívat v souboru `app/Core/RouterFactory.php` a podrobně ho popisujeme v kapitole [Routing].

Pojďme dál. Application už zná jméno presenteru a může pokračovat dál. Tím že vyrobí objekt třídy `ProductPresenter`, což je kód presenteru `Product`. Přesněji řečeno, požádá DI kontejner, aby presenter vyrobil, protože od vyrábění je tu on.

Expand Down Expand Up @@ -121,12 +121,9 @@ Takže, zavolala se metoda `renderShow(123)`, jejíž kód je sice smyšlený p

Následně presenter vrátí odpověď. Tou může být HTML stránka, obrázek, XML dokument, odeslání souboru z disku, JSON nebo třeba přesměrování na jinou stránku. Důležité je, že pokud explicitně neřekneme, jak má odpovědět (což je případ `ProductPresenter`), bude odpovědí vykreslení šablony s HTML stránkou. Proč? Protože v 99 % případů chceme vykreslit šablonu, tudíž presenter tohle chování bere jako výchozí a chce nám ulehčit práci. To je smyslem Nette.

Nemusíme ani uvádět, jakou šablonu vykreslit, cestu k ní si odvodí podle jednoduché logiky. V případě presenteru `Product` a akce `show` zkusí, zda existuje jeden z těchto souborů se šablonou uložených relativně od adresáře s třídou `ProductPresenter`:
Nemusíme ani uvádět, jakou šablonu vykreslit, cestu k ní si odvodí sám. V případě akce `show` jednodušše zkusí načíst šablonu `show.latte` v adresáři s třídou `ProductPresenter`. Taktéž se pokusí dohledat layout v souboru `@layout.latte` (podrobněji o [dohledávání šablon|templates#hledani-sablon]).

- `templates/Product/show.latte`
- `templates/Product.show.latte`

Taktéž se pokusí dohledat layout v souboru `@layout.latte` a následně šablonu vykreslí. Tím je úkol presenteru i celé aplikace dokonán a dílo jest završeno. Pokud by šablona neexistovala, vrátí se stránka s chybou 404. Více se o presenterech dočtete na stránce [Presentery|presenters].
A následně šablony vykreslí. Tím je úkol presenteru i celé aplikace dokonán a dílo jest završeno. Pokud by šablona neexistovala, vrátí se stránka s chybou 404. Více se o presenterech dočtete na stránce [Presentery|presenters].

[* request-flow.svg *]

Expand All @@ -137,7 +134,7 @@ Pro jistotu, zkusme si zrekapitulovat celý proces s trošku jinou URL:
3) router URL dekóduje jako dvojici `Home:default`
4) vytvoří se objekt třídy `HomePresenter`
5) zavolá se metoda `renderDefault()` (pokud existuje)
6) vykreslí se šablona např. `templates/Home/default.latte` s layoutem např. `templates/@layout.latte`
6) vykreslí se šablona např. `default.latte` s layoutem např. `@layout.latte`


Možná jste se teď setkali s velkou spoustou nových pojmů, ale věříme, že dávají smysl. Tvorba aplikací v Nette je ohromná pohodička.
Expand Down
10 changes: 5 additions & 5 deletions application/cs/routing.texy
Original file line number Diff line number Diff line change
Expand Up @@ -477,10 +477,10 @@ $router->addRoute('index<?.html \.html?|\.php|>', /* ... */);
Začlenění do aplikace
=====================

Abychom vytvořený router zapojili do aplikace, musíme o něm říci DI kontejneru. Nejsnazší cesta je připravit továrnu, která objekt routeru vyrobí, a sdělit v konfiguraci kontejneru, že ji má použít. Dejme tomu, že k tomu účelu napíšeme metodu `App\Router\RouterFactory::createRouter()`:
Abychom vytvořený router zapojili do aplikace, musíme o něm říci DI kontejneru. Nejsnazší cesta je připravit továrnu, která objekt routeru vyrobí, a sdělit v konfiguraci kontejneru, že ji má použít. Dejme tomu, že k tomu účelu napíšeme metodu `App\Core\RouterFactory::createRouter()`:

```php
namespace App\Router;
namespace App\Core;

use Nette\Application\Routers\RouteList;

Expand All @@ -499,7 +499,7 @@ Do [konfigurace |dependency-injection:services] pak zapíšeme:

```neon
services:
- App\Router\RouterFactory::createRouter
- App\Core\RouterFactory::createRouter
```

Jakékoliv závislosti, třeba na databázi atd, se předají tovární metodě jako její parametry pomocí [autowiringu|dependency-injection:autowiring]:
Expand Down Expand Up @@ -663,7 +663,7 @@ Samostatným použitím myslíme využití schopností routeru v aplikaci, kter
Takže opět si vytvoříme metodu, která nám sestaví router, např.:

```php
namespace App\Router;
namespace App\Core;

use Nette\Routing\RouteList;

Expand Down Expand Up @@ -694,7 +694,7 @@ $httpRequest = $container->getByType(Nette\Http\IRequest::class);
Anebo objekty přímo vyrobíme:

```php
$router = App\Router\RouterFactory::createRouter();
$router = App\Core\RouterFactory::createRouter();
$httpRequest = (new Nette\Http\RequestFactory)->fromGlobals();
```

Expand Down
6 changes: 3 additions & 3 deletions application/cs/templates.texy
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ Anotace `@property-read` je určená pro IDE a statickou analýzu, díky ní bud
Luxusu našeptávání si můžete dopřát i v šablonách, stačí do PhpStorm nainstalovat plugin pro Latte a uvést na začátek šablony název třídy, více v článku "Latte: jak na typový systém":https://blog.nette.org/cs/latte-jak-na-typovy-system:

```latte
{templateType App\Presenters\ArticleTemplate}
{templateType App\UI\Article\ArticleTemplate}
...
```

Expand Down Expand Up @@ -176,7 +176,7 @@ public function beforeRender(): void
Latte ve verzi 3 nabízí pokročilejší způsob a to vytvoření si [extension |latte:creating-extension] pro každý webový projekt. Kusý příklad takové třídy:

```php
namespace App\Templating;
namespace App\UI\Accessory;

final class LatteExtension extends Latte\Extension
{
Expand Down Expand Up @@ -214,7 +214,7 @@ Zaregistrujeme ji pomocí [konfigurace |configuration#Šablony Latte]:
```neon
latte:
extensions:
- App\Templating\LatteExtension
- App\UI\Accessory\LatteExtension
```


Expand Down
Loading

0 comments on commit 374af9d

Please sign in to comment.