Manuální vykreslení formuláře – Multiplier + Replicator
- Croc
- Člen | 270
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
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
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}