setAction form – nefunguje

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
masterr
Začátečník | 141
+
0
-

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

Milo
Nette Core | 1283
+
0
-

Máš nějaký důvod k použítí Nette\Forms\Form?

Pokud formulář používáš v továrničce, použij Nette\Application\UI\Form. V dokumentaci najdeš jak s ním pak pracovat.

Editoval Milo (26. 7. 2013 14:30)

masterr
Začátečník | 141
+
0
-

předtím jsem tam používal UI\Form a někde na foru jsem tady četl, že to nemám používat, když chci setovat tu akci, tak nevím. Podívám se jaký je v tom rozdíl, každopádně mi to nefunguje ani v jednom.

Majkl578
Moderator | 1364
+
0
-

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

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()?

Neishon
Člen | 3
+
0
-

Tenhle kód dokáže nastavit action. Asi to není úplně správné řešení, ale funguje to.

public function createComponentNastavAkci(){
	$form = new UI\Form($this, 'nastavAkci');
	$form->setAction('zpracuj.php');
	return $form;
}
Milo
Nette Core | 1283
+
0
-

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

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ě)

Milo
Nette Core | 1283
+
0
-

Mícháš pátý přes devátý. Na to se nedá poradit, když neuvedeš kód a nepopíšeš situaci.

masterr
Začátečník | 141
+
0
-

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

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>/]

masterr
Začátečník | 141
+
0
-

Ale matchne, když má default NULL ;)

Edit: to není tak o té komponentě konkrétně jako obecná otázka spíš

Editoval masterr (29. 7. 2013 15:36)

Milo
Nette Core | 1283
+
0
-

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

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

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)