Module

Modulele aduc claritate aplicațiilor Nette, facilitând divizarea ușoară în unități logice.

Similar cu organizarea fișierelor în foldere pe un hard disk, în Nette putem împărți în module prezentatorii, șabloanele și alte clase auxiliare. Cum funcționează acest lucru în practică? Pur și simplu prin încorporarea de noi subdirectoare în structură. Iată un exemplu de structură cu două module, Front și Admin:

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

Această structură de directoare se reflectă în spațiile de nume ale claselor, astfel încât, de exemplu, DashboardPresenter se află în spațiul de nume App\UI\Admin\Dashboard:

namespace App\UI\Admin\Dashboard;

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

În aplicație, ne referim la prezentatorul Dashboard din cadrul modulului Admin folosind notația două puncte ca Admin:Dashboard. Pentru acțiunea default, ne referim la acesta ca Admin:Dashboard:default.

Structura prezentată nu este rigidă; o puteți personaliza complet în funcție de nevoile dumneavoastră în cadrul configurației.

Modulele pot include toate celelalte fișiere, cum ar fi componentele și clasele auxiliare, pe lângă prezentatori și șabloane. Dacă vă gândiți unde să le plasați pe acestea, luați în considerare utilizarea unui dosar Accessory:

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

Module imbricate

Modulele pot avea mai multe niveluri de anvelopare, similar cu o structură de directoare pe un disc:

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

Modulul Blog este împărțit în submodulele Admin și Front. Acest lucru se reflectă și în spațiile de nume, care apar apoi ca App\UI\Blog\Admin și similar. Pentru a ne referi la prezentatorul Dashboard din cadrul submodulului Admin, ne referim la acesta ca Blog:Admin:Dashboard.

Nesting-ul poate fi atât de adânc cât este necesar, permițând crearea de sub-submodule.

De exemplu, dacă în administrație aveți mulți prezentatori legați de gestionarea comenzilor, cum ar fi OrderDetail, OrderEdit, , OrderDispatch, etc., puteți crea un modul Order în care vor fi organizați prezentatori precum Detail, Edit, Dispatch, și alții.

Legăturile din șabloanele de prezentator sunt relative la modulul curent. Astfel, legătura Foo:default duce la prezentatorul Foo din același modul ca și prezentatorul curent. Dacă modulul curent este Front, de exemplu, atunci legătura se prezintă astfel:

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

O legătură este relativă chiar dacă include numele unui modul, care este considerat atunci un submodul:

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

Legăturile absolute sunt scrise în mod analog cu căile absolute de acces de pe disc, dar cu două puncte în loc de bară oblică. Astfel, o legătură absolută începe cu două puncte:

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

Pentru a afla dacă ne aflăm într-un anumit modul sau într-un submodul al acestuia, putem utiliza funcția isModuleCurrent(moduleName).

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

Rutarea

A se vedea capitolul privind rutarea.

Cartografiere

Cartografierea definește regulile de derivare a numelui clasei din numele prezentatorului. Aceste reguli sunt specificate în configurație la cheia application › mapping.

Structurile de directoare menționate anterior pe această pagină se bazează pe următoarea cartografiere:

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

Cum funcționează cartografierea? Pentru o mai bună înțelegere, să ne imaginăm mai întâi o aplicație fără module. Dorim ca clasele de prezentatori să se încadreze în spațiul de nume App\UI, astfel încât prezentatorul Home să fie asociat cu clasa App\UI\HomePresenter. Acest lucru poate fi realizat cu această configurație:

application:
	mapping: App\UI\*Presenter

Această cartografiere funcționează prin înlocuirea asteriscului din masca App\UI\*Presenter cu numele prezentatorului Home, rezultând numele final al clasei App\UI\HomePresenter. Simplu!

Cu toate acestea, după cum puteți vedea în exemplele din acest capitol și din alte capitole, plasăm clasele de prezentatori în subdirectoare eponime, de exemplu, prezentatorul Home este mapat în clasa App\UI\Home\HomePresenter. Acest lucru se realizează prin dublarea asteriscului (necesită Nette Application 3.2):

application:
	mapping: App\UI\**Presenter

Acum, să trecem la maparea prezentatorilor în module. Putem defini mape specifice pentru fiecare modul:

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

În conformitate cu această configurație, prezentatorul Front:Home se mapează la clasa App\UI\Front\Home\HomePresenter, în timp ce prezentatorul Api:OAuth se mapează la clasa App\Api\OAuthPresenter.

Deoarece modulele Front și Admin au o abordare similară de cartografiere și este posibil să existe mai multe astfel de module, este posibil să se creeze o regulă generală care să le înlocuiască. Un nou asterisc pentru modul este adăugat la masca clasei:

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

Pentru modulele imbricate pe mai multe niveluri, cum ar fi prezentatorul Admin:User:Edit, segmentul de asterisc se repetă pentru fiecare nivel, rezultând clasa App\UI\Admin\User\Edit\EditPresenter.

O notație alternativă constă în utilizarea unei matrice compuse din trei segmente în locul unui șir de caractere. Această notație este echivalentă cu cea anterioară:

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

Dacă avem doar o singură regulă în configurație, cea generală, putem scrie pe scurt:

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