Nette Documentation Preview

syntax
Modulok
*******

.[perex]
A modulok a Nette-alkalmazások áttekinthetőségét segítik elő azáltal, hogy megkönnyítik a logikai egységekre való egyszerű felosztást.

Hasonlóan a fájlok mappákba rendezéséhez a merevlemezen, a Nette-ben modulokba oszthatjuk a prezentereket, sablonokat és más segédosztályokat. Hogyan működik ez a gyakorlatban? Egyszerűen úgy, hogy új alkönyvtárakat építünk be a struktúrába. Íme egy példa egy struktúrára két modullal, a Front és az Admin modulokkal:

/--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
│   │   └── ...
\--

Ez a könyvtárszerkezet tükröződik az osztályok névterében, így például a `DashboardPresenter` a `App\UI\Admin\Dashboard` névtérben található:

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

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

Az alkalmazásban a `Dashboard` bemutatóra a `Admin` modulon belül a `Admin:Dashboard` kettőspont jelöléssel hivatkozunk a . A `default` műveletére `Admin:Dashboard:default` néven hivatkozunk.

A bemutatott struktúra nem merev; a konfigurációban [teljes mértékben az igényeihez igazíthatja |#mapping]. .[tip]

A modulok a prezentereken és sablonokon kívül minden más fájlt, például komponenseket és segédosztályokat is tartalmazhatnak. Ha mérlegeli, hogy hol helyezze el ezeket, fontolja meg a `Accessory` mappa használatát:

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


Beágyazott modulok .[#toc-nested-modules]
-----------------------------------------

A modulok több szinten is egymásba ágyazhatók, hasonlóan a lemezen lévő könyvtárstruktúrához:

/--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
│   │   └── ...
\--

A `Blog` modul `Admin` és `Front` almodulokra oszlik. Ez tükröződik a névterekben is, amelyek aztán `App\UI\Blog\Admin` és hasonló módon jelennek meg. A `Dashboard` bemutatóra a `Admin` almodulon belül `Blog:Admin:Dashboard` néven hivatkozunk.

A beágyazás olyan mély lehet, amilyen mélyre csak szükséges, lehetővé téve al-almodulok létrehozását.

Például, ha az adminisztrációban sok, a rendeléskezeléshez kapcsolódó prezenter van, mint például `OrderDetail`, `OrderEdit`, `OrderDispatch`, stb., létrehozhat egy `Order` modult, amelyben a `Detail`, `Edit`, `Dispatch`, stb. típusú prezentereket szervezi.


Linkek létrehozása .[#toc-creating-links]
-----------------------------------------

A bemutatósablonokban lévő hivatkozások az aktuális modulhoz viszonyítva vannak. Így a `Foo:default` hivatkozás a `Foo` bemutatóhoz vezet, amely ugyanabban a modulban található, mint az aktuális bemutató. Ha az aktuális modul például a `Front`, akkor a link így néz ki:

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

A hivatkozás akkor is relatív, ha egy modul nevét tartalmazza, amely ilyenkor almodulnak minősül:

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

Az abszolút hivatkozások a lemezen lévő abszolút elérési utakhoz hasonlóan íródnak, de a kettőspontok helyett kettőspontokkal. Az abszolút link tehát kettősponttal kezdődik:

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

Hogy megtudjuk, hogy egy adott modulban vagy annak almoduljában vagyunk-e, használhatjuk a `isModuleCurrent(moduleName)` függvényt.

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


Útválasztás .[#toc-routing]
---------------------------

Lásd [az útválasztásról szóló fejezetet |routing#Modules].


A  feltérképezése .[#toc-mapping]
---------------------------------

A leképezés határozza meg az osztálynévnek a bemutató nevéből való származtatásának szabályait. Ezek a szabályok a [konfigurációban |configuration] a `application › mapping` kulcs alatt vannak megadva.

Az ezen az oldalon korábban említett könyvtárszerkezetek a következő leképezésen alapulnak:

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

Hogyan működik a térképezés? A jobb megértés érdekében először képzeljünk el egy modulok nélküli alkalmazást. Szeretnénk, ha a prezenter osztályok a `App\UI` névtérbe tartoznának, így a `Home` prezenter a `App\UI\HomePresenter` osztályhoz tartozik. Ezt a következő konfigurációval érhetjük el:

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

Ez a leképezés úgy működik, hogy a `App\UI\*Presenter` maszkban a csillagot a `Home` prezenter névvel helyettesítjük, így kapjuk a `App\UI\HomePresenter` végső osztálynevet. Egyszerű!

Azonban, ahogyan azt az ebben és más fejezetekben található példákban láthatjuk, a prezenter osztályokat névadó alkönyvtárakba helyezzük, például a `Home` prezenter a `App\UI\Home\HomePresenter` osztályra van leképezve. Ezt a csillag megduplázásával érjük el (Nette Application 3.2 szükséges):

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

Most pedig térjünk rá az előadók modulokba való leképezésére. Minden egyes modulhoz sajátos hozzárendeléseket határozhatunk meg:

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

E konfiguráció szerint a `Front:Home` bemutató a `App\UI\Front\Home\HomePresenter` osztályhoz, míg a `Api:OAuth` bemutató a `App\Api\OAuthPresenter` osztályhoz tartozik.

Mivel a `Front` és a `Admin` modulok hasonló leképezési megközelítéssel rendelkeznek, és valószínűleg több ilyen modul is létezik, létrehozható egy általános szabály, amely ezeket helyettesíti. Az osztálymaszkhoz egy új csillagot adunk a modulhoz:

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

A többszintű, egymásba ágyazott modulok esetében, mint például a `Admin:User:Edit` bemutató, a csillagszegmens minden szinten megismétlődik, így a `App\UI\Admin\User\Edit\EditPresenter` osztály lesz az eredmény.

Egy alternatív jelölés a karakterlánc helyett egy három szegmensből álló tömb használata. Ez a jelölés egyenértékű az előzővel:

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

Ha csak egy szabály van a konfigurációban, az általános szabály, akkor röviden leírhatjuk:

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

Modulok

A modulok a Nette-alkalmazások áttekinthetőségét segítik elő azáltal, hogy megkönnyítik a logikai egységekre való egyszerű felosztást.

Hasonlóan a fájlok mappákba rendezéséhez a merevlemezen, a Nette-ben modulokba oszthatjuk a prezentereket, sablonokat és más segédosztályokat. Hogyan működik ez a gyakorlatban? Egyszerűen úgy, hogy új alkönyvtárakat építünk be a struktúrába. Íme egy példa egy struktúrára két modullal, a Front és az Admin modulokkal:

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

Ez a könyvtárszerkezet tükröződik az osztályok névterében, így például a DashboardPresenter a App\UI\Admin\Dashboard névtérben található:

namespace App\UI\Admin\Dashboard;

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

Az alkalmazásban a Dashboard bemutatóra a Admin modulon belül a Admin:Dashboard kettőspont jelöléssel hivatkozunk a . A default műveletére Admin:Dashboard:default néven hivatkozunk.

A bemutatott struktúra nem merev; a konfigurációban teljes mértékben az igényeihez igazíthatja.

A modulok a prezentereken és sablonokon kívül minden más fájlt, például komponenseket és segédosztályokat is tartalmazhatnak. Ha mérlegeli, hogy hol helyezze el ezeket, fontolja meg a Accessory mappa használatát:

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

Beágyazott modulok

A modulok több szinten is egymásba ágyazhatók, hasonlóan a lemezen lévő könyvtárstruktúrához:

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

A Blog modul Admin és Front almodulokra oszlik. Ez tükröződik a névterekben is, amelyek aztán App\UI\Blog\Admin és hasonló módon jelennek meg. A Dashboard bemutatóra a Admin almodulon belül Blog:Admin:Dashboard néven hivatkozunk.

A beágyazás olyan mély lehet, amilyen mélyre csak szükséges, lehetővé téve al-almodulok létrehozását.

Például, ha az adminisztrációban sok, a rendeléskezeléshez kapcsolódó prezenter van, mint például OrderDetail, OrderEdit, OrderDispatch, stb., létrehozhat egy Order modult, amelyben a Detail, Edit, Dispatch, stb. típusú prezentereket szervezi.

A bemutatósablonokban lévő hivatkozások az aktuális modulhoz viszonyítva vannak. Így a Foo:default hivatkozás a Foo bemutatóhoz vezet, amely ugyanabban a modulban található, mint az aktuális bemutató. Ha az aktuális modul például a Front, akkor a link így néz ki:

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

A hivatkozás akkor is relatív, ha egy modul nevét tartalmazza, amely ilyenkor almodulnak minősül:

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

Az abszolút hivatkozások a lemezen lévő abszolút elérési utakhoz hasonlóan íródnak, de a kettőspontok helyett kettőspontokkal. Az abszolút link tehát kettősponttal kezdődik:

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

Hogy megtudjuk, hogy egy adott modulban vagy annak almoduljában vagyunk-e, használhatjuk a isModuleCurrent(moduleName) függvényt.

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

Útválasztás

Lásd az útválasztásról szóló fejezetet.

A feltérképezése

A leképezés határozza meg az osztálynévnek a bemutató nevéből való származtatásának szabályait. Ezek a szabályok a konfigurációban a application › mapping kulcs alatt vannak megadva.

Az ezen az oldalon korábban említett könyvtárszerkezetek a következő leképezésen alapulnak:

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

Hogyan működik a térképezés? A jobb megértés érdekében először képzeljünk el egy modulok nélküli alkalmazást. Szeretnénk, ha a prezenter osztályok a App\UI névtérbe tartoznának, így a Home prezenter a App\UI\HomePresenter osztályhoz tartozik. Ezt a következő konfigurációval érhetjük el:

application:
	mapping: App\UI\*Presenter

Ez a leképezés úgy működik, hogy a App\UI\*Presenter maszkban a csillagot a Home prezenter névvel helyettesítjük, így kapjuk a App\UI\HomePresenter végső osztálynevet. Egyszerű!

Azonban, ahogyan azt az ebben és más fejezetekben található példákban láthatjuk, a prezenter osztályokat névadó alkönyvtárakba helyezzük, például a Home prezenter a App\UI\Home\HomePresenter osztályra van leképezve. Ezt a csillag megduplázásával érjük el (Nette Application 3.2 szükséges):

application:
	mapping: App\UI\**Presenter

Most pedig térjünk rá az előadók modulokba való leképezésére. Minden egyes modulhoz sajátos hozzárendeléseket határozhatunk meg:

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

E konfiguráció szerint a Front:Home bemutató a App\UI\Front\Home\HomePresenter osztályhoz, míg a Api:OAuth bemutató a App\Api\OAuthPresenter osztályhoz tartozik.

Mivel a Front és a Admin modulok hasonló leképezési megközelítéssel rendelkeznek, és valószínűleg több ilyen modul is létezik, létrehozható egy általános szabály, amely ezeket helyettesíti. Az osztálymaszkhoz egy új csillagot adunk a modulhoz:

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

A többszintű, egymásba ágyazott modulok esetében, mint például a Admin:User:Edit bemutató, a csillagszegmens minden szinten megismétlődik, így a App\UI\Admin\User\Edit\EditPresenter osztály lesz az eredmény.

Egy alternatív jelölés a karakterlánc helyett egy három szegmensből álló tömb használata. Ez a jelölés egyenértékű az előzővel:

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

Ha csak egy szabály van a konfigurációban, az általános szabály, akkor röviden leírhatjuk:

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