Použití kontejnerů – nastavení name na neco[]

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

Zdravím,

řeším jeden (asi jednoduchý problém), ale nevím si rady. Potřebuji vyrobit a vykreslit formulář – ukázka . Problém je v tom, že bych potřeboval mít jména inputů zhruba v takovémto tvaru (nebo podobném):

name=product1[code]
name=product1[count]
name=product2[code]
name=product2[count]

a takto to mít až do desíti (jako na obrázku), aby se mi to pak lépe zpracovávalo.
Zkoušel jsem nějaké pokusy dle tohoto postupu , nicméně se mi nedaří.

Sepsal jsem toto:

$products = $form->addContainer('products');

for ($i = 1; $i <= 10; $i++) {
    $cntProducts = $products->addContainer($i);
    $cntProducts->addText('code', 'Kód produktu')
            ->addCondition(Form::FILLED)
            ->addRule(Form::INTEGER, 'Kód produktu musí být číslo!');
}

To mi sice vygeneruje atributy name ve tvaru products[1][code], ale už nevím jak k tomu přidat ještě těch 10 polí s množstvím. Když toho for cyklu dám kód, který vytváří inputy pro množství, tak dostanu hlášku, že kontejner s daným jménem již existuje (což je logické) a když zase změním název kontejneru třeba na count$i, tak netuším jak to celé v šabloně manuálně přes jeden foreach vykreslit.

Díky za odpověď.

hAssassin
Člen | 293
+
0
-

@chr1s > Nevim ale podle mě musí tohle fungovat (netestováno):

for ($i = 1; $i <= 10; $i++) {
    $cntProducts = $products->addContainer($i);
    $cntProducts->addText('code', 'Kód produktu')
            ->addCondition(Form::FILLED)
            ->addRule(Form::INTEGER, 'Kód produktu musí být číslo!');
    $cntProducts->addText('count', 'Množství')
            ->addCondition(Form::FILLED)
            ->addRule(Form::INTEGER, 'Množství musí být číslo!');
}
chr1s
Člen | 15
+
0
-

Paráda! Funguje, díky moc! Tak to opravdu nevím, co jsem tam vymýšlel za složitosti.

chr1s
Člen | 15
+
0
-

Ještě jeden doplňující dotaz – následujícím kódem daný formulář vykresluju:

{foreach $form["products"]->components as $product}
<tr>
    <td>{$product[code]->control size => 10}</td>
    <td>{$product[count]->control}</td>
</tr>
{/foreach}

Jenže při takto napsaném vykreslování mi to neakceptuje atributy jednotlivých inputů viz atribut size. Netušíte někdo jak na to?

Filip Procházka
Moderator | 4668
+
0
-
<td>{$product[code]->control->size(10)}</td>
chr1s
Člen | 15
+
0
-

Děkuji za pomoc.

petr.pavel
Člen | 535
+
0
-

Ještě dodatek:
Ten formulář vykresluješ ručně jen kvůli nastavení velikosti?
Jestli bys radši používal výchozí renderer, tak můžeš šířku nastavovat přes CSS. Nebo můžeš size nastavit už v továrničce:

$fieldCode = $cntProducts->addText('code', 'Kód produktu');
$fieldCode->getControlPrototype()->size(10);
$fieldCode->addCondition(Form::FILLED)
  ->addRule(Form::INTEGER, 'Kód produktu musí být číslo!');

Editoval petr.pavel (11. 9. 2011 23:51)