Problém s foreach v šabloně při vykreslení form

jAkErCZ
Člen | 322
+
0
-

Zdravím,
používám ve formu multiplier pro jednodušší vytváření dalšího prvku ve formu ale mám problém že po vytvoření dalšího prvku se mi zduplikuje jak ten původní tak zároveň vytvoří nové a to celé 2×.

Pro lepší vysvětlení přikládám SCREEN

Presenter:

$form = new Form;
        $copies = 1;
        $maxCopies = 10;
        $multiplier = $form->addMultiplier('multiplier', function (\Nette\Forms\Container $container, \Nette\Forms\Form $form) {
            $container->addRadioList('atribut', '', ([
                'window' => \Nette\Utils\Html::el()->setHtml('Okno <img src="http://localhost/ryzi-okna/images/contact/window.png"
                                                          class="img_products">'),
                'door' => \Nette\Utils\Html::el()->setHtml('Dveře <img src="http://localhost/ryzi-okna/images/contact/door.png"
                                                          class="img_products">'),
                'balcony' => \Nette\Utils\Html::el()->setHtml('Balkón <img src="http://localhost/ryzi-okna/images/contact/balcony.png"
                                                         class="img_products" >'),
                'gate' => \Nette\Utils\Html::el()->setHtml('Vrata <img src="http://localhost/ryzi-okna/images/contact/gate.png"
                                                         class="img_products" >'),
            ]))->setRequired();
            $container->addText('width', '')->setRequired();
            $container->addText('height', '')->setRequired();
            $container->addText('pieces', '')->setRequired();
        }, $copies, $maxCopies);
        $multiplier->addCreateButton('Další produkt'); // add one container

Šablona:

<div n:multiplier="multiplier" class="col-lg-12">

                   <div class="panel-group mb-lg" id="accordion" data-toggle="collapse" style="width: 104%;">

                       <div n:foreach="$form['multiplier']->getContainers() as $container" class="panel panel-default">
                           <div class="panel-heading">
                               <h6 class="panel-title">
                                   <a data-toggle="collapse" data-parent="#accordion" href="#collapse{$container->name}">
                                       Produkt {$container->name} {dump $container}
                                       <i class="fa fa-angle-down pull-xs-right"></i>
                                   </a>
                               </h6>
                           </div>

                           <div id="collapse{$container->name}" class="panel-collapse collapse in">
                               <div class="panel-body">

                                       <label class="label-input100" for="atribut">Vyberte
                                           si produkt
                                           *</label>

                                       {foreach $container['atribut']->items as $key => $label}
                                           {label atribut:$key}
                                           {input atribut:$key}
                                       {/foreach}

                                           <label class="label-input100" for="width">Parametry
                                               *</label>
                                       <div class="wrap-input100 rs1-wrap-input100 validate-input"
                                            data-validate="Vložte šířku">
                                           <input n:name="width" id="width" class="input100" type="number"
                                                                 placeholder="Šířka (1000mm)">
                                           <span class="focus-input100"></span>
                                       </div>
                                       <div class="wrap-input100 rs2-wrap-input100 input-reset validate-input"
                                            data-validate="Vložte výšku" style=" float: right;margin: -57px 0;">
                                           <input n:name="height" id="height" class="input100" type="number"
                                                                  placeholder="Výška (1000mm)">
                                           <span class="focus-input100"></span>
                                       </div>
                                       <div class="wrap-input100 rs3-wrap-input100 validate-input"
                                            data-validate="Vložte počet kusů">
                                           <input n:name="pieces" id="pieces" class="input100" type="number"
                                                                  placeholder="Počet kusů">
                                           <span class="focus-input100"></span>
                                       </div>

                               </div>
                           </div>
                       </div>
                   </div>

               </div>

               <div class="container-contact100-form-btn">
                   {btnCreate multiplier class => contact100-form-btn}
               </div>

CO sem udělal blbě že to nedělá vše pouze 1 tak jak má..

Díky

Ondřej Kubíček
Člen | 494
+
0
-

co čekáš když máš v šabloně n:multiplier, což je makro které vytvoří foreach a iteruje nad všemi kontejnery a pak uvnitř toho to ještě jednou iteruješ sám

<div n:multiplier="multiplier">
	...
	<div n:foreach="$form['multiplier']->getContainers() as $container" class="panel panel-default">
jAkErCZ
Člen | 322
+
0
-

Ondřej Kubíček napsal(a):

co čekáš když máš v šabloně n:multiplier, což je makro které vytvoří foreach a iteruje nad všemi kontejnery a pak uvnitř toho to ještě jednou iteruješ sám

<div n:multiplier="multiplier">
	...
	<div n:foreach="$form['multiplier']->getContainers() as $container" class="panel panel-default">

A mohu to co mám $form[‚multiplier‘]->getContainers() as $container nějak dostat do n:multiplier=„multiplier“ ??

David Matějka
Moderator | 6445
+
+2
-

kdyz se kouknes do kodu, tak to makro jen vytvari foreach (v podstate stejny, jako ty pises rucne) a v nem vytvari promenne $_multiplier a $formContainer. takze bud

  1. nepouzivej n:multiplier, ale jen svuj foreach
  2. nebo pouzij n:multiplier a namisto $container pouzijes ty promenne, ktere vytvari
jAkErCZ
Člen | 322
+
0
-

Super díky moc za pomoc :)

jAkErCZ
Člen | 322
+
0
-

David Matějka napsal(a):

kdyz se kouknes do kodu, tak to makro jen vytvari foreach (v podstate stejny, jako ty pises rucne) a v nem vytvari promenne $_multiplier a $formContainer. takze bud

  1. nepouzivej n:multiplier, ale jen svuj foreach
  2. nebo pouzij n:multiplier a namisto $container pouzijes ty promenne, ktere vytvari

Mám jen takový dotaz když zkusil sem použít tedy místo n:multiplier ten můj foreach ale laděnka mi háže

Component with name ‚atribut‘ does not exist.

{foreach $container['atribut']->items as $key => $label}
               {label atribut:$key}
               {input atribut:$key}{$label} <img src="http://localhost/ryzi-okna/images/contact/{$key}.png"
                                             class="img_products">
               {/label}
           {/foreach}

ale přitom když hodím {dump $container}

Nette\Forms\Container #74f6
onValidate => null
currentGroup protected => null
validated private => null
components private => array (4)
atribut => Nette\Forms\Controls\RadioList #403e
generateId => false
separator protected => Nette\Utils\Html #895d { ... }
container protected => Nette\Utils\Html #efe2 { ... }
itemLabel protected => Nette\Utils\Html #2f4a { ... }
checkAllowedValues => true
items private => array (4) [ ... ]
caption => ""
value protected => null
control protected => Nette\Utils\Html #32e9 { ... }
label protected => Nette\Utils\Html #16d9 { ... }
disabled protected => false
errors private => array ()
omitted private => null
rules private => Nette\Forms\Rules #fd73 { ... }
translator private => true
options private => array (2) [ ... ]
parent private => Nette\Forms\Container #74f6 { RECURSION }
name private => "atribut" (7)
monitors private => array (1) [ ... ]
width => Nette\Forms\Controls\TextInput #17de
height => Nette\Forms\Controls\TextInput #933b
pieces => Nette\Forms\Controls\TextInput #fcb4
cloning private => null
parent private => WebChemistry\Forms\Controls\Multiplier #cffb
name private => "0"
monitors private => array ()

Proč mi to dělá?

David Matějka
Moderator | 6445
+
+1
-
  • mohl bys pouzit formContainer makro, ktere zmeni kontext, ze ktereho se budou cist inputs
{formContainer $container}
{input ....}
{/formContainer}
  • pokud bys pouzil to n:multipler, tak tuhle zmenu kontextu by asi melo udelat samo
jAkErCZ
Člen | 322
+
0
-

David Matějka napsal(a):

  • mohl bys pouzit formContainer makro, ktere zmeni kontext, ze ktereho se budou cist inputs
{formContainer $container}
{input ....}
{/formContainer}
  • pokud bys pouzil to n:multipler, tak tuhle zmenu kontextu by asi melo udelat samo

Super opravdu {formContainer $container} to vyřešil :) díky