Skip to content

Commit

Permalink
dirname2
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Apr 18, 2024
1 parent 374af9d commit a0a7d1a
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 27 deletions.
45 changes: 23 additions & 22 deletions application/cs/modules.texy
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,22 @@ Zapomeňme tedy na jednu složku pro presentery a šablony a místo toho vytvoř

/--pre
<b>app/</b>
├── <del>Presenters/</del>
├── <b>Modules/</b> ← adresář s moduly
├── <b>UI/</b> ← presentery, šablony a pomocné třídy
├── <b>@layout.latte</b> ← šablona layoutu
│ ├── <b>Admin/</b> ← modul Admin
│ │ ├── <b>Presenters/</b> ← jeho presentery
│ │ │ ├── <b>DashboardPresenter.php</b>
│ │ │ └── <b>templates/</b>
│ └── <b>Front/</b> ← modul Front
│ └── <b>Presenters/</b> ← jeho presentery
│ │ │ ├── <b>Dashboard/</b>
│ │ │ │ └── <b>DashboardPresenter.php</b>
│ ├── <b>Front/</b> ← modul Front
│ │ ├── <b>Home/</b> ← adresář presenteru Home
│ │ │ ├── <b>HomePresenter.php</b> ← třída presenteru Home
│ │ │ └── <b>default.latte</b> ← šablona akce 'default'
│ └── ...
\--

Tuto adresářovou strukturu budou reflektovat jmenné prostory tříd, takže třeba `DashboardPresenter` bude v prostoru `App\Modules\Admin\Presenters`:
Tuto adresářovou strukturu budou reflektovat jmenné prostory tříd, takže třeba `DashboardPresenter` bude v prostoru `App\UI\Admin`:

```php
namespace App\Modules\Admin\Presenters;
namespace App\UI\Admin\Dashboard;

class DashboardPresenter extends Nette\Application\UI\Presenter
{
Expand All @@ -33,7 +34,7 @@ class DashboardPresenter extends Nette\Application\UI\Presenter
```

