snippet na část formuláře nefunguje?

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

Zdravím, chtěl jsem si dinamicky přidávat políčka do formuláře, ale když vykresluju formulář přez makro form a do tohoto makra dám snippet, tak mi to uvnitř snippetu hlásí error: undefined variable form. Nevíte někdo co s tím mám dělat?

Když jsem koukal do šablony tak jsem zjistil že latte udělá z každého snippetu block = funkce.

joe
Člen | 313
+
0
-

Jestli to nějak půjde nebo ne, to nevím, co ale rozhodně nechápu je, proč bys ty políčka měl přidávat nějakým požadavkem na server (ať už třeba AJAXovým).

To udělej jednoduše přes JavaScript.

joseff
Člen | 233
+
0
-

No ale když nevíš kolik těch políček bude tak je potřeba je přidávat ajaxově ne? Například uživatel může přidávat telefonní čísla. Mě přijde správně to přidávat ajaxově, jako neajaxově to asi taky půjde, ale to už si můžu rovnou ten formulář napsat ručně, tedy to pak nejde využít vychytávek třídy Form. Nebo snad ano?

joe
Člen | 313
+
0
-

No právě, že nevíš kolik jich bude, proto by políčko kontakty mělo mít název jako pole, například contacts[] a pak jich můžeš bezproblémů přidat kolik chceš, protože obdržíš pole (doufám, že s tím nebude nějaký problém ze strany Nette).

Aby ti to validovalo, tak by pak mělo stačit zkopírovat pravidla z atributu data-nette-rules do nově vytvořeného elementu.

Nevím jaké vychytávky máš na mysli, pokud máš již jedno vstupní pole vygenerované, přijde mi zbytečné generovat další, které bude úplně stejné. Pokud používáš formuláře v aplikaci, pak bys měl používat třídu AppForm a ne Form.

Pokud se ti to nelíbí, tak počkej a třeba ti někdo napíše něco na způsob „like Nette“ :)

Editoval joe (29. 6. 2011 0:08)

Mikulas Dite
Člen | 756
+
0
-

Přes ajax nebo js, to už je jedno, bude s tím hrozně moc psaní. Proč ne, ale už je to několikrát vyřešené, například tady: https://github.com/…plicator.php.

Mimochodem AppForm už neexistuje, v betě jsou \Nette\Forms\Form a \Nette\Application\UI\Form.

22
Člen | 1478
+
0
-

já bych řek, že joseff má na mysli něco, jako dynamické formuláře…
.. například přidáni selectboxu s hodnotami zavislými na jine hodnotě ve formu asi bez ajaxu nezvaliduješ, protože stav odeslání formu musí odpovídat stavu při jeho vytváření, že…

joe
Člen | 313
+
0
-

@Mikulas Dite: S tim Form jsem to nevěděl, nějak nemám pořád důvod začít používat namespace, přijde mi to akorát psaní navíc.

Přes ajax nebo js, to už je jedno

Jedno to není, je to zbytečný požadavek a pokud se Nette chová jako nejrychlejší framework, pak by i práce v něm měla být nějaká rozumná.

@22: Tak to záleží na tom, co potřebuje, ve druhém příspěvku psal třeba přidávání telefonních čísel a to není nic jiného, než opakování řádku

<input name="contact[]" data-nette-rules="...">

protože stav odeslání formu musí odpovídat stavu při jeho vytváření, že…

Byl by problém i s tím přidáváním tohoto řádku, pokud by ve výchozím stavu zobrazení byl jeden takový input a další se přidávaly JavaScriptem?

Editoval joe (29. 6. 2011 0:14)

joseff
Člen | 233
+
0
-

22 napsal(a):

já bych řek, že joseff má na mysli něco, jako dynamické formuláře…
.. například přidáni selectboxu s hodnotami zavislými na jine hodnotě ve formu asi bez ajaxu nezvaliduješ, protože stav odeslání formu musí odpovídat stavu při jeho vytváření, že…

Ano děkuji. To telefoní číslo byl asi blbý příklad. Je sice pravda, že řadu věcí lze vyřešit i bez ajaxu, ale mě by právě zajímalo jak to vyřešit s ajaxem.

22
Člen | 1478
+
0
-

@joe: ..je to bezpečnostní mechanismus proti podstrčení hodnot. Nebo jakým způsobem to chceš mít definováno v php? Nette ví, kolik, prvků má form při vytváření, takže když mu tam nějaké nasypeš javascriptem bez toho, aby jsi mu nějakým způsobem upravil komponentu, tak ta validace na serveru selže.

Editoval 22 (29. 6. 2011 0:55)

joseff
Člen | 233
+
0
-

Jak nad tim tak přemýšlím, tak myslím že přes AJAX to má další výhody, např. když má uživatel vypnutý javascript? Sice nebude aplikace fungovat ajaxově, ale aspoň bude fungovat (pole se budou přidávat) i když by šlo např. „jen“ o tel. číslo. Nicméně stále nevím jak to udělat :-(

22
Člen | 1478
+
0
-

potřebuješ k tomu kontainer, hledej tady foru addContainer, napsal bych ti příklad, ale nestíham, pokud nepochopíš, tak něco pošlu odpoledne.

bojovyletoun
Člen | 667
+
0
-

Co se týče způsobu přidávání dynamických prvků ti neporadím, nepoužíval jsem je ještě. Jen vím jak vyřešit aktuální problém.

  1. Dovnitř snippetu dej i makro {form}. Nedefinovanou proměnnou to hlásí, protože proměnná form se nedostane do snippetu.
  2. Trochu hack by bylo si tu proměnnou opět definovat {var $form => $control['formular']}
joseff
Člen | 233
+
0
-

Zdravím, děkuji mockrát snad to dnes večer vyzkouším :-) (jak kontejner tak ten form, tak jsem zvědav…)

