problem s mapping-om na admin a front

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
stewestw
Člen | 42
+
0
-

Zdravim, chcel by som vas poprosit o pomoc. pokusam sa urobit male CMS, kde by som chcel mat strukturu suborov:

  • app
  • – admin
  • – – loginModule
  • – – productModule
  • – front
  • – – productModule

snazim sa nastavit mapping cez config.neon:

mapping:
                        Admin: Admin\*Module\Presenters\*Presenter
                        front: Front\*Module\Presenters\*Presenter

ale bohuzial ma neroutuje do spravnych modulov
router mam v bootstrap.php nasledovne:

//new router rule
$router = $container->getService('router');

$router[] = $adminSubRouter = new RouteList('Product');
$adminSubRouter[] = new Route('admin/product/<presenter>/<action>', 'Product:default');

$router[] = $adminRouter = new RouteList('Admin');
$adminRouter[] = new Route('admin/<presenter>/<action>', 'Login:default');

prosim o pomoc s mappingom.
dakujem za pomoc.

Filip Klimeš
Nette Blogger | 156
+
+1
-

Myslím, že správně by měly být moduly admin a front a struktura by měla vypadat spíš takhle:

-app
  - AdminModule
    - LoginPresenter
    - ProductPresenter
  - FrontModule
    - ProductPresenter

v configu pak

mapping:
	*: App\*Module\Presenters\*Presenter

a v routeru

new Route('<module>/<presenter>/<action>');
stewestw
Člen | 42
+
0
-

dakujem @FilipKlimeš , toto som mal povodne, len som to chcel mat viac strukturovane, aby som mal ako samostatne moduly napr productModule pre admin a pre front a nasledne ich doplnal ako balicky(moduly) a nie ako presentery. je mozne to neako upravit?

Editoval stewestw (24. 1. 2015 11:51)

Filip Klimeš
Nette Blogger | 156
+
0
-

Aha, takhle. A jaký je přesně problém s routováním?

EDIT: možná by šlo udělat

$adminSubRouter[] = new Route('admin/product/<presenter>/<action>', array('module' => 'Admin:Product', 'presenter' => 'default'));

Editoval FilipKlimeš (24. 1. 2015 12:28)

Mysteria
Člen | 797
+
0
-

Když tu strukturu uděláš takhle, tak to nefunguje? U nějakého staršího projektu jsem to tak měl a žádný mapování jsem řešit nemusel… předpokládám, že ty složky musí mít vždy v názvu Module.

-app
  - AdminModule
    - LoginModule
    - ProductModule
  - FrontModule
    - ProductModule
greeny
Člen | 405
+
+7
-

Pozor, nezaměňovat adresáře a namespace.

Adresáře

Na adresářové struktuře na 99% vůbec nezáleží, např. app/ewifurweoifju/fsdpiucsoi/LoginPresenter.php je naprosto validní umístění presenteru. Nette si ho dokáže dohledat (RobotLoader), pokud má daný presenter správně namespace a aplikace má dobře nastavený mapping.

Mapping

V mappingu uvedeš mapování modulů na namespaces, např.:

mapping:
    SomeModule: App\*Module\Presenters\*Presenter
    AwesomeModule: My\Awesome\App\*Module\*Presenter

Nebo v případě, že máš mapping všude stejnej:

mapping:
    *: App\*Module\Presenters\*Presenter

Namespaces

Na namespace vpodstatě nezáleží, opět je možné použít <?php namespace Abc\Def\Eijwofijsodh\WtfModule ?>, ovšem mapping je potřeba upravit tak, aby s tímto namespacem seděl.

Routing

Pokud v routě dáváš jako defaultní parametry modul, který je vnořený, je potřeba to zapsat Prvni:Druhy notací (výsledek → PrvniModule\DruhyModule). V případě že to nepředáváš jako pole, ale jako string, tak např.: Prvni:Druhy:Homepage:default


Můj názor na tvou strukturu: přijde mi zbytečně komplikovaná. Zanořené moduly už jsou potřeba jen u hodně složitých aplikací. Jedna modulová vrstva + presenter + akce by měla v 99% případů stačit.

stewestw
Člen | 42
+
0
-

Dakujem,
nakoniec som to este raz nahodil cele a na strukturu ako mi radi @Mysteria. Upravil som router nasledne a zbehlo mi to:)

struktura:

- AdminModule
- - LoginModule
- - ProductModule
- FrontModule
- - ....
....

uprava v config.neon (mapping som vratil na povodny)

mapping:
			*: App\*Module\Presenters\*Presenter

uprava v routeri(hlavna zmena, kde som asi robil chybu):

$router = $container->getService('router');

/*namiesto $router[] = $adminSubRouter = new RouteList('Login');*/
$router[] = $adminSubRouter = new RouteList('Admin:Login');

$adminSubRouter[] = new Route('admin/product/<presenter>/<action>','Login:default');

Dakujem vam velmi pekne za pomoc :)