Manuální vykreslení formuláře – Multiplier + Replicator

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

Zdravím,
mám dynamicky generovaný formulář, který potřebuji manuálně vykreslit (opravdu nevím kolik a jaké položky ve formuláři budou, vše je načítano z DB).

Formulář se opakuje na stránce několikrát takže je generovaný přes Multiplier. Může také obsahovat 0-X addDynamic také s generovaným obsahem.

Pokud nechám vykreslit formulář Nette automaticky, nějaké prvky se vykreslí jinak než potřebuji. Jedinou volbou je vykreslit formulář manuálně a navolit si html/css dle potřeby pro různé prvky.

A to je pro mě ten problém. Zkusil jsem formulář vygenerovat takto:

{form form}
    <table>
        {foreach $form->getControls() as $sid => $cntrl}
            <tr>
                <td>{label $cntrl /}</td>
                <td>{input $cntrl}</td>
            </tr>
        {/foreach}
    </table>
{/form}

Formulář vykreslí všechny prvky, ale nevykreslí například skupiny, které jsem definoval pomocí addGroup().

Nevíte někdo prosím jak na to?

Díky

EDIT:
Pokud form vykreslím takto:

{form form}
    <table>
        {foreach $form->getGroups() as $key => $group}
            <th>
                <hr>
                <h3>{$key}</h3>
                <hr>
            </th>
            {foreach $group->getControls() as $sid => $cntrl}
                <tr>
                    <td>{label $cntrl /}{input $cntrl}</td>
                </tr>
            {/foreach}

        {/foreach}

    </table>
{/form}

Tak jsem si zobrazil rozložení do skupin, ale pro změnu ve formuláři nemám tlačítka Add a Submit…

EDIT2:
Asi nejnadějnější pokus je tento:

			{foreach $form->getComponents() as $sid => $cntrl}
    {if $cntrl instanceof Kdyby\Replicator\Container}
        {foreach $cntrl->getControls() as $key => $c}
            <tr>
                 <td>{label $c /}{input $c}</td>
            </tr>
        {/foreach}
    {else}
        <tr>
            <td>{label $cntrl /}{input $cntrl}</td>
        </tr>
    {/if}
{/foreach}

Vykreslí vše krom rozdělení do skupin (addGroup). U této varianty vím co je z replikátoru a co není. Což potřebuju. Nevíte prosím jak vyřešit ty skupiny?

Editoval Croc (9. 4. 2017 19:30)

Croc
Člen | 270
+
0
-

Tak jsem postoupil malinko dále. U replikátoru jsem schopen vypsat název skupiny:

{foreach $form->getComponents() as $sid => $cntrl}
           {if $cntrl instanceof Kdyby\Replicator\Container}
               <tr>
                   <td>{$cntrl->getCurrentGroup()->getOption('label')}</td> // vypsání názvu skupiny
               </tr>
                 {foreach $cntrl->getControls() as $key => $c}
                     <tr>
                          <td>{label $c /}{input $c}</td>
                     </tr>
                 {/foreach}
             {else}
                 <tr>
                     <td>{label $cntrl /}{input $cntrl}</td>
                 </tr>
             {/if}
         {/foreach}

Nevíte jak tedy získat název skupiny pro ostatní atributy (které nejsou v replikátoru)? Díky

Croc
Člen | 270
+
0
-

Nikdo neví co s tím? Nikdo nikdy nic podobného neřešil a nevyřešil?

novaCZek
Člen | 8
+
0
-

taky by se mi to ted hodilo…

novaCZek
Člen | 8
+
0
-

a podle me staci toto:
(jen v late…)

{foreach $form->controls as $name ⇒ $field}
{label $name /}
{input $name}
{/foreach}

Croc
Člen | 270
+
0
-

Přidávám pro ostatní řešení jak mám udělané řešení já. Jen jsem místo nefunkčního Kdyby/Replicator použil funkční a aktuální WebChemistry/Multiplier:

Latte šablona:

{form itemForm}
    <div class="col-sm-12">
        {snippet itemForm}

            {var $oldGroup = ''}
            {var $form = $control['itemForm']}

            {foreach $form->getComponents() as $sid => $cntrl}

                {if $cntrl instanceof WebChemistry\Forms\Controls\Multiplier}
// vykreslení replicator atributů
                    <div class="col-sm-12">
                        <br>
                        <h3>{$cntrl->getCurrentGroup()->getOption('label')}</h3>
                        <hr>
                    </div>

                    <div class="col-sm-12">
                        {foreach $cntrl->getControls() as $key => $c}
                            {if $c instanceof Nette\Forms\Controls\TextInput || $c instanceof Nette\Forms\Controls\SelectBox || $c instanceof Nette\Forms\Controls\SubmitButton
                            || $c instanceof Nette\Forms\Controls\Checkbox || $c instanceof Nette\Forms\Controls\CheckboxList}
                                {if $c->getName() == 'multiplier_creator'}
                                    <div class="col-sm-12">
                                        <br>
                                {elseif $c->getName() == 'multiplier_remover'}
                                        <div class="col-sm-3">
                                        <br>
                                {else}
                                    <div class="col-sm-3 subject-header-input">
                                {/if}
                                    {label $c /}{input $c}
                                </div>

                                {if $c->getName() == 'multiplier_remover'}
                                    </div>
                                    <div class="col-sm-12">
                                {/if}

                                {if $c->getName() == 'dummy_format'}
                                    </div>
                                    <div class="col-sm-12">
                                {/if}
                            {/if}

                        {/foreach}
                    </div>
                {else}
// vykreslení normálních atributů
                    {var $newGroup = $cntrl->getOption('group')}
                    {if $cntrl instanceof Nette\Forms\Controls\TextInput || $cntrl instanceof Nette\Forms\Controls\SelectBox
                    || $cntrl instanceof Nette\Forms\Controls\SubmitButton || $cntrl instanceof Nette\Forms\Controls\Checkbox
                    || $cntrl instanceof Nette\Forms\Controls\CheckboxList}
                        {if $newGroup != $oldGroup}
                            <div class="col-sm-12">
                                <br>
                                <h3>{$cntrl->getOption('group')}</h3>
                                <hr>
                            </div>
                            {var $oldGroup = $newGroup}
                        {/if}
                        {if $cntrl instanceof Nette\Forms\Controls\CheckboxList}
                            <div class="col-sm-3 neco">
                                {label $cntrl /}{input $cntrl}
                            </div>
                        {else}
                            <div class="col-sm-3 neco-jineho">
                                {label $cntrl /}{input $cntrl}
                            </div>
                        {/if}

                    {/if}

                {/if}

            {/foreach}

        {/snippet}
    </div>

{/form}