Ako vytvoriť a naroutovať moduly

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

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)

matto
Člen | 55
+
0
-

„niečo ako že nemôže nájsť basepresenter alebo iný presenter v zložke BlogModule“
namespaces mas v poriadku?

Čamo
Člen | 798
+
0
-

Podľa toho, čo znamená mať v poriadku namespacy.
Ja tam mám toto:
namespace App\Blog\Presenters;
Ja vlastne doteraz poriadne nechápem, čo pre Nette znamenajú namespacy.
Používajú sa ako cesty? Treba tam mať to App, alebo nie?…

Mysteria
Člen | 797
+
0
-

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
+
0
-

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
+
0
-

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>

Mysteria
Člen | 797
+
0
-

No a máš tam ten prezenter?

C:\Apache24\htdocs\nette-blogG\app/BlogModule/presenters/Drom10Presenter.php

Pokud ne, tak v jaký cestě ho máš?

Čamo
Člen | 798
+
0
-

V takýchto chvíľach by som sa najradšej kopal do zadku.
Takže

  1. Namespace nesmie byť iba Blog\Presenters ale App\BlogModule\Presenters
  2. 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
+
0
-

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
+
0
-

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
+
0
-

Tomáš Totruba:
Díky funguje. Dostal som sa k tomu až dnes…

Čamo
Člen | 798
+
0
-

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)