Možná blbý nápad na makro {form} a ulehčení manuálního renderování

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

Ahoj,

co si myslíte o vytvoření potencionálním makru {form} – má smysl nad tím přemýšlet dál nebo je to pitomost?

	{form loginForm}   {* obstará $form->render('begin'); *}
	{* v tomto kontextu je nyní známá proměnná $form, $error *}
		{form-label login}       {* $form['password']->label *}
		{form-control login}     {* $form['password']->control *}
		{form-label password}
		{form-control password}
		{form-control submitLogin}
	{/form} {* obstará $form->render('end') *}

Editoval jasir (17. 2. 2010 10:20)

Bernard Williams
Člen | 207
+
0
-

Nazdárek,

vypadá to moc pěkně. Takový zápis bych jen uvítal!

Bernard

redhead
Člen | 1313
+
0
-

sem pro

pave.kucera
Člen | 122
+
0
-

Mně se to líbí :)

Ondřej Mirtes
Člen | 1536
+
0
-

Asi by se dalo diskutovat nad syntaxí (mezery místo pomlček a proházení těch klíčových slov), ale jinak to není špatný nápad :)

Honza Marek
Člen | 1664
+
0
-

Taky se mi to líbí. V současné době mi nejvíc vadí, že při manuálním renderování si musím někde form přiřadit do proměnné, abych mohl renderovat jeho jednotlivé prvky.

David Grudl
Nette Core | 8152
+
0
-

Obecně, makra nepodporují zatím tyto typy konstrukcí:

$presenter['loginForm']->getParamId('xx')

$presenter['loginForm']['username']->label nebo control

$presenter['loginForm']['username']->getLabel('own label')

$presenter['loginForm']->errors

nějakou pěknou syntax zvažuju, ale klíčem je makro {control ...}, tj. nemohou být vázány pouze na formuláře. Takže třeba:

{control loginForm-username label}

{control loginForm-username htmlId}

{control loginForm errors}
Panda
Člen | 569
+
0
-

Některé věci se vůbec nemusí tak komplikovat. Stačí přidat pár funkcí do Formu a FormControlu:

Form::extensionMethod('Form::renderBegin', function (Form $form) {
	$form->render('begin');
});

Form::extensionMethod('Form::renderErrors', function (Form $form) {
	$form->render('errors');
});

Form::extensionMethod('Form::renderBody', function (Form $form) {
	$form->render('body');
});

Form::extensionMethod('Form::renderEnd', function (Form $form) {
	$form->render('end');
});

FormControl::extensionMethod('FormControl::renderControl', function (FormControl $control) {
	echo $control->getControl();
});

FormControl::extensionMethod('FormControl::renderLabel', function (FormControl $control) {
	echo $control->getLabel();
});

A v šabloně si pak vesele mohu používat makra v následujícím stylu:

{control loginForm:begin}
	{control loginForm:errors}

	{control loginForm-username:label}
	{control loginForm-username:control}
	{control loginForm-password:label}
	{control loginForm-password:control}

	{control loginForm-submitLogin:control}
{control loginForm:end}

Nette je prostě připravené na vše!

Renderování jednotlivých vlastností se ale bude muset samozřejmě nějak dořešit…

// Doplnění:

Teď mi došlo, že ty extension metody u Formu jsou vlastně zbytečné… Může se použít toto:

{control loginForm begin}
	{control loginForm errors}

	{* ... *}
{control loginForm end}

Editoval Panda (17. 2. 2010 8:09)

iguana007
Člen | 970
+
0
-

Kdyby se jakkoli upravovala mechanika manuálního renderu formulářů, velmi bych (myslím, že nejen já) uvítal možnost zobrazit error pro konkretní prvek na místě, kde se mi to hodí. Resp. mít i možnost nadefinovat, jak takový error bude vypadat.
Ale zároveň bych ponechal volbu zobrazit všechny errory na jednom místě.

srigi
Nette Blogger | 558
+
0
-

iguana007 napsal(a):

Kdyby se jakkoli upravovala mechanika manuálního renderu formulářů, velmi bych (myslím, že nejen já) uvítal možnost zobrazit error pro konkretní prvek na místě, kde se mi to hodí. Resp. mít i možnost nadefinovat, jak takový error bude vypadat.
Ale zároveň bych ponechal volbu zobrazit všechny errory na jednom místě.

+1 Na toto som bol zvyknuty zo Symfony – ten nad elementom formu (input, textarea) renderuje UL-LI zoznam „failov“. Pre koncoveho je to intuitivnejsie, ked vidi chybu pri inkriminovanom policku, ako niekde v vseobecnej oblasti.

jasir
Člen | 746
+
0
-

Co takhle makro {this}:

{* pomlčka - přístup na subcomponentu  *}
{this shoppingCart}
	{this currency = "Kč"} {*setter property*}
	{this design = "Clean"}
	{widget this}          {* použití this v makru widget/control *}
{/this}

U formulářových komponent:

{this loginForm}
	{this-loginName label = "Tvůj cool login"}   {* $thiscontrol['loginName']->label *}
	{this-loginName control}
	{this-password label = "Heslíčko peklíčko"} {* Hi Inza! *}
	{this-password control}
	{this render!} {* $thisControl->render()*}
{/this}

V rámci bloku this je definována proměnná $thisControl.

Ještě mě napadla možná modifikace maker {control} a {widget} na bloková
a uvnitř přistupovat na nově definovaný $thisControl přes
makro {this} či přes nějaké tečkové makro – tečka nahrazuje this, tedy
nějak takto:

	{control loginForm}
		{.design = "Nice"}
		{.-loginName label}
		{.-password label= "The Password"}
		{.render!}
	{/control}

Editoval jasir (17. 2. 2010 22:09)