Makro pro trochu jiný formulář

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

Zdravím,
vypisovat formulář do tabulky mi přišlo zbytečné a chtěl jsem raději něco takového: Přístupné formuláře. A jelikož neexistovalo žádné makro pro vypsání chyby, rozhodl jsem se napsat si vlastní makro na celý formulář. Jsem v nette a celkově v OOP nováček, takže ocením jakékoliv vaše názory, připomínky, chyby atd. Hlavně ty podmínky by to chtělo nějak zjednodušit. Předem díky.

$me->addMacro('myform','
	$form = $control[%node.word];
	$legend = %node.args;
	echo $form->getElementPrototype()->addAttributes(%node.array)->startTag(),"\n\t<fieldset>";
	echo "\n\t\t<legend>$legend</legend>\n";
	foreach($form->controls as $name => $field)
		if($form[$name]->hasErrors() && $form[$name]->isRequired())
			echo "\n\t\t",$form[$name]->getLabel()->class("required"),"\n\t\t",$form[$name]->getControl(),"\n\t\t<span class=error>",$form[$name]->errors[0],"</span><br />\n";
		elseif($form[$name]->hasErrors() && !$form[$name]->isRequired())
			echo "\n\t\t",$form[$name]->getLabel(),"\n\t\t",$form[$name]->getControl(),"\n\t\t<span class=error>",$form[$name]->errors[0],"</span><br />\n";
		elseif(!$form[$name]->hasErrors() && $form[$name]->isRequired())
			echo "\n\t\t",$form[$name]->getLabel()->class("required"),"\n\t\t",$form[$name]->getControl(),"<br />\n";
		else
			echo "\n\t\t",$form[$name]->getLabel(),"\n\t\t",$form[$name]->getControl(),"<br />\n";
	echo "\n\t</fieldset>\n",$form->getElementPrototype()->endTag();
');

do šablony poté píšu už pouze toto:

{myform nazevKomponenty "text legendy"}

Editoval cafesk8 (15. 8. 2011 23:46)

Jan Voráček
Člen | 90
+
0
-

Ahoj. Řešit kompletní vykreslení formuláře jenom pomocí makra je sice funkční, ale poměrně nešikovný způsob. Mrkni se například na DefaultFormRenderer a jeho wrappers.

cafesk8
Člen | 103
+
0
-

Díky, takto jsem to chtěl řešit původně ale nevím jak bych do toho zakomponoval ty chyby :/

Jan Voráček
Člen | 90
+
0
-

Makro pro vypsání chyb opravdu není, nicméně se dá použít zápis

{form myForm}
{control $form errors}
{* formularova pole *}
{/form}

Ale pokud by sis udělal vlastní renderer, byl by nesmysl používat makra pro manuální vykreslování – tím vlastně renderer vůbec nepoužiješ. Proto pak stačí formulář vložit jako každou jinou komponentu pomocí makra control:

{control myForm}