Začátečník – dva dotazy
- Ondřej Mirtes
- Člen | 1536
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
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
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 :))