Možná blbý nápad na makro {form} a ulehčení manuálního renderování
- jasir
- Člen | 746
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)
- Ondřej Mirtes
- Člen | 1536
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
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 | 8228
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
Některé věci se vůbec nemusí tak komplikovat. Stačí přidat pár
funkcí do Form
u a FormControl
u:
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 Form
u 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
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
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
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)