setAction form – nefunguje
- masterr
- Začátečník | 141
Mám nette 2.0.5 a továrničku:
protected function createComponentForumTopicsForm()
{
$form = new Nette\Forms\Form();
$form->setAction('ss.php');
$form->setMethod('get');
$container = $form->addContainer($this->forumSelectedTopicsContainer);
foreach ($this->forumThreads as $thread)
$container->addCheckbox($thread->id_thread, $thread->title);
$form->addSubmit('show', 'Zobrazit vybrané');
return $form;
}
podle tohoto článku by to mělo fungovat, ale zůstává mi action pořád „article“. Proč?
Jde o to že mám routu :
$container->router[] = new Route('/<cat_url>/<page>/<id>/<id2>/', array(
'module' => 'Front',
'presenter' => 'Article',
'action' => 'default',
'id' => NULL,
'id2' => NULL,
'cat_url' => '',
));
takže v url nepoužívám jméno presenteru ani akci, to tam mám
defaultně a pak když chci odesílat formulář tak mi to tam hodí
,,/article/?o[11]=on&o[12]=on&show=Zobrazit+vybrané"
ale já potřebuju
,,/cat_url/page/?o[11]=on&o[12]=on&show=Zobrazit+vybrané".
Jak to řešit? Dík
- Majkl578
- Moderator | 1364
Pokud bys pouze měnil metodu, neměl by být s UI\Form problém. Nicméně UI\Form z logických důvodů postrádá smysl ve chvíli, kdy bys měnil action (což děláš) a v tu chvíli je na místě použití Forms\Form.
Správné řešení by stejně bylo form odeslat POSTem a následně přesměrovat.
- masterr
- Začátečník | 141
To nevím proč by to bylo správné řešení, když bych to
přesměrovával na stejnou url jako mi vytvoří ten GET. Chci použít addon forum
akorát mi to dělá problémy kvůli těm mým routám.
Proč tedy nejde setActin()?
- Milo
- Nette Core | 1283
@masterr: Na sandboxu v2.0.5 s Nette v2.0.5 jsem to zkusil a HTML se vygeneruje správně:
public function createComponentForm()
{
$form = new Nette\Forms\Form();
$form->setAction('ss.php');
$form->setMethod('get');
$form->addText('name', 'Name');
$form->addSubmit('show', 'Zobrazit vybrané');
return $form;
}
{block content}
{control form}
<form method="get" action="ss.php" novalidate="">
Seš si jistý, že ta URL na soubor ss.php
je platná, resp.
že ten soubor existuje? Protože jestli ne, web server udělá rewrite na
index.php.
Editoval Milo (27. 7. 2013 10:29)
- masterr
- Začátečník | 141
jj, url neexistovala,
ale není mi jasná jedna věc:
Jsem na url mojedomena.cz/zensky-pohledrwags/lorem-impsun/0/ , ale v action má formulář jen /zensky-pohledrwags/lorem-impsun/ , proč? Dost mi to komplikuje situaci.
(Když mu tam nastavím tu url pomocí setAction tak mi nevleze do toho callbacku v té komponentě, ale jen se znovu vygeneruje stránka…což je nejspíš správně)
- masterr
- Začátečník | 141
Má se to tak, že chci rozjet https://componette.org/search/?…
Jenže mám routy, který v tom dělají bordel, takže se to snažím
upravit.
V akci to můžeš vidět na moje cms
jde o to že IMHO, když vkládám reakci na příspěvěk tak potřebuju id
nadřazeného topicu a to získám
z url /zensky-pohledrwags/lorem-impsun/17(id topicu)/ jenže ta továrnička mi
vytvoří akci /zensky-pohledrwags/lorem-impsun/. Tím pádem tam nemám to
topicId.
(tak jsem si ho tam dával do hidden inputu, ale neřeší to to že je tam input, který bere topicId z té routy, ve které není a přidává tam
if (!$this->forumTopicId)
{
$form->addText('title', 'Titulek:', 50, 100)
->addRule($form::FILLED, 'Titulek musí být vyplněn.');
}
což nemám jak ošetřit, nejde mi brát $form->values při validaci formuláře…takže mi to tam přesto neprojde.)
Jakým způsobem se generuje akce v továrničce? Proč url akce formuláře není shodná s url, kde se formulář vykresluje? Dík moc :)
PS: Moje routa:
$container->router[] = new Route('/<cat_url>/<page>/<id>/<id2>/', array(
'module' => 'Front',
'presenter' => 'Article',
'action' => 'default',
'id' => NULL,
'id2' => NULL,
'cat_url' => '',
));
- Milo
- Nette Core | 1283
To už je lepší :-) Nicméně komponentu nepoužívám, můžeš zkusit topic přímo ke komponentě.
Máš v debugger baru seznam rout a která se matchnula? Routa
/<cat_url>/<page>/<id>/<id2>/
se nematchne,
protože v URL nemáš to druhé ID.
Zkus /<cat_url>/<page>/<id>/[<id2>/]
- Milo
- Nette Core | 1283
masterr napsal(a):
Ale matchne, když má default NULL ;)
Jo, pardon, to jsem popletl.
Proč url akce formuláře není shodná s url, kde se formulář vykresluje?
Používáš Forms\Form
anebo UI\Form
?
Mám za to, že link se tvoří vždy na aktuální
Modul:Presenter:action
, vše ostatní jsou parametry. A jelikož
je nemáš perzistentní, tak se z URL ztratí. No, ale ruku do ohně bych za
to nedal.
Sám bych to řešil klasicky přes UI\Form
, jako hidden si dal
všechny parametry co potřebuju a v onSuccess[]
redirectnul tam,
kam potřebuju s parametry jaké potřebuju.
- Oli
- Člen | 1215
Podivej se sem: Odeslání formuláře uvnitř komponenty způsobí ztrátu parametru v url.
Jestli chápu tvůj problém správně, tak ty klikneš na něco co tě
přesměruje na <page>/<id>/<id2>
a po odeslání
formuláře už máš jen <page>/<id>
? Ve výše
uvedeným odkazu je popsaný jak se redirectnout na stejnou stránku jako ze
které jsi odesílal formulář.
Ono, když se neredirectneš po odeslání formuláře, tak tě to myslím
vrátí zpátky se všema parametrama v actionCokoli($parametry)
.
Takže při odesílání formuláře proběhne standardně životní
cyklus presenteru a až někdy okolo renderCokoli()
se zavolá
ta komponenta. Aspoň myslím, že se to takhle chová. Takže, cokoli co máš
v actionCokoli(/*tyto parametry*/)
by jsi měl být schopen
použít při zprocování formuláře…
- masterr
- Začátečník | 141
Dík, podařilo se mi dostat $id do té akce formuláře:
public function actionDefault($cat_url, $page, $id, $id2)
{
}
Akorát si pořád nevím rady s tím druhým formulářem :(, chová se
uplně jinak než ten na odpoved.
Ten na odpoved, kde jsme řešili to $id má správně akci
action="/zensky-pohled/wcrsf/19/?do=forumControl-forumForm-submit"
Ale ten na vybrané příspěvky má pořád
action="/article/"
Nechápu proč. Proč? Zkoušel jsem mu i tu akci setovat, ale jemu to nejde.
Edit:
protected function createComponentForumTopicsForm()
{
$form = new Nette\Forms\Form();
$form->setAction('/zensky-pohled/lorem-impsun-2/');
$form->setMethod('get');
$container = $form->addContainer($this->forumSelectedTopicsContainer);
foreach ($this->forumThreads as $thread)
$container->addCheckbox($thread->id_thread, $thread->title);
$form->addSubmit('show', 'Zobrazit vybrané');
return $form;
}
Editoval masterr (1. 8. 2013 8:42)