Nette Documentation Preview

syntax
Moduli
******

.[perex]
Moduli vnašajo jasnost v aplikacije Nette, saj omogočajo enostavno razdelitev na logične enote.

Podobno kot pri urejanju datotek v mape na trdem disku, lahko v Nette predstavnike, predloge in druge pomožne razrede razdelimo v module. Kako to deluje v praksi? Preprosto z vključevanjem novih podimenikov v strukturo. Tukaj je primer strukture z dvema moduloma, Front in Admin:

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

Ta imeniška struktura se odraža v imenskih prostorih razredov, tako da se na primer `DashboardPresenter` nahaja v imenskem prostoru `App\UI\Admin\Dashboard`:

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

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

V aplikaciji se na predstavnik `Dashboard` znotraj modula `Admin` sklicujemo z uporabo zapisa v dvopičju kot `Admin:Dashboard`. Za njegovo akcijo `default` se sklicujemo na `Admin:Dashboard:default`.

Predstavljena struktura ni toga; v konfiguraciji [jo |#mapping] lahko v [celoti prilagodite svojim potrebam |#mapping]. .[tip]

Moduli lahko poleg predstavnikov in predlog vključujejo tudi vse druge datoteke, kot so komponente in pomožni razredi. Če razmišljate, kam jih umestiti, razmislite o uporabi mape `Accessory`:

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


Vgnezdeni moduli .[#toc-nested-modules]
---------------------------------------

Moduli so lahko vgrajeni na več ravneh, podobno kot struktura imenikov na disku:

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

Modul `Blog` je razdeljen na podmodula `Admin` in `Front`. To se odraža tudi v imenskih prostorih, ki so nato prikazani kot `App\UI\Blog\Admin` in podobno. Če se želimo sklicevati na predstavnik `Dashboard` znotraj podmodula `Admin`, ga imenujemo `Blog:Admin:Dashboard`.

Gnezdenje je lahko tako globoko, kot je potrebno, kar omogoča ustvarjanje podmodulov.

Če imate na primer v administraciji veliko predstavnikov, povezanih z upravljanjem naročil, kot so `OrderDetail`, `OrderEdit`, `OrderDispatch` itd., lahko ustvarite modul `Order`, v katerem bodo organizirani predstavniki, kot so `Detail`, `Edit`, `Dispatch` in drugi.


Ustvarjanje povezav .[#toc-creating-links]
------------------------------------------

Povezave v predlogah za predstavitev so relativne glede na trenutni modul. Tako povezava `Foo:default` vodi do predstavitvene predloge `Foo` v istem modulu kot trenutna predstavitvena predloga. Če je trenutni modul na primer `Front`, potem povezava poteka takole:

```latte
<a n:href="Product:show">link to Front:Product:show</a>
```

Povezava je relativna tudi, če vključuje ime modula, ki se potem šteje za podmodul:

```latte
<a n:href="Shop:Product:show">link to Front:Shop:Product:show</a>
```

Absolutne povezave se zapišejo podobno kot absolutne poti na disku, vendar s podpičjem namesto šumnikov. Tako se absolutna povezava začne z dvopičjem:

```latte
<a n:href=":Admin:Product:show">link to Admin:Product:show</a>
```

Če želimo ugotoviti, ali smo v določenem modulu ali njegovem podmodulu, lahko uporabimo funkcijo `isModuleCurrent(moduleName)`.

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


Usmerjanje .[#toc-routing]
--------------------------

Glejte [poglavje o usmerjanju |routing#Modules].


Kartiranje .[#toc-mapping]
--------------------------

Mapiranje določa pravila za izpeljavo imena razreda iz imena predstavnika. Ta pravila so določena v [konfiguraciji |configuration] pod ključem `application › mapping`.

Strukture imenikov, omenjene prej na tej strani, temeljijo na naslednjem preslikavanju:

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

Kako deluje kartiranje? Za boljše razumevanje si najprej predstavljajmo aplikacijo brez modulov. Želimo, da razredi predstavnikov spadajo v imenski prostor `App\UI`, tako da se predstavnik `Home` preslika v razred `App\UI\HomePresenter`. To lahko dosežemo s to konfiguracijo:

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

Ta preslikava deluje tako, da zvezdico v maski `App\UI\*Presenter` nadomestimo z imenom predstavnika `Home`, s čimer dobimo končno ime razreda `App\UI\HomePresenter`. Preprosto!

Vendar, kot lahko vidite v primerih v tem in drugih poglavjih, umeščamo predstavitvene razrede v istoimenske podimenike, npr. predstavitveni razred `Home` je preslikan v razred `App\UI\Home\HomePresenter`. To dosežemo s podvojitvijo zvezdice (zahteva program Nette Application 3.2):

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

Sedaj se lotimo preslikave predstavnikov v module. Za vsak modul lahko opredelimo posebna preslikavanja:

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

V skladu s to konfiguracijo se predstavnik `Front:Home` prikaže v razred `App\UI\Front\Home\HomePresenter`, predstavnik `Api:OAuth` pa v razred `App\Api\OAuthPresenter`.

Ker imata modula `Front` in `Admin` podoben pristop k preslikavi in ker bo takih modulov verjetno več, je mogoče ustvariti splošno pravilo, ki ju nadomesti. V masko razreda se doda nova zvezdica za modul:

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

Za večnivojske vgnezdene module, kot je predstavnik `Admin:User:Edit`, se segment z zvezdico ponovi za vsako raven, tako da nastane razred `App\UI\Admin\User\Edit\EditPresenter`.

Alternativni zapis je, da namesto niza uporabimo polje, sestavljeno iz treh segmentov. Ta zapis je enakovreden prejšnjemu:

```neon
application:
	mapping:
		*: [App\UI, *, **Presenter]
		Api: [App\Api, '', *Presenter]
```

Če imamo v konfiguraciji samo eno pravilo, splošno, lahko zapišemo na kratko:

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

Moduli

Moduli vnašajo jasnost v aplikacije Nette, saj omogočajo enostavno razdelitev na logične enote.

Podobno kot pri urejanju datotek v mape na trdem disku, lahko v Nette predstavnike, predloge in druge pomožne razrede razdelimo v module. Kako to deluje v praksi? Preprosto z vključevanjem novih podimenikov v strukturo. Tukaj je primer strukture z dvema moduloma, Front in Admin:

app/
├── UI/
│   ├── Admin/            ← Admin module
│   │   ├── @layout.latte
│   │   ├── Dashboard/
│   │   │   ├── DashboardPresenter.php
│   │   │   └── default.latte
│   │   └── ...
│   ├── Front/            ← Front module
│   │   ├── @layout.latte
│   │   ├── Home/
│   │   │   ├── HomePresenter.php
│   │   │   └── default.latte
│   │   └── ...

Ta imeniška struktura se odraža v imenskih prostorih razredov, tako da se na primer DashboardPresenter nahaja v imenskem prostoru App\UI\Admin\Dashboard:

namespace App\UI\Admin\Dashboard;

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

V aplikaciji se na predstavnik Dashboard znotraj modula Admin sklicujemo z uporabo zapisa v dvopičju kot Admin:Dashboard. Za njegovo akcijo default se sklicujemo na Admin:Dashboard:default.

Predstavljena struktura ni toga; v konfiguraciji jo lahko v celoti prilagodite svojim potrebam.

Moduli lahko poleg predstavnikov in predlog vključujejo tudi vse druge datoteke, kot so komponente in pomožni razredi. Če razmišljate, kam jih umestiti, razmislite o uporabi mape Accessory:

app/
├── UI/
│   ├── Admin/
│   │   ├── Accessory/
│   │   │   ├── FormFactory.php
│   │   │   └── AdminLayout.php
│   │   ├── Dashboard/
│   │   └── ...

Vgnezdeni moduli

Moduli so lahko vgrajeni na več ravneh, podobno kot struktura imenikov na disku:

app/
├── UI/
│   ├── Blog/             ← Blog module
│   │   ├── Admin/        ← Admin submodule
│   │   │   ├── Dashboard/
│   │   │   └── ...
│   │   ├── Front/        ← Front submodule
│   │   │   ├── @layout.latte
│   │   │   ├── Home/
│   │   │   └── ...
│   ├── Forum/            ← Forum module
│   │   └── ...

Modul Blog je razdeljen na podmodula Admin in Front. To se odraža tudi v imenskih prostorih, ki so nato prikazani kot App\UI\Blog\Admin in podobno. Če se želimo sklicevati na predstavnik Dashboard znotraj podmodula Admin, ga imenujemo Blog:Admin:Dashboard.

Gnezdenje je lahko tako globoko, kot je potrebno, kar omogoča ustvarjanje podmodulov.

Če imate na primer v administraciji veliko predstavnikov, povezanih z upravljanjem naročil, kot so OrderDetail, OrderEdit, OrderDispatch itd., lahko ustvarite modul Order, v katerem bodo organizirani predstavniki, kot so Detail, Edit, Dispatch in drugi.

Povezave v predlogah za predstavitev so relativne glede na trenutni modul. Tako povezava Foo:default vodi do predstavitvene predloge Foo v istem modulu kot trenutna predstavitvena predloga. Če je trenutni modul na primer Front, potem povezava poteka takole:

<a n:href="Product:show">link to Front:Product:show</a>

Povezava je relativna tudi, če vključuje ime modula, ki se potem šteje za podmodul:

<a n:href="Shop:Product:show">link to Front:Shop:Product:show</a>

Absolutne povezave se zapišejo podobno kot absolutne poti na disku, vendar s podpičjem namesto šumnikov. Tako se absolutna povezava začne z dvopičjem:

<a n:href=":Admin:Product:show">link to Admin:Product:show</a>

Če želimo ugotoviti, ali smo v določenem modulu ali njegovem podmodulu, lahko uporabimo funkcijo isModuleCurrent(moduleName).

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

Usmerjanje

Glejte poglavje o usmerjanju.

Kartiranje

Mapiranje določa pravila za izpeljavo imena razreda iz imena predstavnika. Ta pravila so določena v konfiguraciji pod ključem application › mapping.

Strukture imenikov, omenjene prej na tej strani, temeljijo na naslednjem preslikavanju:

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

Kako deluje kartiranje? Za boljše razumevanje si najprej predstavljajmo aplikacijo brez modulov. Želimo, da razredi predstavnikov spadajo v imenski prostor App\UI, tako da se predstavnik Home preslika v razred App\UI\HomePresenter. To lahko dosežemo s to konfiguracijo:

application:
	mapping: App\UI\*Presenter

Ta preslikava deluje tako, da zvezdico v maski App\UI\*Presenter nadomestimo z imenom predstavnika Home, s čimer dobimo končno ime razreda App\UI\HomePresenter. Preprosto!

Vendar, kot lahko vidite v primerih v tem in drugih poglavjih, umeščamo predstavitvene razrede v istoimenske podimenike, npr. predstavitveni razred Home je preslikan v razred App\UI\Home\HomePresenter. To dosežemo s podvojitvijo zvezdice (zahteva program Nette Application 3.2):

application:
	mapping: App\UI\**Presenter

Sedaj se lotimo preslikave predstavnikov v module. Za vsak modul lahko opredelimo posebna preslikavanja:

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

V skladu s to konfiguracijo se predstavnik Front:Home prikaže v razred App\UI\Front\Home\HomePresenter, predstavnik Api:OAuth pa v razred App\Api\OAuthPresenter.

Ker imata modula Front in Admin podoben pristop k preslikavi in ker bo takih modulov verjetno več, je mogoče ustvariti splošno pravilo, ki ju nadomesti. V masko razreda se doda nova zvezdica za modul:

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

Za večnivojske vgnezdene module, kot je predstavnik Admin:User:Edit, se segment z zvezdico ponovi za vsako raven, tako da nastane razred App\UI\Admin\User\Edit\EditPresenter.

Alternativni zapis je, da namesto niza uporabimo polje, sestavljeno iz treh segmentov. Ta zapis je enakovreden prejšnjemu:

application:
	mapping:
		*: [App\UI, *, **Presenter]
		Api: [App\Api, '', *Presenter]

Če imamo v konfiguraciji samo eno pravilo, splošno, lahko zapišemo na kratko:

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