Replicator v cyklu se skupinou
- jEhLa
- Člen | 70
Dobrý den,
chtěl bych se zeptat, jak je možné vyřešit tento problém:
protected function createComponentPartsForm(){
$positions = array(
'left' => 'Levý panel',
'right' => 'Pravý panel',
'top' => 'Horní panel',
'bottom' => 'Dolní panel'
);
$form = new \App\Components\Form();
$container = $form->addContainer('part');
foreach ($positions as $position => $label){
$container->currentGroup = $container->getForm()->addGroup($label, false);
$replicator = $container->addDynamic($position, function (\Nette\Forms\Container $container) {
$container->addText('title', 'Nadpis:',12);
$container->addTextarea('text', 'Text:');
$container->addSubmit('remove', 'Odebrat')
->addRemoveOnClick()
->getControlPrototype()->data['confirm'] = "Opravdu si přejete odebrat blok?";
}, 1);
$replicator->addSubmit('add', 'Přidat blok')
->setValidationScope(false)
->addCreateOnClick(true);
}
return $form;
}
Kód je funkční. Ale mám problém s tím, že tlačítka „add“ se
v HTML vykreslují až na konci formuláře vedle sebe.
Jak docílit toho, aby byly součástí stejné group?
- Michal Vyšinský
- Člen | 608
Replicator jsem zatím moc nepoužíval, ale neměl bys ten addSubmit volat
na $container
a ne na $replicator
?
Editoval Michal Vyšinský (5. 5. 2014 18:17)
- jEhLa
- Člen | 70
Michal Vyšinský napsal(a):
Replicator jsem zatím moc nepoužíval, ale neměl bys ten addSubmit volat na
$container
a ne na$replicator
?
Nene, potřebuji po tom tlačítku pouze přidat nové prvky do containeru a ten se volá přímo na $replicator. To mi funguje. Jen se to tlačítko nevykresluje u té skupiny.
Ve finále tam budu ještě přidávat $form->addSubmit() na uložení formuláře.
- jEhLa
- Člen | 70
Přesně, manuálně ho nevykresluji, zdálo se mi zbytečné kvůli takové
drobnosti to celé kreslit ručně. Tohle je zatím jen základ toho
formuláře, ještě tam pak přibude víc prvků.
Ale když nebude jiná možnost, tak mi asi nic jiného nezbude.
Částečně jsem to vyřešil tímto:
$add = $replicator->addSubmit('add', 'Přidat blok')
->setAttribute('class','add')
->setValidationScope(false)
->addCreateOnClick(true);
$container->currentGroup->add($add);
To mi sice to tlačítko vykresluje v dané skupině, ale zase úplně jako první. Stím se už však dá pomocí CSS něco udělat.
Není však nějaký elegantnější způsob, jak to tlačítko dostat pod prvky každého replicatoru?
- jEhLa
- Člen | 70
Tak ani s manuálním renderem jsem moc nepochodil. Nadává že komponenta ‚add‘ neexistuje.
{form partsForm}
{foreach $form[part]->components as $position => $part}
<div class="tab part {$position}">
<h3>{$part->currentGroup->getOption('label')}</h3>
{foreach $part->components as $component}
//co tady?
{/foreach}
</div>
{/foreach}
{/form}
Dump $part->components:
components private => array (4)
0 => Nette\Forms\Container #a991
onValidate => NULL
currentGroup protected => Nette\Forms\ControlGroup #ea86
controls protected => SplObjectStorage #9595 { ... }
options private => array (3) [ ... ]
validated private => NULL
components private => array (5)
id => Nette\Forms\Controls\HiddenField #e756 { ... }
title => Nette\Forms\Controls\TextInput #1027 { ... }
text => Nette\Forms\Controls\TextArea #f466 { ... }
page_id_content => Nette\Forms\Controls\SelectBox #9901 { ... }
remove => Nette\Forms\Controls\SubmitButton #fc9a { ... }
cloning private => NULL
parent private => Kdyby\Replicator\Container #46da { RECURSION }
name private => "0"
monitors private => array (1)
"Nette\Forms\Form" => array (4) [ ... ]
1 => Nette\Forms\Container #7df7
2 => Nette\Forms\Container #15f0
add => Nette\Forms\Controls\SubmitButton #e092