Začátečník – dva dotazy

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

Ahoj, mám následující formulář (kontaktní):

$this->form = new Form('contact-form');
$this->form->setAction($this->link("send!"));

//forms config
$this->form->addGroup('Kontaktní formulář');
$this->form->addText('name', 'Jméno:')
           ->addRule(Form::FILLED, 'Vyplňte jméno');

$this->form->addText('phonenumber', 'Telefonní číslo:')
           ->addCondition(Form::FILLED)
            ->addRule(Form::REGEXP,'Neplatné telefonní číslo!','/^(\+420)? ?\d{3} ?\d{3} ?\d{3}$/');

$this->form->addText('email', 'E-mailová adresa:')
           ->addCondition(Form::FILLED)
            ->addRule(Form::EMAIL,'Neplatný e-mail');

$this->form['email']->emptyValue = '@';

$this->form['phonenumber']->addConditionOn($this->form['email'], Form::FILLED, false)
                          ->addRule(Form::FILLED,'Vyplňte aspoň jeden kontaktní údaj');

$this->form['email']->addConditionOn($this->form['phonenumber'], Form::FILLED, false)
                    ->addRule(Form::FILLED,'Vyplňte aspoň jeden kontaktní údaj');

$this->form->addTextArea('text', 'Text', '30', '10')
           ->addRule(Form::FILLED, 'Vyplňte text zprávy');

$this->form->addProtection('Hacking!');

$this->form->addSubmit('ok', 'Odeslat zprávu!');

Jednak mi to nebere ty addConditionOn (nevím, jak je zkonstruovat – měl jsem to na mysli, ta že musí být vyplněn buďto email nebo telefon nebo oba.. prostě alespoň jeden kontaktní údaj…).

A pak mám problém se zobrazením chyb – je to moje první využití NForms, takže vůbec netuším, kde je to zobrazuje, tedy kromě javascriptu. Čekal jsem po reloadu zobrazení chybové hlášky nad formulářem, ale ani ň. Má se to někde povolit/vůbec to NForms neumí/musím si jejich výpis udělat ručně?

Ke zpracování mi předpokládám pak stačí už jen handleSend() a v tom podmínka $this->form->isSubmitted() && $this->form->isValid() a udělat s tím už co potřebuji :)

Díky.

Panda
Člen | 569
+
0
-

Několik poznámek:

Pokud používáš formuláře v Nette aplikaci (což podle volání $this->link("send!") asi používáš), tak používej třídu AppForm:

<?php
$this->form = new AppForm($this, 'contactForm'); // Název komponenty může obsahovat jen a-zA-Z0-9_
?>

Voláním setAction se vůbec netrap, použij event:

<?php
$this->form->onSubmit[] = array($this, 'contactForm_Submit'); // Při odeslání se automaticky zavolá fce contactForm_Submit současného presenteru
?>
<?php
public function contactForm_Submit(Form $form)
{
	$values = $form->getValues();
	try {
		// Zpracování
	} catch (Exception $e) {
		$form->addError($e->getMessage());
	}
}
?>

Tato metoda se navíc volá jen pokud je formulář odeslaný a správně vyplněný, takže se voláním Form::isValid nemusíš obtěžovat.

Negace se u pravidel a podmínek dělá přes bitové operátory, ne přes poslední parametr:

<?php
... addConditionOn($this->form['email'], ~Form::FILLED) ...
?>

Pokud v šabloně formulář renderuješ přes

<?php
{$control->form}
?>

tak by se měly všechny chyby automaticky nad formulářem zobrazovat. Pokud potřebuješ manuální renderování, tak použij něco následujího:

<?php
{$control->form->render('begin')}
{$control->form->render('errors')}

{* Sem přijde manuální renderování formuláře *}

{$control->form->render('end')}
?>

Doufám, že Ti to bude alespoň trochu užitečné…

Ondřej Mirtes
Člen | 1536
+
0
-

Super, všechno zafungovalo jak jsem očekával :)

Ondřej Mirtes
Člen | 1536
+
0
-

Tak přecijen bych něco potřeboval :) Nevím, jak v této struktuře elegantně zobrazit zprávu, že byl formulář správně odeslán (nestačí mi to přes isValid, je to vázané ještě na metodu v modelu, která v případě neúspěšného odeslání e-mailu taky vyhodí výjimku) a případně vyprázdnit/skrýt formulář.

Chtělo by to opak metody addError, tedy addSuccess :))

Honza Marek
Člen | 1664
+
0
-

Což takhle flashMessage?

David Grudl
Nette Core | 8218
+
0
-