snippet na část formuláře nefunguje?
- joseff
- Člen | 233
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.
- joseff
- Člen | 233
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
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
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
.
- joe
- Člen | 313
@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
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
@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
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 :-(
- bojovyletoun
- Člen | 667
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.
- Dovnitř snippetu dej i makro {form}. Nedefinovanou proměnnou to hlásí, protože proměnná form se nedostane do snippetu.
- Trochu hack by bylo si tu proměnnou opět
definovat
{var $form => $control['formular']}
- joe
- Člen | 313
@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
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
@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í:
- 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.
- 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)
- Filip Procházka
- Moderator | 4668
@**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
@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
Nejdelší je tam asi mazání komponent, bez toho by to nemělo smysl a formuláře by se mohly rozpadat.
- joe
- Člen | 313
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.