Nefunguje odesilani formulare (jako komponenta)

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

Ahoj,

narazil jsem na problem, kdy se mi nechce odesilat forumlar, ktery je jako komponenta a ma vlastni sablonu. Kdyz kouknu do zdrojaku, tak vidim, ze formular ma nastavenou action="", takze ne ?do=contactFormSubmitted jak bych ocekaval.

Kde jsem prosim Vas udelal chybu?

komponenta:

class ContactUsFormControl extends Control {
public function render()
	{
		$translator = new MyTranslator($this->lang);

		$form = new Nette\Application\UI\Form;
		$form->setTranslator($translator);
		//$form->getElementPrototype()->class('ajax');
		$form->addTextArea('request', 'form_request')->setRequired('form_require_request');
		$form->addSubmit('send', 'form_send');
		$form->onSuccess[] = callback($this, 'contactFormSubmitted');

		$template = $this->template;
		$template->setFile(dirname(__FILE__) . '/ContactUsForm.phtml');
		$template->form = $form;
		$template->render();
	}

public function contactFormSubmitted($form)
	{
		$this->sendMail($form->getValues());
		$this->flashMessage('form_contact_send', 'ok ajax');

		if (!$this->isAjax()){
			$this->redirect('this');
		} else {
			$this->invalidateControl('form');
			$form->setValues(array(), TRUE);
		}
        }
}

a presenter:

protected function createComponentContactUsForm()
	{
		return new ContactUsFormControl($this->lang);
	}
Jan Voráček
Člen | 90
+
0
-

Formulář nemáš připojený ke komponentě. Doporučuji i v komponentách vytvářet formuláře stejně jako v presenterech – pomocí továrniček:

class ContactUsFormControl extends Control {
public function render()
        {
                $template = $this->template;
                $template->setFile(dirname(__FILE__) . '/ContactUsForm.phtml');
                $template->render();
        }

protected function createComponentForm($name) {
                $translator = new MyTranslator($this->lang);

                $form = new Nette\Application\UI\Form($this, $name);
                $form->setTranslator($translator);
                //$form->getElementPrototype()->class('ajax');
                $form->addTextArea('request', 'form_request')->setRequired('form_require_request');
                $form->addSubmit('send', 'form_send');
                $form->onSuccess[] = callback($this, 'contactFormSubmitted');
                return $form;
        }

public function contactFormSubmitted($form)
        {
                $this->sendMail($form->getValues());
                $this->flashMessage('form_contact_send', 'ok ajax');

                if (!$this->isAjax()){
                        $this->redirect('this');
                } else {
                        $this->invalidateControl('form');
                        $form->setValues(array(), TRUE);
                }
        }
}
tomasnikl
Člen | 137
+
0
-

tak tenhle zpusob mi moc jasny neni.. jakym zpusobem se pote formular vykresli do sablony komponenty (ContactUsForm.phtml)?

//edit>
jo takhle, uz mi to je jasne.. v sablone komponenty potom jen jednoduse: {control form}

Editoval tomasnikl (31. 8. 2011 14:36)

tomasnikl
Člen | 137
+
0
-

tak jsem narazil jeste na jeden problem.. upravuju jeden formular v nejakem jiz hotovem projektu a situace je podobna. Nevidite v kodu nize nejakou chybu? formular se odesle na ?do=objednavkaForm-submit, ale redirect na Homepage:saleComplete jiz nefunguje a formular se ani nezpracuje.

Presenter:

protected function createComponentObjednavkaForm()
	{
		$translator = new MyTranslator($this->lang);
		$form = new Nette\Application\UI\Form;
		$form->setTranslator($translator);
		$form->addText('customerName', 'form_name')
			 ->setRequired('form_require_name');
		//A dalsi a dalsi nedulezite inputy
		$form->addSubmit('send', 'form_send');
		$form->onSuccess[] = callback($this, 'ObjednavkaFormSubmitted');
		return $form;
	}

public function ObjednavkaFormSubmitted($form)
	{
		// Nejake zpracovani formulare a pote:
		$this->redirect('Homepage:saleComplete');
	}

a sablona latte:

{form objednavkaForm}
	<table class="formTable">
		<tr>
			<td>{label customerIn /}</td>
			<td>{input customerIn}</td>
			<td>{label customerTin /}</td>
			<td>{input customerTin}</td>
		</tr>
		<!-- dalsi a dalsi inputy -->
		<tr>
			<td>&nbsp;</td>
			<td colspan="3"><div style="width:150px">{input send}</div></td>
		</tr>
	</table>
{/form}
Jan Voráček
Člen | 90
+
0
-

Nelíbí se mi název metody velkým písmenem (ObjednavkaFormSubmitted), ale to je detail. Nějak nevidím chybu. Zkus si třeba postupně dumpovat v metodě ObjednavkaFormSubmitted a zjišťovat, co všechno se provede.

public function ObjednavkaFormSubmitted($form)
        {
                dump($form);
                // Nejake zpracovani formulare a pote:
                $this->redirect('Homepage:saleComplete');
        }

atd.