Replikátor a pridávanie dát
- xxxmisko
- Člen | 140
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
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
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
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
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
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.