Replicator v cyklu se skupinou

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

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
+
0
-

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
+
0
-

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.

sKopheK
Člen | 207
+
0
-

Předpokládám, že formulář nevykresluješ manuálně…

jEhLa
Člen | 70
+
0
-

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
+
0
-

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