Vykreslování chyb ve formulářích
- Mesiah
- Člen | 240
Dobrý den,
prosím Vás, používám Nette 0.9.6 a mám formulář složený z: jména,
emailu a termínu.
Vím, jak tento form ručně vykreslit, jenže bych nerad vykresloval chyby
„pokupě“, tak jako to dělá {control mujForm errors}
ale rád
bych je vykreslil jako v APS.NET WebForms Validatory – u každého prvku
jeho chybu.
Poradíte, jak na to? Jde-li to v Nette vůbec…?
- dakota
- Člen | 148
Môžeš použiť toto:
Presenter
protected function createComponentMujForm()
{
...
$form->addText('name', 'Name')
->setRequired();
...
$renderer = $form->getRenderer();
$renderer->wrappers['label']['container'] = NULL;
$renderer->wrappers['control']['container'] = NULL;
$renderer->wrappers['errors'] = FALSE;
$renderer->wrappers['control']['errors'] = array(
'container' => 'ul class=error',
'item' => 'li',
);
return $form;
}
Šablona
<tr>
<th>{!$form->getRenderer()->renderLabel($form['name'])}</th>
<td>{!$form->getRenderer()->renderControl($form['name'])}</td>
</tr>
V prípade renderLabel($form['name'])
fungujú pri manuálnom
renderovaní formulára aj suffix a requiredsuffix.
$renderer->wrappers['label']['suffix'] = ':';
$renderer->wrappers['label']['requiredsuffix'] = '*';
Prípadne si errory manuálne vypísať:
{if $form['name']->errors}
<ul class="error">{foreach $form['name']->errors as $error}<li>{!$error}</li>{/foreach}</ul>
{/if}
Editoval dakota (16. 1. 2011 9:24)
- Mesiah
- Člen | 240
Ne, tohle neni to co chci.
Představuji si to spíše takto:
{$presenter['reservationForm']->render('begin')}
{$presenter['reservationForm']['name']->label}
{$presenter['reservationForm']['name']->control}
<span><img src="{$basePath}/design/warning.png" />{$presenter['reservationForm']['name']->error}</span>
{$presenter['reservationForm']['email']->label}
{$presenter['reservationForm']['email']->control}
<span><img src="{$basePath}/design/warning.png" />{$presenter['reservationForm']['email']->error}</span>
{$presenter['reservationForm']['select']->label}
{$presenter['reservationForm']['select']->control}
<span><img src="{$basePath}/design/warning.png" />{$presenter['reservationForm']['select']->error}</span>
<br />
{$presenter['reservationForm']['save']->control}
{$presenter['reservationForm']->render('end')}
Co na to Nette?
Editoval Mesiah (15. 1. 2011 22:05)
- dakota
- Člen | 148
Dá sa ešte použiť:
S nastaveným $renderer->wrappers['control']['errors']
:
<td>
{$presenter['reservationForm']['email']->control}
{!$presenter['reservationForm']->getRenderer()->renderErrors($presenter['reservationForm']['email'])}
</td>
Prípadne:
{if $presenter['reservationForm']['email']->errors}
{foreach $presenter['reservationForm']['email']->errors as $error}
<p><img src="{$basePath}/design/warning.png" />{!$error}</p>
{/foreach}
{/if}
Alebo si napísať vlastný renderer. Iné poradiť zatiaľ neviem.
Nette pri manuálnom renderovaní v prípade {…->label}, {…->control} nedopĺňa suffix, requiredsuffix a nerenderuje errory pri položke.
Editoval dakota (15. 1. 2011 22:22)
- dakota
- Člen | 148
Pri
<th>{$presenter['reservationForm']['email']->label}</th>
sa nedá doplniť suffix a requiredsuffix do label, preto odporúčam použiť
<th>{$presenter['reservationForm']->getRenderer()->renderLabel($presenter['reservationForm']['email'])}</th>
kde suffix a requiredsuffix automaticky funguje, treba však nastaviť
$form->getRenderer()->wrappers['label']['container'] = NULL;
aby sa <th><\th>
nevykreslilo dvakrát.
Manuálne vypísanie errorov:
<td>
{$presenter['reservationForm']['email']->control}
<ul class="error" n:if="$presenter['reservationForm']['email']->errors">
<li n:foreach="$presenter['reservationForm']['email']->errors as $error"><img src="{$basePath}/design/warning.png" />{$error}</li>
</ul>
</td>
requiredsuffix v prípade control je možné zapísať aj ako
<span class="required-suffix" n:if="$presenter['reservationForm']['email']->isRequired()">*</span>
Niečo je uvedené v https://forum.nette.org/…0-radku-kodu
Treba to kombinovať a skúšať.
Dúfam, že nová verzia formulárov prinesie lepšie možnosti ohľadom manuálneho renderovania formulára.