Skip to content

Commit 5d89383

Browse files
committed
structue
1 parent 86d9513 commit 5d89383

12 files changed

+545
-201
lines changed

application/cs/@left-menu.texy

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Aplikace v Nette
44
- [Bootstrap]
55
- [Presentery |presenters]
66
- [Šablony |templates]
7-
- [Moduly |modules]
7+
- [Adresářová struktura |directory-structure]
88
- [Routování |routing]
99
- [Vytváření odkazů URL |creating-links]
1010
- [Interaktivní komponenty |components]

application/cs/bootstrap.texy

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class Bootstrap
6666
index.php
6767
=========
6868

69-
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:
69+
Prvotní soubor je v případě webových aplikací `index.php`, který se nachází ve [veřejném adresáři |directory-structure#verejny-adresar-www] `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:
7070

7171
```php
7272
$bootstrap = new App\Bootstrap;

application/cs/configuration.texy

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ Volba `silentLinks` určuje, jak se Nette zachová ve vývojářském režimu, k
4444

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

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

4949

5050
Automatická registrace presenterů

application/cs/creating-links.texy

+2-2
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ Pokud je cílem akce `default`, můžeme ji vynechat, ale dvojtečka musí zůst
103103
<a n:href="Home:">úvodní stránka</a>
104104
```
105105

106-
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:
106+
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:
107107

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

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

284-
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].
284+
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.
285285

286286
Neplatné odkazy vždy vyhazují `Nette\Application\UI\InvalidLinkException`.

application/cs/directory-structure.texy

+519
Large diffs are not rendered by default.

application/cs/how-it-works.texy

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ Adresářová struktura vypadá nějak takto:
4545
└── <b>.htaccess</b> ← zakazuje přístup do všech adresářů krom www
4646
\--
4747

48-
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].
48+
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.
4949

50-
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].
50+
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.
5151

5252
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.
5353

@@ -75,7 +75,7 @@ Jeho úkolem je:
7575

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

78-
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].
78+
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].
7979

8080
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.
8181

application/cs/modules.texy

