Replikátor a pridávanie dát

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

EDIT:
Podarilo sa to vyriešiť, až na to jedno nezobrazenie remove elementu.

Ahoj!

Chcel by som sa opýtať,akým spôsobom viem nastavovať defaultné dáta pre X replikácií?
Momentálne sa mi podarilo nastaviť hodnoty, ale nastavuje mi to iba poslednú hodnotu, nie všetky :(

Ďalšia otázka, je možné nejakým spôsobom zabezpečiť, aby sa

$container->addSubmit('remove', 'Zmazať dvere')
            ->addRemoveOnClick($invalidateCallback);

zobrazil iba 1x? Teda, že minimálne jedna replikácia by musela byť vždy zadaná?

	// jméno, továrnička, výchozí počet
	$doors = $form->addDynamic('door', function (Container $container) use ($invalidateCallback) {
		$container->currentGroup = $container->form->addGroup('', FALSE);
		$container->addHidden('id_dvere', 'id_dvere');

		$container->addText('dvere_cislo', 'Číslo dverí')
			->setRequired('Prosím zadajte číslo dverí');
		$container->addText('dvere_nazov', 'Názov dverí');
		$container->addText('dvere_text1', 'Doplnkový text 1');
		$container->addText('dvere_text2', 'Doplnkový text 2');
		$container->addText('dvere_text3', 'Doplnkový text 3');
		$container->addSubmit('remove', 'Zmazať dvere')
			->addRemoveOnClick($invalidateCallback);
	});


/** @var \Kdyby\Replicator\Container $replicator */
	$doors->addSubmit('add', 'Pridať ďalšie dvere')
		->addCreateOnClick($invalidateCallback);

	$form->addSubmit('send', 'Uložiť')
		->onClick[] = callback($this, 'simpleFormSubmitted');
	$form->addSubmit('cancel', 'Späť')
	    ->setValidationScope(FALSE) //vypneme validaci formuláře pro toto tlačítko
	    ->onClick[] = function () use ($presenter) {
		    $presenter->formCancelled();
		};
	$form->addProtection();
	$this[$name] = $form;

	$dvere = $this->db->getDvereData($this->officeID);
	//tu chcem pridať hodnoty, pridá mi iba poslednú hodnotu
	foreach($dvere as $values){
	    $doors['tu musi byt iteracia']->setValues($values);
	}

Ďakujem za pomoc a prajem pekný deň

Editoval xxxmisko (3. 4. 2013 16:31)

Filip Procházka
Moderator | 4668
+
0
-

Replikátor má takovou „zvláštní“ strukturu. Je to v podstatě pole polí. Musíš do něj dát cca tohle

/** @var \Kdyby\Replicator\Container $doors */
$doors->setDefaults(array(
	1 => array('dvere_cislo' => 1, 'dvere_nazov' => 'Hnědé'),
	2 => array('dvere_cislo' => 2, 'dvere_nazov' => 'Zelené'),
	3 => array('dvere_cislo' => 3, 'dvere_nazov' => 'červené'),
));

Všimni si že tam předávám pole a to obsahuje hromadu dalších polí. A každé to pole představuje řádek replikátoru :)

Uprav si tedy svůj model tak, aby ti vracel data správně naformátována, nebo si je naformátuj, než je vložíš do replicatoru :)

xxxmisko
Člen | 140
+
0
-

Ahoj Filip!

Dáta som si pripravil z db presne, ako potrebujem vo forme pola. To mi ide.

Len v tomto cykle

$dvere = $this->db->getDvereData($this->officeID); //toto mi dá spomínané pole
$i = 0;

foreach($dvere as $values){
    $doors[$i]->setValues($values);
    $i++;
}

$i som tam musel dať, pretože inak mi replikátor nič nepridal. $doors bez pola mi takisto nezbehol.

