Skip to content

Commit

Permalink
structue
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Jan 23, 2025
1 parent 86d9513 commit 321a6c2
Show file tree
Hide file tree
Showing 11 changed files with 540 additions and 196 deletions.
2 changes: 1 addition & 1 deletion application/cs/@left-menu.texy
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Aplikace v Nette
- [Bootstrap]
- [Presentery |presenters]
- [Šablony |templates]
- [Moduly |modules]
- [Adresářová struktura |directory-structure]
- [Routování |routing]
- [Vytváření odkazů URL |creating-links]
- [Interaktivní komponenty |components]
Expand Down
2 changes: 1 addition & 1 deletion application/cs/configuration.texy
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Volba `silentLinks` určuje, jak se Nette zachová ve vývojářském režimu, k

[Aliasy zjednodušují odkazování |creating-links#aliasy] na často používané presentery.

[Mapování definuje pravidla |modules#mapování], podle kterých se z názvu presenteru odvodí název třídy.
[Mapování definuje pravidla |directory-structure#mapování presenterů], podle kterých se z názvu presenteru odvodí název třídy.


Automatická registrace presenterů
Expand Down
4 changes: 2 additions & 2 deletions application/cs/creating-links.texy
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ Pokud je cílem akce `default`, můžeme ji vynechat, ale dvojtečka musí zůst
<a n:href="Home:">úvodní stránka</a>
```

Odkazy mohou také směřovat do jiných [modulů |modules]. Zde se odkazy rozlišují na relativní do zanořeného submodulu, nebo absolutní. Princip je analogický k cestám na disku, jen místo lomítek jsou dvojtečky. Předpokládejme, že aktuální presenter je součástí modulu `Front`, potom zapíšeme:
Odkazy mohou také směřovat do jiných [modulů |directory-structure#Presentery a šablony]. Zde se odkazy rozlišují na relativní do zanořeného submodulu, nebo absolutní. Princip je analogický k cestám na disku, jen místo lomítek jsou dvojtečky. Předpokládejme, že aktuální presenter je součástí modulu `Front`, potom zapíšeme:

```latte
<a n:href="Shop:Product:show">odkaz na Front:Shop:Product:show</a>
Expand Down Expand Up @@ -281,6 +281,6 @@ Jak vytvářet odkazy s podobným komfortem jako má metoda `link()`, ale bez p

LinkGenerátor je služba, kterou si můžete nechat předat přes konstruktor a poté vytvářet odkazy jeho metodou `link()`.

Oproti presenterům je tu rozdíl. LinkGenerator vytváří všechny odkazy rovnou jako absolutní URL. A dále neexistuje žádný "aktuální presenter", takže nelze jako cíl uvést jen název akce `link('default')` nebo uvádět relativní cesty k [modulům |modules].
Oproti presenterům je tu rozdíl. LinkGenerator vytváří všechny odkazy rovnou jako absolutní URL. A dále neexistuje žádný "aktuální presenter", takže nelze jako cíl uvést jen název akce `link('default')` nebo uvádět relativní cesty k modulům.

Neplatné odkazy vždy vyhazují `Nette\Application\UI\InvalidLinkException`.
521 changes: 521 additions & 0 deletions application/cs/directory-structure.texy

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions application/cs/how-it-works.texy
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ Adresářová struktura vypadá nějak takto:
└── <b>.htaccess</b> ← zakazuje přístup do všech adresářů krom www
\--

Adresářovou strukturu můžete jakkoliv měnit, složky přejmenovat či přesunout, a poté pouze upravit cesty k `log/` a `temp/` v souboru `Bootstrap.php` a dále cestu k tomuto souboru v `composer.json` v sekci `autoload`. Nic víc, žádná složitá rekonfigurace, žádné změny konstant. Nette totiž disponuje [chytrou autodetekcí|bootstrap#vyvojarsky-vs-produkcni-rezim].
Adresářovou strukturu můžete jakkoliv měnit, složky přejmenovat či přesunout, je zcela flexibilní. Nette navíc disponuje chytrou autodetekcí a automaticky rozpozná umístění aplikace včetně její URL základny.

U trošku větších aplikací můžeme složky s presentery a šablonami rozčlenit na disku do podadresářů a třídy do jmenných prostorů, kterým říkáme [moduly |modules].
U trošku větších aplikací můžeme složky s presentery a šablonami [rozčlenit do podadresářů |directory-structure#Presentery a šablony] a třídy do jmenných prostorů, kterým říkáme moduly.

Adresář `www/` představuje tzv. veřejný adresář neboli document-root projektu. Můžete jej přejmenovat bez nutnosti cokoliv dalšího nastavovat na straně aplikace. Jen je potřeba [nakonfigurovat hosting |nette:troubleshooting#Jak změnit či ostranit z URL adresář www] tak, aby document-root mířil do tohoto adresáře.

Expand Down Expand Up @@ -75,7 +75,7 @@ Jeho úkolem je:

Jakou že továrnu? Nevyrábíme přece traktory, ale webové stránky! Vydržte, hned se to vysvětlí.

Slovy „inicializace prostředí“ myslíme například to, že se aktivuje [Tracy|tracy:], což je úžasný nástroj pro logování nebo vizualizaci chyb. Na produkčním serveru chyby loguje, na vývojovém rovnou zobrazuje. Tudíž k inicializaci patří i rozhodnutí, zda web běží v produkčním nebo vývojářském režimu. K tomu Nette používá autodetekci: pokud web spouštíte na localhost, běží v režimu vývojářském. Nemusíte tak nic konfigurovat a aplikace je rovnou připravena jak pro vývoj, tak ostré nasazení. Tyhle kroky se provádějí a jsou podrobně rozepsané v kapitole o [třídě Bootstrap|bootstrap].
Slovy „inicializace prostředí“ myslíme například to, že se aktivuje [Tracy|tracy:], což je úžasný nástroj pro logování nebo vizualizaci chyb. Na produkčním serveru chyby loguje, na vývojovém rovnou zobrazuje. Tudíž k inicializaci patří i rozhodnutí, zda web běží v produkčním nebo vývojářském režimu. K tomu Nette používá [chytrou autodetekci|bootstrap#vyvojarsky-vs-produkcni-rezim]: pokud web spouštíte na localhost, běží v režimu vývojářském. Nemusíte tak nic konfigurovat a aplikace je rovnou připravena jak pro vývoj, tak ostré nasazení. Tyhle kroky se provádějí a jsou podrobně rozepsané v kapitole o [třídě Bootstrap|bootstrap].

Třetím bodem (ano, druhý jsme přeskočili, ale vrátíme se k němu) je spuštění aplikace. Vyřizování HTTP požadavků má v Nette na starosti třída `Nette\Application\Application` (dále `Application`), takže když říkáme spustit aplikaci, myslíme tím konkrétně zavolání metody s příznačným názvem `run()` na objektu této třídy.

Expand Down
184 changes: 1 addition & 183 deletions application/cs/modules.texy
Original file line number Diff line number Diff line change
@@ -1,183 +1 @@
Moduly
******

.[perex]
Moduly vnášejí do Nette aplikací přehlednost díky snadnému členění do logických celků.

Podobně jako na pevném disku organizujeme soubory do jednotlivých složek, tak i v Nette můžeme presentery, šablony a další pomocné třídy rozdělovat do modulů. Jak to funguje v praxi? Jednoduše začleníme do struktury nové podadresáře. Příklad takové struktury se dvěma moduly Front a Admin:

/--pre
app/
├── UI/
│ ├── <b>Admin/</b> ← modul Admin
│ │ ├── @layout.latte
│ │ ├── Dashboard/
│ │ │ ├── DashboardPresenter.php
│ │ │ └── default.latte
│ │ └── ...
│ ├── <b>Front/</b> ← modul Front
│ │ ├── @layout.latte
│ │ ├── Home/
│ │ │ ├── HomePresenter.php
│ │ │ └── default.latte
│ │ └── ...
\--

Tato adresářová struktura se odráží ve jmenných prostorech tříd, takže například `DashboardPresenter` se nachází ve jmenném prostoru `App\UI\Admin\Dashboard`:

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

class DashboardPresenter extends Nette\Application\UI\Presenter
{
// ...
}
```

Na presenter `Dashboard` uvnitř modulu `Admin` odkazujeme v aplikaci pomocí dvojtečkové notace jako na `Admin:Dashboard`. Na jeho akci `default` potom jako na `Admin:Dashboard:default`.

Představená struktura není pevná; můžete si ji zcela [přizpůsobit dle svých potřeb|#mapování] v konfiguraci. .[tip]

Moduly mohou kromě presenterů a šablon samozřejmě zahrnovat všechny ostatní soubory, jako jsou například komponenty a pomocné třídy. Pokud uvažujete, kam je zařadit, zvažte využití složky `Accessory`:

/--pre
app/
├── UI/
│ ├── Admin/
│ │ ├── <b>Accessory/</b>
│ │ │ ├── FormFactory.php
│ │ │ └── AdminLayout.php
│ │ ├── Dashboard/
│ │ └── ...
\--


Vnořené moduly
--------------

Moduly mohou mít více úrovní zanoření, podobně jako adresářová struktura na disku:

/--pre
app/
├── UI/
│ ├── <b>Blog/</b> ← modul Blog
│ │ ├── <b>Admin/</b> ← submodul Admin
│ │ │ ├── Dashboard/
│ │ │ └── ...
│ │ ├── <b>Front/</b> ← submodul Front
│ │ │ ├── @layout.latte
│ │ │ ├── Home/
│ │ │ └── ...
│ ├── <b>Forum/</b> ← modul Forum
│ │ └── ...
\--

Modul `Blog` je rozdělen na submoduly `Admin` a `Front`. To se projeví i ve jmenných prostorech, které pak budou vypadat jako `App\UI\Blog\Admin` a podobně. Na presenter `Dashboard` v rámci submodulu odkazujeme jako na `Blog:Admin:Dashboard`.

Zanoření může být libovolně hluboké, což umožňuje vytvářet sub-submoduly.

Pokud například v administraci máte mnoho presenterů týkajících se správy objednávek, jako jsou `OrderDetail`, `OrderEdit`, `OrderDispatch` atd., můžete pro lepší organizovanost vytvořit modul `Order`, ve kterém budou presentery `Detail`, `Edit`, `Dispatch` a další.


Vytváření odkazů
----------------

Odkazy v šablonách presenterů jsou relativní vůči aktuálnímu modulu. Tedy odkaz `Foo:default` vede na presenter `Foo` v tomtéž modulu, v jakém je aktuální presenter. Pokud je aktuální modul například `Front`, pak odkaz vede takto:

```latte
<a n:href="Product:show">odkaz na Front:Product:show</a>
```

Odkaz je relativní i pokud je jeho součástí název modulu, ten se pak považuje za submodul:

```latte
<a n:href="Shop:Product:show">odkaz na Front:Shop:Product:show</a>
```

Absolutní odkazy zapisujeme analogicky k absolutním cestám na disku, jen místo lomítek jsou dvojtečky. Tedy absolutní odkaz začíná dvojtečkou:

```latte
<a n:href=":Admin:Product:show">odkaz na Admin:Product:show</a>
```

Pro zjištění, zda jsme v určitém modulu nebo jeho submodulu, použijeme funkci `isModuleCurrent(moduleName)`.

```latte
<li n:class="isModuleCurrent('Forum:Users') ? active">
<a n:href="Product:">...</a>
</li>
```


Routování
---------

Viz [kapitola o routování |routing#Moduly].


Mapování
--------

Mapování definuje pravidla pro odvozování názvu třídy z názvu presenteru. Specifikujeme je v [konfiguraci|configuration] pod klíčem `application › mapping`.

Adresářové struktury uváděné výše na této stránce vycházejí z tohoto mapování:

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

Jak mapování funguje? Pro lepší pochopení si nejprve představme aplikaci bez modulů. Chceme, aby třídy presenterů spadaly do jmenného prostoru `App\UI`, aby se presenter `Home` mapoval na třídu `App\UI\HomePresenter`. Což dosáhneme touto konfigurací:

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

Mapování funguje tak, že název presenteru `Home` nahradí hvězdičku v masce `App\UI\*Presenter`, čímž získáme výsledný název třídy `App\UI\HomePresenter`. Jednoduché!

Jak ale vidíte v ukázkách v této a dalších kapitolách, třídy presenterů umisťujeme do eponymních podadresářů, například presenter `Home` se mapuje na třídu `App\UI\Home\HomePresenter`. Toho dosáhneme zdvojením dvojtečky (vyžaduje Nette Application 3.2):

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

Nyní přistoupíme k mapování presenterů do modulů. Pro každý modul můžeme definovat specifické mapování:

```neon
application:
mapping:
Front: App\UI\Front\**Presenter
Admin: App\UI\Admin\**Presenter
Api: App\Api\*Presenter
```

Podle této konfigurace se presenter `Front:Home` mapuje na třídu `App\UI\Front\Home\HomePresenter`, zatímco presenter `Api:OAuth` na třídu `App\Api\OAuthPresenter`.

Protože moduly `Front` i `Admin` mají podobný způsob mapování a takových modulů bude nejspíš více, je možné vytvořit obecné pravidlo, které je nahradí. Do masky třídy tak přibude nová hvězdička pro modul:

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

Pro vícenásobně zanořené moduly, jako je například presenter `Admin:User:Edit`, se segment s hvězdičkou opakuje pro každou úroveň a výsledkem je třída `App\UI\Admin\User\Edit\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\UI, *, **Presenter]
Api: [App\Api, '', *Presenter]
```

Pokud bychom měli v konfiguraci jen jediné pravidlo, ono obecné, můžeme zkráceně zapsat:

```neon
application:
mapping: App\UI\*\**Presenter
```
{{redirect:directory-structure}}
2 changes: 1 addition & 1 deletion application/cs/routing.texy
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ $router->addRoute('<lang cs|en>', function (string $lang) {
Moduly
------

Pokud máme více rout, které spadají do společného [modulu |modules], využijeme `withModule()`:
Pokud máme více rout, které spadají do společného [modulu |directory-structure#Presentery a šablony], využijeme `withModule()`:

```php
$router = new RouteList;
Expand Down
2 changes: 1 addition & 1 deletion application/cs/templates.texy
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ app/
└── <b>@layout.latte</b> ← jen pro Home, 2. varianta
\--

Pokud se presenter nachází v [modulu|modules], bude se dohledávat i o další adresářové úrovně výš, podle zanoření modulu.
Pokud se presenter nachází v modulu, bude se dohledávat i o další adresářové úrovně výš, podle zanoření modulu.

Název layoutu lze změnit pomocí `$this->setLayout('layoutAdmin')` a pak se bude očekávat v souboru `@layoutAdmin.latte`. Také lze přímo určit soubor se šablonou layoutu pomocí `$this->setLayout('/path/to/template.latte')`.

Expand Down
2 changes: 1 addition & 1 deletion nette/cs/@home.texy
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Aplikace v Nette
- [application:Bootstrap]
- [Presentery |application:presenters]
- [Šablony |application:templates]
- [Moduly |application:modules]
- [Adresářová struktura |application:directory-structure]
- [Routování |application:routing]
- [Vytváření odkazů URL |application:creating-links]
- [Interaktivní komponenty |application:components]
Expand Down
2 changes: 1 addition & 1 deletion nette/cs/glossary.texy
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ Architektura, vycházející z [#Model-View-Controller].

Modul
-----
[Modul |application:modules] představuje v Nette Framework balíček presenterů a šablon, případně i komponent a modelů, které dodávají presenteru data. Je to tedy určitá logická část aplikace.
[Modul |application:directory-structure#Presentery a šablony] představuje v Nette Framework balíček presenterů a šablon, případně i komponent a modelů, které dodávají presenteru data. Je to tedy určitá logická část aplikace.

Například e-shop může mít tři moduly:
1) katalog produktů s košíkem
Expand Down
9 changes: 7 additions & 2 deletions nette/cs/troubleshooting.texy
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,14 @@ Jak změnit či ostranit z URL adresář `www`?
-------------------------------------------
Adresář `www/` používaný u ukázkových projektů v Nette představuje tzv. veřejný adresář neboli document-root projektu. Jde o jediný adresář, jehož obsah je přístupný prohlížeči. A obsahuje soubor `index.php`, vstupní bod, který spouští webovou aplikaci napsanou v Nette.

Pro zprovoznění aplikace na hostingu je potřeba, abyste v konfiguraci hostingu nastavili tzv. document-root do tohoto adresáře. Nebo, pokud hosting má pro veřejný adresář předpřipravenou složku s jiným názvem (například `web`, `public_html` atd.), tak `www/` jednoduše přejmenujte.
Pro zprovoznění aplikace na hostingu je potřeba mít správně nakonfigurovaný document-root. Máte dvě možnosti:
1. V konfiguraci hostingu nastavit document-root na tento adresář
2. Pokud má hosting předpřipravenou složku (např. `public_html`), přejmenujte `www/` na tento název

Řešením **naopak není** zamezit přístupu do všech složek kromě `www/` pomocí pravidel v souboru `.htaccess` nebo v routeru. Pokud by hosting neumožňoval nastavit document-root do podadresáře (tj. vytvářet adresáře o úroveň výš nad veřejným adresářem), poohlédněte se po jiném. Šli byste jinak do značného bezpečnostního rizika. Bylo by to jako bydlet v bytě, kde nejdou zavřít vstupní dveře a jsou stále dokořán.
.[warning]
Nikdy se nesnažte řešit zabezpečení jen pomocí `.htaccess` nebo routeru, které by zamezovaly přístup do ostatních složek.

Pokud by hosting neumožňoval nastavit document-root do podadresáře (tj. vytvářet adresáře o úroveň výš nad veřejným adresářem), poohlédněte se po jiném. Šli byste jinak do značného bezpečnostního rizika. Bylo by to jako bydlet v bytě, kde nejdou zavřít vstupní dveře a jsou stále dokořán.


Jak nastavit server pro hezká URL?
Expand Down

0 comments on commit 321a6c2

Please sign in to comment.