Dynamické pridávanie vlastnej komponenty v UI\Form
- steelbull
- Člen | 241
Ako môžem najjednoduchšie dynamicky pridávať nové inputy do UI\Form (napr. kliknutím niekde na JS tlačidlo +). Používam multiSelect na vyberanie členov projektu. Vznikla ale požiadavka, že okrem samotných členov by bolo vhodné každému z nich priradiť aj nejaké číselné údaje. Multiselect musím zrušiť a niečím ho nahradiť.
$form->addMultiSelect('team', $t->trans('project.form.team') . ':', $users)->setDisabled($allDisabled);
Ideálne by bolo nahradiť ho dataGridom (používam KendoUI) a dáta z dataGridu odoslať cez POST spolu s ostatnými dátami (to by som hneď vedel využiť všade). DataGrid odosiela dáta cez JSON. Potreboval by som nejako tieto dáta pridať do postu k dátam formulára. Ak sa to nedá alebo to nie je správne/bezpečné, potom by som asi celý formulár mal po správnosti vytvoriť v JS, submitovať dáta z celého formulára cez JSON a tie potom spracovať v Nette. Ale to by som musel v podstate všetko čo mám úplne prerobiť.
Potom je ďalšia možnosť, vytvoriť v Nette komponent so selectBoxom člena projektu a inputmi pre číselné údaje, ktoré potrebujem zadať, ale potom by som potreboval spomínané tlačidlo Add a pridávať tento komponent dynamicky pre každého člena projektu.
Celý formulár sa mi prerábať nechce, lebo je tam dosť zložitá logika. Ako by ste to riešili vy? Nemáte nejaký example (vlastný komponent + dynamické pridávanie do formu)?
Príp. máte nejakú inú ideu?
Thx.
- steelbull
- Člen | 241
MajklNajt napsal(a):
najjednoduchšie by bolo použiť https://github.com/…s-multiplier
Velmi pekne dakujem. Ano, toto mi pomohlo a funguje to.
Ale mam este jeden problem. Ako mozem validovat ten Multiplier a pridat chybu na Multiplier ako celok alebo na jednotlive polozky vo vnutri. Nevsimol som si, ze by tam bola metoda addError ako v UI\Form.
$copies = 1;
$maxCopies = 15;
$members = $form->addMultiplier('members', function (Nette\Forms\Container $container, Nette\Forms\Form $form) {
$container->addSelect('user_id', $this->translator->trans('project.form.member') . ':', $this->users)
->setPrompt('')
->setDefaultValue(null)
->setRequired(true)
->setDefaultValue($this->user->id);
$container->addSelect('week_saturation', $this->translator->trans('card.form.wsaturation') . ':', $this->wSaturationItems)
->addRule(UI\Form::REQUIRED, $this->translator->trans('form.validator.required'))
->setRequired(true)
->setAttribute('class', 'k-percentage')
->addRule(UI\Form::MIN, $this->translator->trans('form.validator.min', array(0)), 0);
$container->addText('fin_saving', $this->translator->trans('project.form.fin_hard_saving') . ':')
->setRequired(false)
->setAttribute('class', 'k-currency')
->addRule(UI\Form::FLOAT, $this->translator->trans('form.validator.float'));
$container->addText('description', $this->translator->trans('project.form.description' . ':'));
}, $copies, $maxCopies);
$members->addCreateButton($this->translator->trans('project.form.add_member'))
->addClass('btn btn-success');
$members->addRemoveButton($this->translator->trans('project.form.remove_member'))
->addClass('btn btn-danger');
$members->addCreateButton($this->translator->translate('project.form.add_more_members', ['members' => 5]), 5)
->addClass('btn btn-success');
$members->onValidate[] = function (\WebChemistry\Forms\Controls\Multiplier $f) {
$data = $f->getValues();
\Tracy\Debugger::barDump($data);
// Tu potrebujem pridat validaciu
};
Editoval steelbull (3. 2. 2019 10:45)
- Martk
- Člen | 661
foreach ($f->getContainers() as $container) {
$values = $container->getValues();
if (!$values['user_id']) {
$container['user_id']->addError('Povinná položka'); // pridani ke konkretnimu inputu
$f->getForm()->addError('User id'); // pridani k formulari
}
}
Editoval Martk (3. 2. 2019 10:54)
- steelbull
- Člen | 241
Martk napsal(a):
foreach ($f->getContainers() as $container) { $values = $container->getValues(); if (!$values['user_id']) { $container['user_id']->addError('Povinná položka'); // pridani ke konkretnimu inputu $f->getForm()->addError('User id'); // pridani k formulari } }
Jj, dakujem za rychlu odpoved. Ale je to vyborny priklad. Ak nevyberiem ziadneho uzivatela, dostanem nasledujuci exception a validate sa ani nevykona, neviem, ako to obist:
Value '' is out of allowed set [1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24...] in field 'user_id'
Editoval steelbull (3. 2. 2019 11:22)