Formulář se odesílá na špatnou routu

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

Ahoj,
snažím se vytvořit formulář jako komponentu:

// app\adminModule\presenters\EmailsPresenter.php
protected function createComponentAddresForm()
    {
        $form = new Form();
        $form->addText('email', 'E-mail:');
        $form->addSubmit('save', 'Uložit');
        $form->onSuccess[] = callback($this, 'addressFormSubmitted');
        return $form;
    }

Problém je v tom že továrničku mam v modulu admin, přičemž moduly routuju v subdoméně (admin.nadjizerou.l/emails/add)
Routu pro adminModule mam:

// bootstrap.php
new Route('//[www.]<module admin>.<domain nadjizerou.[a-z]{1,3}>/<presenter>/<action>','Summary:default');

Ovšem formulář se odesílá na adresu admin.nadjizerou.l/admin.emails/add?do=addresForm-submit což samozřejmě vyhodí chybu Cannot load presenter ‚Admin:Admin:Emails‘
Již v html formuláře je action="/admin.emails/add?do=addresForm-submit" – správně by mělo být pouze /emails/add?do=addresForm-submit

Prosím o nakopnutí správným směrem co dělám špatně. Chybí mi něco v definici formuláře nebo mam špatně definovanou routu? (běžné zobrazení stránky na základě url funguje správně.) Nebo mam špatně něco úplně jiného? Díky za pomoc.

PS.: Dále se mi nepodařilo přesunout definici formuláře do samostatné třídy a továrničce vytvářet její instanci a přidat ji callback, ale tím se budu zabývat až vyřeším tento problém ;-)

Šroubek
Člen | 8
+
0
-

Tak jsem to vyřešil změnou routy:

new Route('//[www.]<module admin>.nadjizerou.l/<presenter>/<action>','Admin:Summary:default');

Ale nechápu proč mi to nefunguje když chci mít variabilní doménu (vývojovou vs. produkční – nadjizerou.l vs. nadjizerou.cz), tzn pokud místo .nadjizerou.l/ nechám .<domain nadjizerou.[a-z]{1,3}>/
Má někdo nápad jak udělat routu s variabilní doménou při zachování funkčnosti modulu v subdoméně?

Teď už toto vlákno nepatří ani tak do formulářů, ale spíše do routování, tak ho tam případně můžete přeseunout :-o

mildabre
Člen | 62
+
0
-

Šroubek napsal(a):

Tak jsem to vyřešil změnou routy:

new Route('//[www.]<module admin>.nadjizerou.l/<presenter>/<action>','Admin:Summary:default');

Ale nechápu proč mi to nefunguje když chci mít variabilní doménu (vývojovou vs. produkční – nadjizerou.l vs. nadjizerou.cz), tzn pokud místo .nadjizerou.l/ nechám .<domain nadjizerou.[a-z]{1,3}>/
Má někdo nápad jak udělat routu s variabilní doménou při zachování funkčnosti modulu v subdoméně?

Teď už toto vlákno nepatří ani tak do formulářů, ale spíše do routování, tak ho tam případně můžete přeseunout :-o

Jestli to správně chápu tak máš dva vzdálené servery – jeden pro ostrý provoz a jeden pro testovací a jde o to aby routa fungovala nad oběma.

Možná to je úplně blbě (nejsem žádný Nette guru), ale což takhle v bootstrapu jednoduše otestovat pomocí $_SERVER[‚SERVER_NAME‘] kde se aplikace vlastně nachází (doména s koncovkou .l nebo .cz) a pomocí if() rozvětvit na dvě větve se dvěma odlišnými routami.

Šroubek
Člen | 8
+
0
-

Díky za nakopnutí správným směrem – to mě nenapadlo vyžít SERVER_NAME – jak jednoduché a funguje to :-)

$domain = substr($_SERVER['SERVER_NAME'],  strrpos($_SERVER['SERVER_NAME'], ".") + 1);
new Route('//[www.]<module admin>.nadjizerou.' . $domain . '/<presenter>/<action>','Admin:Summary:default');

jen je škoda to nefunguje přímo regulárním výrazem [a-z]{1,3} přímo v routě (stejně jako při běžném použití rout).

Editoval Šroubek (28. 12. 2012 20:26)