Ako vytvoriť a naroutovať moduly
- Čamo
- Člen | 798
Takže vás vítam a prosím niekoho kto v tom má jasno, aby mi to pomohol
vysvetliť.
Tak ja som sa snažil vytvoriť niečo takéto:
app
-presenters
-templates
-components
-model
-router
-config
.htaccess
bootstrap.php
web.config
-BlogModule
--presenters
--templates
K tomu som vytvoril routu
$router[] = new Route('blog/<presenter>[/<action>[/<id>]]');
a umiestnil som ju na koniec(aj na začiatok), ale robí to bordel(niečo ako že nemôže nájsť basepresenter alebo iný presenter v zložke BlogModule(pritom tam sú)).
Tiež ma zaujíma, ako je to v tomto prípade s basepresenterom, alebo s @layout.latte. tie majú byť v každom module, alebo ich stačí mať v zložke app?
Vlastne chcem dosiahnuť niečo takéto:
-app
-blogModule
-presenters
-templates
-eshopModule
-presenters
-templates
-adminModule
-blogModule
-presenters
-templates
-eshopmodule
-presenters
-templates
Editoval Čamo (21. 6. 2014 14:15)
- Mysteria
- Člen | 797
Ne, namespace slouží pro oddělení částí aplikace. Díky namespacům můžeš mít dvě třídy pojmenovaný třeba Table a jednou to může být \Excel\Table, podruhé \Database\Table a podobně. Je to vlastnost PHPčka: http://www.php.net/…mespaces.php
Co se týče modulů v Nette, tak namespace musíš mít v tvém případě ve tvaru
namespace App\BlogModule\Presenters;
To App tam mít samozřejmě nemusíš, já ho tam taky nemám.
Co se týká BasePresenterů, já to řeším tak, že mám jeden společnej pro celou aplikaci v app/presenters a pak mám specifický pro každej modul. Takže typicky třeba presentery AdminModule mám extendovaný od \AdminModule\Presenters\BasePresenter (v něm je třeba kontrola přihlášenosti uživatele) a ten je extendovaný od toho pro celou aplikaci.
Co se týká routování modulů, tak já ho řeším následovně:
$router = new RouteList();
/* Admin Module Router */
$router[] = $adminModuleRouter = new RouteList('Admin');
$adminModuleRouter[] = new Route('admin/<presenter>/<action>', 'Login:login');
/* Cokoliv Module Router */
$router[] = $cokolivModuleRouter = new RouteList('Cokoliv');
$cokolivModuleRouter[] = new Route('admin/<presenter>/<action>', 'Homepage:default');
return $router;
- Čamo
- Člen | 798
Ja už som z toho na větvy.
Pridal som nakoniec routeru toto:
$router[] = $blogModuleRouter = new RouteList('Blog');
$blogModuleRouter[] = new Route('blog/<presenter>/<action>', 'Blog:Homepage:default');
(mimochodom akú úlohu tam zohráva to ..ist(‚Blog‘)?)
Do @layout.latte som pridal odkaz
<li><a n:href="Blog:Drom10:default">Blog:Drom:default</a></li>
a už len to, že som tam pridal ten odkaz začalo hádzať errory:„Class
‚App\BlogModule\Presenters\BasePresenter‘ not found“
Pritom ten presenter exituje.
Tiež nechápem načo mu ten basePresenter vlastne v tejto fáze je.
Už fakt neviem čo mám robiť. Našiel som tento príklad https://github.com/…odules-Usage
Ale tam sú také veci ktoré v dokumentácii nie sú vysvetlené a to žiadna
lama nemá šancu pochopiť.
Editoval Čamo (21. 6. 2014 20:01)
- Čamo
- Člen | 798
No tak som sa trochu posunul zase:
Prepísal som extends na:
class Drom10Presenter extends \App\Presenters\BasePresenter
no a to mi hodí „už“ len chybný odkaz:
<a class=„control“ href=„error: Cannot load presenter
‚Blog:Drom10‘, class ‚App\BlogModule\Presenters\Drom10Presenter‘ was not
found in
‚C:\Apache24\htdocs\nette-blogG\app/BlogModule/presenters/Drom10Presenter.php‘.“>Blog:Drom10</a>
- Čamo
- Člen | 798
V takýchto chvíľach by som sa najradšej kopal do zadku.
Takže
- Namespace nesmie byť iba Blog\Presenters ale App\BlogModule\Presenters
- class XPresenter extends \App\Presenters\BasePresenter
Práve na tých namespacoch všetko padá. Podľa všetkého musia presne kopírovať cestu k súboru. Ale mňa miatlo aj to, že aj keď som mal v tomto presentery všetko ok, tak Nette mi hádzalo na tomto presentery chyby, ktoré našlo vo všetkých ostatných presenteroch v BlogModule(čo som moc nepochopil doteraz). Proste mi v Homepage presentery vyhodilo, že PostPresenter not found, z toho istého dôvodu(zlý namespace). Ale prečo to Nette kontroluje??
Editoval Čamo (24. 6. 2014 10:29)
- Čamo
- Člen | 798
Teraz mi to zase robí bordel v odkazoch v @layout.latte.
<a class=„control“ href=„error: Cannot load presenter
‚Blog:Blog:Drom10‘, class
‚App\BlogModule\BlogModule\Presenters\Drom10Presenter‘ was not found in
‚C:\Apache24\htdocs\nette-blog\app/BlogModule/BlogModule/presenters/Drom10Presenter.php‘.“>Blog:Drom10</a>
- Tomáš Votruba
- Moderator | 1114
Pro absolutní označení modulu je potřeba přidat : na
začátek odkazu:
Viz odkazy
v šablonách níže, případně Generování odkazů
Zkus
<a n:href=":Blog:Blog:Drom10">Blog:Drom10</a>
Editoval Tomáš Votruba (22. 6. 2014 2:50)
- Čamo
- Člen | 798
Prepáčte, prosím, ale mám s tým ešte problém.
Vytvoril som si ešte jeden vnorený modul
App\BlogModule\InModule aby som to riadne vyskúšal a keď
chcem vytvoriť odkaz do toho In modulu
n:href=„:Blog:In:Drom20:default“ tak to generuje
http://localhost/…20**/default
Podľa všetkého je nejaká chyba v route, ktorú mi to nechce akceptovať(tú
prvú preskočí a berie tú druhú):
$router[] = $inModuleRouter = new RouteList('In');
$inModuleRouter[] = new Route('blog/in/<presenter>/<action>');
$router[] = $blogModuleRouter = new RouteList('Blog');
$blogModuleRouter[] = new Route('blog/<presenter>/<action>');
V čom robím chybu?
Editoval Čamo (24. 6. 2014 15:31)