Jak vložit element s name=„foo[]“

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

Ahoj,
nemůžu přijít na to, jak do formuláře vložit element, který má na konci jména prázdné hranaté závorky. Nutně to potřebuju – formulář je dynamický a JavaScript na straně klienta může element několikrát zduplikovat. Když se odesílá formulář s několika elementy pojmenovanými foo[], dostanu pak v POST foo jako pole.

Jen tak si to pole pojmenovat nemůžu:
InvalidArgumentException: Component name must be non-empty alphanumeric string, 'foo[]' given.

Našel jsem skoro řešení pomocí FormContainer, ale to mi umožní vytvořit maximálně tak foo[bar], ne foo[]. Navíc je (render dělám manuálně) vykreslování kontejneru o jednom prvku zbytečná otrava.

Zatím mě napadlo akorát tak přiohnout ten regexp v libs/Nette/ComponentModel/ComponentContainer.php, kterým se kontroluje jméno komponenty. Nemám však tušení, co všechno tím můžu rozbít, Nette do hloubky neznám…

Díky za nápady.

Majkl578
Moderator | 1364
+
0
-

Jediné čisté řešení je formulářový kontejner kde uvedeš jeden prvek s názvem např. 0. Stále tu je ale problém, že při přidání javascriptem budou odeslaná data do neexistujících prvků formuláře zahozena.

matto
Člen | 55
+
0
-

Prave riesim to iste.

Tu som nasiel naznacene riesenie: https://forum.nette.org/…e-name-image
Ale neviem s tym nijak pohnut :(

assassik
Člen | 43
+
0
-
<?php
/* opraveno viz níže */
?>

Pomocí JS pak můžeš dál rozšiřovat, ale musíš načítat pole num a zacohvávat pořadí.

Editoval assassik (22. 7. 2010 9:01)

Ola
Člen | 385
+
0
-

Možná bude potřeba první parametr přetypovat na string.

matto
Člen | 55
+
0
-

assassik:

tvoje riesenie bolo nespustitelne tak som vo for cykle zmenil $form["num"] na $container["num"]->getValue()
Co uz som sice spustil, ale nefungovalo to, nakolko z prvkov, ktore boli vytvorene dynamicky sa do formulara neodoslali data.

Btw namiesto addText som pouzival addFile

assassik
Člen | 43
+
0
-

sry, psal jsem to moc poránu když jsem v sobě neměl ani jedno kafe…

Mělo by to ale jít, ujisti se že ti JS vytváří správný kopie.

Možná to chce upravit takhle (jedno z mých starších řešení):

<?php

$form->addHidden("imgs_num");
if(!$form->isSubmitted()){
	$form["imgs_num"]->setValue(1);
}
$imgs = $form->addContainer("imgs");
for($i=1; $i<= intval($form["imgs_num"]->getValue()); $i++){
	$imgs->addFile("img_".$i,"");
}
?>
zephyrus
Člen | 2
+
0
-

Tak jsem to udělal podle assassika:

<?php
$form->addHidden('itemsCount');
if(!$form->isSubmitted()){
	$form['itemsCount']->setValue(1);
}

$container = $form->addContainer('foo');

for ($i = 0; $i < intval($form['itemsCount']->getValue()); $i++) {
	$container->addText((string) $i, 'Foo:');
}
?>

Sice to není tak snadné, jak jsem si představoval, ale funguje to dobře. Díky!