+1-183
Original file line numberDiff line numberDiff line change
@@ -1,183 +1 @@
1-
Moduly
2-
******
3-
4-
.[perex]
5-
Moduly vnášejí do Nette aplikací přehlednost díky snadnému členění do logických celků.
6-
7-
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:
8-
9-
/--pre
10-
app/
11-
├── UI/
12-
│ ├── <b>Admin/</b> ← modul Admin
13-
│ │ ├── @layout.latte
14-
│ │ ├── Dashboard/
15-
│ │ │ ├── DashboardPresenter.php
16-
│ │ │ └── default.latte
17-
│ │ └── ...
18-
│ ├── <b>Front/</b> ← modul Front
19-
│ │ ├── @layout.latte
20-
│ │ ├── Home/
21-
│ │ │ ├── HomePresenter.php
22-
│ │ │ └── default.latte
23-
│ │ └── ...
24-
\--
25-
26-
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`:
27-
28-
```php
29-
namespace App\UI\Admin\Dashboard;
30-
31-
class DashboardPresenter extends Nette\Application\UI\Presenter
32-
{
33-
// ...
34-
}
35-
```
36-
37-
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`.
38-
39-
Představená struktura není pevná; můžete si ji zcela [přizpůsobit dle svých potřeb|#mapování] v konfiguraci. .[tip]
40-
41-
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`:
42-
43-
/--pre
44-
app/
45-
├── UI/
46-
│ ├── Admin/
47-
│ │ ├── <b>Accessory/</b>
48-
│ │ │ ├── FormFactory.php
49-
│ │ │ └── AdminLayout.php
50-
│ │ ├── Dashboard/
51-
│ │ └── ...
52-
\--
53-
54-
55-
Vnořené moduly
56-
--------------
57-
58-
Moduly mohou mít více úrovní zanoření, podobně jako adresářová struktura na disku:
59-
60-
/--pre
61-
app/
62-
├── UI/
63-
│ ├── <b>Blog/</b> ← modul Blog
64-
│ │ ├── <b>Admin/</b> ← submodul Admin
65-
│ │ │ ├── Dashboard/
66-
│ │ │ └── ...
67-
│ │ ├── <b>Front/</b> ← submodul Front
68-
│ │ │ ├── @layout.latte
69-
│ │ │ ├── Home/
70-
│ │ │ └── ...
71-
│ ├── <b>Forum/</b> ← modul Forum
72-
│ │ └── ...
73-
\--
74-
75-
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`.
76-
77-
Zanoření může být libovolně hluboké, což umožňuje vytvářet sub-submoduly.
78-
79-
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ší.
80-
81-
82-
Vytváření odkazů
83-
----------------
84-
85-
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:
86-
87-
```latte
88-
<a n:href="Product:show">odkaz na Front:Product:show</a>
89-
```
90-
91-
Odkaz je relativní i pokud je jeho součástí název modulu, ten se pak považuje za submodul:
92-
93-
```latte
94-
<a n:href="Shop:Product:show">odkaz na Front:Shop:Product:show</a>
95-
```
96-
97-
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:
98-
99-
```latte
100-
<a n:href=":Admin:Product:show">odkaz na Admin:Product:show</a>
101-
```
102-
103-
Pro zjištění, zda jsme v určitém modulu nebo jeho submodulu, použijeme funkci `isModuleCurrent(moduleName)`.
104-
105-
```latte
106-
<li n:class="isModuleCurrent('Forum:Users') ? active">
107-
<a n:href="Product:">...</a>
108-
</li>
109-
```
110-
111-
112-
Routování
113-
---------
114-
115-
Viz [kapitola o routování |routing#Moduly].
116-
117-
118-
Mapování
119-
--------
120-
121-
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`.
122-
123-
Adresářové struktury uváděné výše na této stránce vycházejí z tohoto mapování:
124-
125-
```neon
126-
application:
127-
mapping: App\UI\*\**Presenter
128-
```
129-
130-
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í:
131-
132-
```neon
133-
application:
134-
mapping: App\UI\*Presenter
135-
```
136-
137-
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é!
138-
139-
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):
140-
141-
```neon
142-
application:
143-
mapping: App\UI\**Presenter
144-
```
145-
146-
Nyní přistoupíme k mapování presenterů do modulů. Pro každý modul můžeme definovat specifické mapování:
147-
148-
```neon
149-
application:
150-
mapping:
151-
Front: App\UI\Front\**Presenter
152-
Admin: App\UI\Admin\**Presenter
153-
Api: App\Api\*Presenter
154-
```
155-
156-
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`.
157-
158-
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:
159-
160-
```neon
161-
application:
162-
mapping:
163-
*: App\UI\*\**Presenter
164-
Api: App\Api\*Presenter
165-
```
166-
167-
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`.
168-
169-
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:
170-
171-
```neon
172-
application:
173-
mapping:
174-
*: [App\UI, *, **Presenter]
175-
Api: [App\Api, '', *Presenter]
176-
```
177-
178-
Pokud bychom měli v konfiguraci jen jediné pravidlo, ono obecné, můžeme zkráceně zapsat:
179-
180-
```neon
181-
application:
182-
mapping: App\UI\*\**Presenter
183-
```
1+
{{redirect:directory-structure}}

application/cs/routing.texy

+1-1
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ $router->addRoute('<lang cs|en>', function (string $lang) {
368368
Moduly
369369
------
370370

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

373373
```php
374374
$router = new RouteList;

application/cs/templates.texy

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ app/
101101
└── <b>@layout.latte</b> ← jen pro Home, 2. varianta
102102
\--
103103

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

106106
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')`.
107107

nette/cs/@home.texy

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Aplikace v Nette
3737
- [application:Bootstrap]
3838
- [Presentery |application:presenters]
3939
- [Šablony |application:templates]
40-
- [Moduly |application:modules]
40+
- [Adresářová struktura |application:directory-structure]
4141
- [Routování |application:routing]
4242
- [Vytváření odkazů URL |application:creating-links]
4343
- [Interaktivní komponenty |application:components]

nette/cs/glossary.texy

+7-5
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,14 @@ Architektura, vycházející z [#Model-View-Controller].
107107

108108
Modul
109109
-----
110-
[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.
110+
Modul představuje logickou část aplikace. V typickém uspořádání jde o skupinu presenterů a šablon, které řeší určitou oblast funkcionality. Moduly umísťujeme do [samostatných adresářů |application:directory-structure#Presentery a šablony], jako např. `Front/`, `Admin/` nebo `Shop/`.
111111

112-
Například e-shop může mít tři moduly:
113-
1) katalog produktů s košíkem
114-
2) administrace pro zákazníka
115-
3) administrace pro provozovatele
112+
Například e-shop rozdělíme na:
113+
- Frontend (`Shop/`) pro prohlížení produktů a nákup
114+
- Zákaznickou sekci (`Customer/`) pro správu objednávek
115+
- Administraci (`Admin/`) pro provozovatele
116+
117+
Technicky jde o běžné adresáře, které ale díky přehlednému členění pomáhají aplikaci škálovat. Presenter `Admin:Product:List` tak bude fyzicky umístěn například v adresáři `app/Presentation/Admin/Product/List/` (viz [mapování presenterů|application:directory-structure#mapování presenterů]).
116118

117119

118120
Namespace

nette/cs/troubleshooting.texy

+7-2
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,14 @@ Jak změnit či ostranit z URL adresář `www`?
8383
-------------------------------------------
8484
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.
8585

86-
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.
86+
Pro zprovoznění aplikace na hostingu je potřeba mít správně nakonfigurovaný document-root. Máte dvě možnosti:
87+
1. V konfiguraci hostingu nastavit document-root na tento adresář
88+
2. Pokud má hosting předpřipravenou složku (např. `public_html`), přejmenujte `www/` na tento název
8789

88-
Ř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.
90+
.[warning]
91+
Nikdy se nesnažte řešit zabezpečení jen pomocí `.htaccess` nebo routeru, které by zamezovaly přístup do ostatních složek.
92+
93+
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.
8994

9095

9196
Jak nastavit server pro hezká URL?

0 commit comments

Comments
 (0)