Jak vložit element s name=„foo[]“
- zephyrus
- Člen | 2
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.
- matto
- Člen | 55
Prave riesim to iste.
Tu som nasiel naznacene riesenie: https://forum.nette.org/…e-name-image
Ale neviem s tym nijak pohnut :(
- matto
- Člen | 55
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
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
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!