Problém se zanořenými moduly

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

Zdravím,
následující routy mi negenerují URL jaké potřebuji a nedaří se mi přijít nato proč

	$router[] = new Route('//uc.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>/', array(
		'module' => 'Front:UserControl',
		'presenter' => 'Dashboard',
		'action' => 'preview',
		'language' => array(
		    Route::VALUE => 'cs',
		    'fixity' => Route::CONSTANT,
		)
	));

	$router[] = new Route('//forum.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>/', array(
		'module' => 'Front:Forum',
		'presenter' => 'Topics',
		'action' => 'default',
		'language' => array(
		    Route::VALUE => 'cs',
		    'fixity' => Route::CONSTANT,
		)
	));

	$router[] = new Route('//admin.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>/', array(
		'module' => 'Admin',
		'presenter' => 'Dashboard',
		'action' => 'preview',
		'language' => array(
		    Route::VALUE => 'cs',
		    'fixity' => Route::CONSTANT,
		)
	));

	$router[] = new Route('[!<language [a-z]{2,4}>/]<presenter>/<action>', array(
		'module' => 'Front',
		'presenter' => 'Homepage',
		'action' => 'default',
		'language' => array(
		    Route::VALUE => 'cs',
		    'fixity' => Route::CONSTANT,
		)
	));

	$router[] = new Route('<? index\.(php|html?) ?>', array(
		'module' => 'Front',
		'presenter' => 'Homepage',
		'action' => 'default',
	), Route::ONE_WAY);

struktura:

app
- AdminModule

- FrontModule

- - ForumModule
- - - presenters
- - - templates

- - UserControlModule
- - - presenters
- - - templates

- - presenters
- - templates

jsem na www. mám vygenerované odkazy v pořádku:
:Front:About:contacts/cs/about/contacts
:Front:UserControl:Setup:uc.web.loc/cs/setup/
:Front:Forum:Topics:forum.web.loc/cs/
//:Front:About:contactswww.web.loc/cs/about/contacts
//:Front:UserControl:Setup:uc.web.loc/cs/setup/
//:Front:Forum:Topics: → forum.web.loc/cs/

kliknu na odkaz na subdoménu uc. a mám odkazy:
:Front:About:contacts/cs/about/contacts (tady se potřebuju vrátit na :Front)
:Front:UserControl:Setup:/cs/setup/
:Front:Forum:Topics:forum.web.loc/cs/
//:Front:About:contactsuc.web.loc/cs/about/contacts (tady se potřebuju vrátit na :Front)
//:Front:UserControl:Setup:uc.web.loc/cs/setup/
//:Front:Forum:Topics: → forum.web.loc/cs/

když jdu hlouběji tak ok, ale jak chci nahoru tak mi to nevygeneruje správné url :(

už mám z toho v hlavě kukačky :) neví někdo? O:)

Editoval HosipLan (19. 9. 2010 18:47)

Vyki
Člen | 388
+
0
-

Osobně jsem nikdy v routách nepoužil to klíčové slovo module. Vždycky to definuji v klíčí presenter asi nějak takto:

<?php
//match: http://test.l/<module.submodule.subsubmodule.presenter>/<action>
$router[] = new Route('<presenter>/<action>', array(
        'presenter' => 'First:Second:Default',
        'action' => 'defaction',
));

//First = FirstModule
//Second = FirstModule\SecondModule
//Default = FirstModule\SecondModule\DefaultPresenter
//defaction = FirstModule\SecondModule\DefaultPresenter::defaction()
?>

A funguje mi to i pro zanořené moduly. Nemohl by být zádrhel někde v tom? Hází ti to nějakou chybovou hlášku?

Editoval Vyki (19. 9. 2010 19:03)

Filip Procházka
Moderator | 4668
+
0
-

Pokud odmažu všechny module a napíšu je do presenter tak to udělá naprostej hokej v odkazech

Vyki
Člen | 388
+
0
-

Když ta routa je takto

<?php
$router[] = new Route('//uc.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>/', array(
        //'module' => 'Front:UserControl', Front:UserControl přesunuto do klíče presenter před Dashboard
        'presenter' => 'Front:UserControl:Dashboard',
        'action' => 'preview',
        'language' => array(
            Route::VALUE => 'cs',
            'fixity' => Route::CONSTANT,
        )
));
?>

