Nesoulad snippet a form maker
- akadlec
- Člen | 1326
Navážu již na existující
téma
Formulář vykresluji ručně a cca v půlce bych potřeboval pár elementů
obalit do snippetu a ten pak podle akce invalidovat a vyhnout se tak nutnosti
překreslovat celý form.
Jak správně na to? Zatím to mám pořešeno tak že si do šablony ještě předám proměnnou $_form kterou použiju v tom snippetu ale to se mě nezdá moc ok.
- David Matějka
- Moderator | 6445
takze si predstavme nasledujici kod:
{form myForm}
{snippet foo}
{input foo}
{/snippet}
{input ok}
{/form}
Jsou tam 2 problemy
- pri invalidaci foo nedojde k provedeni toho
{form}
atd, ale provede se pouze kod onoho snippetu. a tudiz vubec neexistuje promenna$_form
- do bloku/snippetu se posilaji pouze globalni parametry, nikoliv promenne, ktere vznikly behem behu sablony
prvni problem by teoreticky sel vyresit snippet areou
{snippetArea myFormWrapper}
{form myForm}
{snippet foo}
{input foo}
{/snippet}
{input ok}
{/form}
{/snippetArea}
a naslednou invalidaci jak snippety arey, tak samotneho snippetu. Bohuzel, snippet area nezvlada staticke snippety, ale pouze dynamicke snippety, pripadne snippety v inkludovane sablone. Dalo by se to asi oznacit za bug, ale na druhou stranu vzhledem k 2) by kod ve snippetArea nemohl (no dobre, mohl, ale nehezky, viz nize) ovlivnit parametry pro snippet, takze by to bylo trochu zbytecne. Ale zas nevidim duvod, proc by to proste nemohlo fungovat :) (zvlast pokud by se vyresil bod 2) Trochu jsem koukal na implementaci BlockMacros, ale je to hrozna divocina. Napadl me jeden zpusob, jak to trochu refaktorovat (a vyresit ony bugy) a zbavit snippety zavislosti na nette/application, jeste na to o vikendu kouknu.
Druhy problem je myslim jeste komplikovanejsi.
Jedno reseni by bylo posilat do snippetu vsechny promenne, ne pouze ty
„globalni“.
Druhym resenim by mohla byt specifikace promennych, ktere se maji prenest
z nadrazeneho bloku
{snippetArea myFormWrapper}
{form myForm}
{snippet foo, _form=>$_form}
{input foo}
{/snippet}
{input ok}
{/form}
{/snippetArea}
Dalsim hackem, ktery je imho mozny jiz nyni je neco jako
{snippetArea myFormWrapper}
{form myForm}
{? $template->_form = $_form}
{snippet foo}
{input foo}
{/snippet}
{input ok}
{/form}
{/snippetArea}
Tedy poslani lokalni promenne do globalnich parametru.
Vsechno ale spoleha na to, ze bude pokazde vykonan nadrazeny kod.
- japlavaren
- Člen | 404
v renderi v presenteri/komponente zavolaj
<?php
$this->template->_form = $this["myForm"];
?>
- japlavaren
- Člen | 404
na formulare pouzivam predka. ren ma takto nastanevy render a ani neviem o tom, ze mu nejaky $_form chyba
- David Matějka
- Moderator | 6445
Tak jsem se na to kouknul :)
refaktoroval jsem podporu snippetu a vytvoril makro inlineSnippet
,
jeho pouziti by mohlo byt nasledujici: https://gist.github.com/…0b7b084f5544
s tim, ze inlineSnippet:
- musi byt pod makrem snippetArea
- nelze invalidovat samostatne
- ma pristup ke vsem lokalnim promennym nadrazene snippetArey
- pro invalidaci je nutno invalidovat jak snippet areu tak inline snippet (podobne invalidovani snippetu v inkludovanych sablonach)
jeho implementace je podobna dynamickym snippetum, nevytvari se pro ne samostatny blok (funkce), ale jsou inline v nadrazenem bloku (proto ten nazev :))
jeste to trochu zkulturnim a zitra/behem pristiho tejdne poslu nejakej PR
- zimmi
- Člen | 94
Potýkám se s trochu jiným problémem a nejsem si jistý, jestli to s tímhle nějak souvisí, nebo ne, ale zkusím :)
Mám
{form $form}
...
{snippet column}
{input column} // select
{/snippet}
{/form}
V handle
mu nastavím hodnotu podle předchozího selectu a
provedu redraw. Na straně PHP všechno funguje, jak má, akorát
netteForms.js
mi hodí
TypeError: form is null
for (i = 0; i < form.elements.length; i++) { / řádek 367
Snažil jsem se to trochu debugovat a ten form se mi zkrátka někde po cestě v js ztratí. Když ho ale dumpnu v handlu, je vytvořený a existuje. Jakýkoliv nápad vítán.
Nette 2.2 a netteForms.js z boweru.
PS: ehm očividně to má něco společného s toggle, který mám na selectech nastavený.
PPS: stačí se zbavit addConditionOn. Mám rád takové ty dotazy, na které si člověk sám odpoví.
Editoval zimmi (10. 1. 2015 13:29)