
Moduly#
U složitějších aplikací můžeme složky s presentery a šablonami rozčlenit do podadresářů, kterým říkáme moduly. Pokud by naše aplikace obsahovala například moduly Front
a Admin
, její struktura by mohla vypadat takto:
sandbox/
app/ ← adresář s aplikací
AdminModule/ ← modul Admin
presenters/ ← a jeho presentery
templates/ ← a šablony
FrontModule/ ← modul Front
presenters/ ← a jeho presentery
templates/ ← a šablony
...
Moduly nemusí tvořit jen plochou strukturu, lze vytvářet i submoduly atd.
Pokud by součástí modulu Front
byl presenter Product
. Akce show
se pak zapíše jako Front:Product:show
a třída ProductPresenter
se umístí do jmenného prostoru FrontModule
:
namespace FrontModule;
class ProductPresenter extends \Nette\Application\UI\Presenter
{
// ...
}
Config
Dále nesmíme opomenout na application mapping v config souboru. Defaultně máme nastaveno následovně.
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
Config ale změníme takto:
application:
errorPresenter: Error
mapping:
*: *Module\*Presenter
RouterFactory
Poslední věcí je routování. Abychom byli schopni nasměrovat uživatele na dané moduly (a jejich presentery), potřebujeme několik úprav v našich routách. Následující kód ukazuje, jak by naše routy mohly vypadat.
use
Nette,
Nette\Application\Routers\RouteList,
Nette\Application\Routers\Route;
/**
* Router factory.
*/
class
RouterFactory
{
/**
* @return \Nette\Application\IRouter
*/
public
function
createRouter()
{
$router
= new
RouteList();
$admin
= new
RouteList('Admin');
$admin[] = new
Route('admin/<presenter>/<action>[/<id>]', 'Homepage:default');
$router[] = $admin;
$member
= new
RouteList('Customer');
$member[] = new
Route('customer/<presenter>/<action>[/<id>]', 'Homepage:default');
$router[] = $member;
$public
= new
RouteList('Public');
$public[] = new
Route('<presenter>/<action>[/<id>]', 'Public:Homepage:default');
$router[] = $public;
$router[] = new
Route('<presenter>/<action>[/<id>]', 'Public:Homepage:default');
return
$router;
}
}
error page
application: errorPresenter: Error mapping: *: App\Modules\*\Presenters\*Presenter Error: App\Presenters\*Presenter
anebo
$container->getService('application')->errorPresenter = 'Public:Error';