joe
Člen | 313
+
0
-

@22: Vím o tom, že tam něco takového je. Možná jsem čekal, že pokud to bude v kontejneru, tak to bude fungovat.

Kvůli té bezpečnosti, může to někdo napsat konkrétně? Například u select boxu to je jasné (třeba co položka, to id, které nemůžu zvolit jiné, než bylo v seznamu), ale jaký smysl to má například v tom, že nemůžu ani přidat své vlastní inputy a ty dál z formuláře číst? Nevidím tam nějaký bezpečnostní problém, tak kdyžtak mě někdo nakopněte :)

Právě něco takového potřebuju a přijde mi celkem nesmyslné k přidání/odstranění nějakého inputu používat AJAX. To si pro mé položky (co vytvořím JavaScriptem) jednoduše sáhnu přímo do $_POST.

edit: upraveny nesmyslné věty :)

Editoval joe (26. 7. 2011 22:46)

Filip Procházka
Moderator | 4668
+
0
-

Ty si opravdu myslíš že tak dlouhý spletenec kódu bude někdo číst? Je sice pěkné, že tam máš komentáře a asi ti to dalo dost práce, ale většina lidí takové náklaďáky kódu prostě studovat nebude. Tím tě nechci odrazovat od rad kolegům, ale zkus prosím zvolit jinou formu.

joe
Člen | 313
+
0
-

@tatyalien:
Díky za tvůj kód, pochopil jsem to z něj, jak to máš vyřešené. Mně se ale na takovém řešení nelíbí to, že pokud chceš přidat další zboží, celá stránka se ti načte znovu. Možná by to šlo vyřešit přes AJAX (to já ale taky nechci). Chci nějaký odkaz/tlačítko „Přidat řádek“, který při kliknutí přidá nový řádek s nějakýma inputama a v tu dobu nebude se serverem nijak komunikovat. Znám tři řešení, ale ani jedno se mi moc nelíbí:

  1. Dát nějaký maximální počet (třeba pokaždé vygeneruješ řádky pro 5 zboží, zobrazíš jeden a pomocí JS je budeš zobrazovat/skrývat). Jseš omezený na počet.
  2. To jsem použil ve svém projektu, že si vytvořím skryté pole, do kterého před odesláním nasypu nějakým separátorem oddělené hodnoty a ty si pak na serveru zpracuju. Je závislé na JS.

3. Vytvářet pole jak se ti chce v JavaScriptu a na serveru kontrolovat pole $_POST a v případě chyby generovat tolik políček, kolik se odeslalo. To bude asi nejlepší řešení, ale zase je třeba řešit generování upraveného formuláře v případě chyb.

Editoval joe (26. 7. 2011 23:07)

tatyalien
Člen | 239
+
0
-

@HosipLan Ok, smazáno.

@Joe a zase jsi omezenej při tom, když má uživatel vyplej javascript. Případně co se stane, když bude nějaká chyba… vygeneruje se znovu formulář a budou tam i zadané údaje, nebo mu to „zmizne“?

Editoval tatyalien (26. 7. 2011 23:12)

Filip Procházka
Moderator | 4668
+
0
-

@**Joe**: Mám pro tebe další variantu, použij hotovou komponentu.

  • Uprav si vzorový formulář podle svých představ
  • napiš si javascript, který bude doplňovat prvky (nezávisle na javascriptu můžeš mít server-side řešení, jako mám já teď v sandboxu a formulář bude tudíž nezávislý na JS)
  • formulář odešli
  • replicator je automaticky všechny zpracuje

PS: využívá třetí variantu

Editoval HosipLan (26. 7. 2011 23:21)

joe
Člen | 313
+
0
-

@tatyalien: Ta věc, pro kterou jsem to dělal je stejně závislá na JavaScriptu, takže se nic neděje. Při chybě dostanu data v tom skrytém poli a zase si je pomocí JS zpracuju.

@HosipLan: Díky, na to jsem dneska už na fóru někde narazil, kouknu na to, jenom se mi to zdá nějaké dlouhé na celkem jednoduchou věc (rád řešim věci jednoduše :) asi to je promakané, vyzkouším to)

Filip Procházka
Moderator | 4668
+
0
-

Nejdelší je tam asi mazání komponent, bez toho by to nemělo smysl a formuláře by se mohly rozpadat.

joe
Člen | 313
+
0
-

Funguje to dobře (myslím, že něco takového by mělo být v Nette – ve videu z WebExpa jsem tam viděl addDynamic).

Jenom teda velká škoda je, že to asi není možný udělat tak, aby jména těch inputů nebyly indexovaný, ale například names[], phones[], … apod., protože pak se to zase dělá složitěji přes JavaScript.