Nesoulad snippet a form maker

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

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

takze si predstavme nasledujici kod:

{form myForm}
	{snippet foo}
		{input foo}
	{/snippet}
	{input ok}
{/form}

Jsou tam 2 problemy

  1. pri invalidaci foo nedojde k provedeni toho {form} atd, ale provede se pouze kod onoho snippetu. a tudiz vubec neexistuje promenna $_form
  2. 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.

Quinix
Člen | 108
+
+1
-

Já to dělám takhle…

<div n:snippet="foo">
    {var $_form = $control['form']}
    <input n:name="bar">
    <select n:name="foobar" />
    //atd
</div>

Neni potřeba předávat nic do šablony… ale není to moc pěkný no :-)

japlavaren
Člen | 404
+
-1
-

v renderi v presenteri/komponente zavolaj

<?php
$this->template->_form = $this["myForm"];
?>
akadlec
Člen | 1326
+
0
-

ale to já dělám, já to ohackované mám ale nepříjde mi to příliš košér.

akadlec
Člen | 1326
+
0
-

no v podstatě to šabloně předáš akorát né před renderem ale až během něho ;)

akadlec
Člen | 1326
+
0
-

Takže je to něco co bych dělat neměl, nebo takový bugíg nette? ;)
To poslední řešení s předáním parametrů do snippetu mě taky napadlo a zkoušel jsem ho jestli to tam náhodou David nedal, ale nefunguje :D

japlavaren
Člen | 404
+
0
-

na formulare pouzivam predka. ren ma takto nastanevy render a ani neviem o tom, ze mu nejaky $_form chyba

David Matějka
Moderator | 6445
+
0
-

Ano, nefunguje to kvuli problemu 1) :)

David Matějka
Moderator | 6445
+
0
-

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

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)

Landsman
Člen | 152
+
0
-

Jak tohle řešíte nyní?
Stále stejně?
Mám formulář, který by měl mít x tabů a jednotlivé bych chtěl obalit do snippetů…