To je teda takisto vyriešené.
Už je len otázka, ako mám vyriešiť to zobrazovanie aspoň 1-ho replikovaného subformu bez tlačítka remove? Vedel by som to spraviť tak, že by som to dal do formu napevno a potom by som replikoval, ale nezdá sa mi to moc dobré riešenie. Musí tam ísť poslať nejakú podmienku :D

Filip Procházka
Moderator | 4668
+
0
-

Udělal bych to takhle :)

$dvere = $this->db->getDvereData($this->officeID); //toto mi dá spomínané pole

foreach(array_values($dvere) as $i => $values){
    $doors[$i]->setValues($values);
}

A ten problém s tlačitkem cca takto :)

$withoutRemoveButton = TRUE;
$doors = $form->addDynamic('door', function (Container $container)
	use ($invalidateCallback, &$withoutRemoveButton) {

	// ...

	if ($withoutRemoveButton === FALSE) {
		$container->addSubmit('remove', 'Zmazať dvere')
			->addRemoveOnClick($invalidateCallback);
	}
	$withoutRemoveButton = FALSE;
});
xxxmisko
Člen | 140
+
0
-

no kurňa, ako tak pozerám, mám sa čo učiť!!!

Vyskúšam a dám vedieť, zatiaľ ďakujem veľmi pekne!!!

xxxmisko
Člen | 140
+
0
-

Ahojte!

Takže replikátor funguje super, ale mám ešte ďalšiu vec. Vo fóre som písal Zavislost selectboxu , že potrebujem poradiť, ako spraviť pri zmene select boxu načítanie ďalších parametrov formulára. Presne to vystihuje tento topic, ale nebol dokončený, takže som problém nevyriešil :(

zakazani validace pri addselect onchange

Moja otázka znie, či by sa dal použiť replikátor na to, aby zachytil volanie onChange, pričom by dynamicky pridal nejaký zvyšok formulára vrátane jeho uloženia?

Pridávam aj nejaký kokód, Filip ale aj ostatní, prosím o pomoc!

protected function createComponentTemplateForm($name) {

	$sablona = $this->db->getSablona();

	$form = new Form;
	$form->setTranslator($this->translator);

	$presenter = $this;

	$invalidateCallback = function () use ($presenter) {
			/** @var \Nette\Application\UI\Presenter $presenter */
			$presenter->invalidateControl('templateForm');
		};

	$form->addGroup('Detail displeja');
	$form->addText('displej_cislo', 'Číslo:');
	$form->addText('displej_typ', 'Typ:');

	$form->addGroup('Šablóna displeja');

	$prompt = Html::el('option')->setText("Zvoľte šablónu")->class('prompt');
	$form->addSelect('id_sablona', 'Použitá šablóna', $sablona)
		->setPrompt($prompt)
		//TOTO SA MU STRAŠNE NEPÁČI, neviem, ako spustiť callback, aby zobrazil, čo potrebujem :(
		->getControlPrototype()->OnChange($invalidateCallback);

	// meno, tovarnička, výchozí počet
	$test = $form->addDynamic('test', function (Container $container) use ($invalidateCallback) {
		$container->currentGroup = $container->form->addGroup('', FALSE);
		$container->addText('text1', 'Doplnkový text 1');
		$container->addText('text2', 'Doplnkový text 2');
		$container->addText('text3', 'Doplnkový text 3');
		//neviem, či je ok
		$form->addSubmit('save', 'Uložiť');
		$form->onSuccess[] = $this->templateFormSubmitted;

	});


	$form->addProtection();
	return $form;

   }
Filip Procházka
Moderator | 4668
+
0
-

onChange je javascriptová událost, která se odehrává na straně prohlížeče. Ty jí předáváš closuru, což je záležitost serveru. Není technologicky možné, aby fungovalo to co jsi napsal :)

Musíš napsal kompletní obsluhu v javascriptu.

xxxmisko
Člen | 140
+
0
-

Ďakujem za odpoveď, nejaký hint, ako by taká obsluha mohla vyzerať?