Vykreslování chyb ve formulářích

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

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

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

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

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)

Mesiah
Člen | 240
+
0
-

Výborně! Tohle jsem si představoval, děkuji, půjdu vyzkoušet v praxi.

Btw: mohl by jste prosím přidat odkaz, kde můžu více načíst o doplňování prefixů, sufixů a renderingu chyb při renderovaní pomocí {…->label} a {…->control} ?

dakota
Člen | 148
+
0
-

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.