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
različica: 4.0