Na presenter `Dashboard` uvnitř modulu `Admin` se v rámci aplikace odkazujeme pomocí dvojtečkové notace jako na `Admin:Dashboard`, na jeho akci `default` potom jako na `Admin:Dashboard:default`.
A jak Nette vlastní ví, že `Admin:Dashboard` představuje třídu `App\Modules\Admin\Presenters\DashboardPresenter`? To mu řekneme pomocí [#mapování] v konfiguraci.
A jak Nette vlastní ví, že `Admin:Dashboard` představuje třídu `App\UI\Admin\Dashboard\DashboardPresenter`? To mu řekneme pomocí [#mapování] v konfiguraci.
Tedy uvedená struktura není pevná a můžete si ji upravit podle potřeb.

Moduly mohou kromě presenterů a šablon samozřejmě obsahovat všechny další součásti, jako jsou třeba komponenty, modelové třídy, atd.
Expand All @@ -46,19 +47,19 @@ Moduly nemusí tvořit jen plochou strukturu, lze vytvářet i submoduly, např

/--pre
<b>app/</b>
├── <b>Modules/</b> ← adresář s moduly
├── <b>UI/</b> ← presentery, šablony a pomocné třídy
│ ├── <b>Blog/</b> ← modul Blog
│ │ ├── <b>Admin/</b> ← submodul Admin
│ │ │ ├── <b>Presenters/</b>
│ │ │ ├── <b>Dashboard/</b>
│ │ │ └── ...
│ │ └── <b>Front/</b> ← submodul Front
│ │ ├── <b>Presenters/</b>
│ │ ├── <b>Home/</b>
│ │ └── ...
│ ├── <b>Forum/</b> ← modul Forum
│ │ └── ...
\--

Tedy modul `Blog` je rozdělen do submodulů `Admin` a `Front`. A opět se to odrazí na jmenných prostorech, které budou `App\Modules\Blog\Admin\Presenters` apod. Na presenter `Dashboard` uvnitř submodulu se odkazujeme jako `Blog:Admin:Dashboard`.
Tedy modul `Blog` je rozdělen do submodulů `Admin` a `Front`. A opět se to odrazí na jmenných prostorech, které budou `App\UI\Blog\Admin\...` apod. Na presenter `Dashboard` uvnitř submodulu se odkazujeme jako `Blog:Admin:Dashboard`.

Zanořování může pokračovat libovolně hluboko, lze tedy vytvářet sub-submoduly.

Expand Down Expand Up @@ -104,11 +105,11 @@ Mapování

Definuje pravidla, podle kterých se z názvu presenteru odvodí název třídy. Zapisujeme je v [konfiguraci|configuration] pod klíčem `application › mapping`.

Začněme ukázkou, která moduly nepoužívá. Budeme jen chtít, aby třídy presenterů měly jmenný prostor `App\Presenters`. Tedy aby se presenter například `Home` mapoval na třídu `App\Presenters\HomePresenter`. Toho lze docílit následující konfigurací:
Začněme ukázkou, která moduly nepoužívá. Budeme jen chtít, aby třídy presenterů měly jmenný prostor `App\UI`. Tedy aby se presenter například `Home` mapoval na třídu `App\UI\HomePresenter`. Toho lze docílit následující konfigurací:

```neon
application:
mapping: App\Presenters\*Presenter
mapping: App\UI\*Presenter
```

Název presenteru se nahradí za hvezdičku v masce třídy a výsledkem je název třídy. Snadné!
Expand All @@ -118,30 +119,30 @@ Pokud presentery členíme do modulů, můžeme pro každý modul mít vlastní
```neon
application:
mapping:
Front: App\Modules\Front\Presenters\*Presenter
Admin: App\Modules\Admin\Presenters\*Presenter
Front: App\UI\Front\*Presenter
Admin: App\UI\Admin\*Presenter
Api: App\Api\*Presenter
```

Nyní se presenter `Front:Home` mapuje na třídu `App\Modules\Front\Presenters\HomePresenter` a presenter `Admin:Dashboard` na třídu `App\Modules\Admin\Presenters\DashboardPresenter`.
Nyní se presenter `Front:Home` mapuje na třídu `App\UI\Front\HomePresenter` a presenter `Admin:Dashboard` na třídu `App\UI\Admin\DashboardPresenter`.

Praktičtější bude vytvořit obecné (hvězdičkové) pravidlo, které první dvě nahradí. V masce třídy přibude hvezdička navíc právě pro modul:

```neon
application:
mapping:
*: App\Modules\*\Presenters\*Presenter
*: App\UI\*\*Presenter
Api: App\Api\*Presenter
```

Ale co když používáme vícenásobně zanořené moduly a máme třeba presenter `Admin:User:Edit`? V takovém případě se segment s hvězdičkou představující modul pro každou úroveň jednoduše zopakuje a výsledkem bude třída `App\Modules\Admin\User\Presenters\EditPresenter`.
Ale co když používáme vícenásobně zanořené moduly a máme třeba presenter `Admin:User:Edit`? V takovém případě se segment s hvězdičkou představující modul pro každou úroveň jednoduše zopakuje a výsledkem bude třída `App\UI\Admin\User\EditPresenter`.

Alternativním zápisem je místo řetězce použít pole skládající se ze tří segmentů. Tento zápis je ekvivaletní s předchozím:

```neon
application:
mapping:
*: [App\Modules, *, Presenters\*Presenter]
*: [App\UI, *, *Presenter]
```

Výchozí hodnotou je `*Module\*Presenter`.
26 changes: 21 additions & 5 deletions application/cs/templates.texy
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,30 @@ Ta definuje blok `content`, který se vloží na místo `{include content}` v la
Hledání šablon
--------------

Cestu k šablonám odvodí presenter podle jednoduché logiky. Zkusí, zda existuje jeden z těchto souborů umístěných relativně od adresáře s třídou presenteru, kde `<Presenter>` je název aktuálního presenteru a `<view>` je název aktuální akce:
Nemusíte v presenterech uvádět, jaká šablona se má vykreslit, cestu si odvodí sám.

- `templates/<Presenter>/<view>.latte`
- `templates/<Presenter>.<view>.latte`
Pokud používáte adresářovou strukturu, kde každý presenter má vlastní adresář (standard od Nette Application 3.2), jednodušše umístěte šablonu do tohoto adresáře pod jménem akce, tj. pro akci `default` použijte šablonu `default.latte`. Příklad struktury:

Pokud šablonu nenajde, zkusí hledat ještě v adresáři `templates` o úroveň výš, tj. na stejné úrovni, jako je adresář s třídou presenteru.
/--pre
<b>Product/</b>
├── <b>ProductPresenter.php</b>
└── <b>default.latte</b>
\--

Pokud ani tam šablonu nenajde, je odpovědí [chyba 404|presenters#Chyba 404 a spol.].
Pokud používáte strukturu, kde jsou presentery společně v jednom adresáři a šablony ve složce `templates`, uložte ji buď do souboru `<Presenter>.<view>.latte` nebo `<Presenter>/<view>.latte`, kde `<Presenter>` je název aktuálního presenteru a `<view>` je název aktuální akce. Příklad:

/--pre
<b>Presenters/</b>
└── <b>HomePresenter.php</b>
└── <b>templates/</b>
├── <b>Home.default.php</b> ← 1. varianta
└── <b>Home/</b>
└── <b>default.latte</b> ← 2. varianta
\--

Adresář `templates` může být umístěn také o úroveň výš, tj. na stejné úrovni, jako je adresář s třídami presenterů.

Pokud šablonu nenajde, je odpovědí [chyba 404|presenters#Chyba 404 a spol.].

Můžete také změnit view pomocí `$this->setView('jineView')`. Nebo místo dohledávání přímo určit jméno souboru se šablonou pomocí `$this->template->setFile('/path/to/template.latte')`.

Expand Down

0 comments on commit a0a7d1a

Please sign in to comment.