Tak by to mělo fungovat stejně jako ta původní routa. A co ti to píše za chyby?

Editoval Vyki (19. 9. 2010 19:51)

Filip Procházka
Moderator | 4668
+
0
-

chyby to samozřejmě nepíše žádné, jenom mi to generuje nesmyslné routy

jde o to že když jsem v submodulu tak se mi nedaří vygenerovat odkaz na jeho rodičovský modul
z :Front:UserControl:Setup:default nevygeneruju odkaz na :Front:Homepage:default

a vadí mi že do url cpe do klíče presenter i cestu k modulu, kdyby to šlo zakázat tak bych se nejspíš o kousek pohl, ale nikde jsem žádnou takovou direktivu nenašel

Vyki
Člen | 388
+
0
-

Když používáš moduly a submoduly a máš v definici routy v klíči module dán nějaký modul jako výchozí, ale v samotné definici masky routy nikde nemáš <module>, tak se patrně použije pro parametr module ta vždy ta výchozí hodnota.

EDIT: Sice se ti tam cpe celá cesta ale to můžeš eliminovat:

<?php
    Route::addStyle('#pres');
    Route::setStyleProperty("#pres", Route::FILTER_IN, callback('aliasToPresenter'));
    Route::setStyleProperty("#pres", Route::FILTER_OUT,callback('presenterToAlias'));

    $router[] = new Route('<presenter #pres>[/<action>[/<id>]]', array(
        'action' => 'default',
        'id' => NULL,
    ));


    function aliasToPresenter($alias)
    {
        $aliases = array(
            'obchody-a-sluzby' => 'Shops:Category',
            'akce' => 'News:Default',
            'auth' => 'Admin:Auth',
            'pracovni-prilezitosti' => 'Page:Works',
        );
        if(isset($aliases[$alias]))
            return $aliases[$alias];
        else
            return NULL;
    }

    function presenterToAlias($presenter)
    {
        $aliases = array(
            'Shops:Category' => 'obchody-a-sluzby',
            'News:Default' => 'akce',
            'Admin:Auth' => 'auth',
            'Page:Works' => 'pracovni-prilezitosti',
        );

        if(isset($aliases[$presenter]))
            return $aliases[$presenter];
        else
            return NULL;
    }
?>

Editoval Vyki (19. 9. 2010 19:56)

Filip Procházka
Moderator | 4668
+
0
-

ale příjde mi nelogické, že
mám routu, která má platit pouze pro moduly :Front:UserControl:*
a routu pro :Front:Forum:*
a až pod tím je univerzálnější routa :Front:*

jsem ve :Front: a odkazy generuje správně
přejdu do modulu :Front:UserControl: a všechno jako by se generovalo zničeho nic „relativně“ ikdyž vyžaduju absolutní url „//“ aby mi to přepínalo subdoménu

Filip Procházka
Moderator | 4668
+
0
-

tuhle techniku s překladovým slovníkem znám, ale to nechci použít.

problém jsem teď na haluz vyřešil tím, že jsem obecnou routu přepsal na:

$router[] = new Route('//www.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>', array(
        'module' => 'Front',
        'presenter' => 'Homepage',
        'action' => 'default',
        'language' => array(
            Route::VALUE => 'cs',
            'fixity' => Route::CONSTANT,
        )
));

díky za pomoc :)

Vyki
Člen | 388
+
0
-

Pak ale musíš pro každý další modul přidat routu což není moc praktické. Přidat položku do překladového slovníku se mi zdá jednodušší. Určitě to pak bude běhat rychleji než s více routami. Pokud ale nemáš více modulů tak by to asi bylo „dělo na komára“.

Felix
Nette Core | 1196
+
0
-

Mohu se zeptat, nejak jsem nepochopil fungovani volitelnych sekvenci .. K cemu presne se pouziva zapis //

<?php
$router[] = new Route('//www.web.loc/[!<language [a-z]{2,4}>/]<presenter>/<action>',(...),(...));
?>

Predem dekuji za vysvetleni.

Aurielle
Člen | 1281
+
0
-

Zápis // nemá s volitelnými sekvencemi nic společného, používá se pro generování absolutní cesty, tedy včetně domény.