Dynamické pridávanie vlastnej komponenty v UI\Form

steelbull
Člen | 240
+
0
-

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.

MajklNajt
Člen | 471
+
+1
-

najjednoduchšie by bolo použiť https://github.com/…s-multiplier

steelbull
Člen | 240
+
0
-

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 | 652
+
+1
-
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 | 240
+
0
-

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)