Naplnění setItems před validací

Michal Kumžák
Člen | 106
+
0
-

Zdravím

Používám ve formuláři ajaxem doplněné selecty podle návodu zde https://blog.nette.org/…-and-pure-js. Vše jsem nakonec rozchodil jak potřebuji, akorát mám problém při odeslání formuláře, že mi hlásí chybu „Please select a valid option.“. Je to kontrola toho, zda odeslaný vybraný prvek v selectu je skutečně prvkem ve výběru. Tak se chci zeptat, zda jde tato kontrola vypnout, nebo zda jde někde přes setItems pole prvků selectu naplnit podle odeslaných hodnot formuláře. Případně zda-li má někdo nějaké jiné řešení, které mě zatím nenapadlo.

Díky za rady.

Ondřej Kubíček
Člen | 494
+
0
-

ten návod je 6 let starý, použil bych nějakou knihovnu např – https://github.com/…entSelectBox

Michal Kumžák
Člen | 106
+
0
-

Ondřej Kubíček napsal(a):

ten návod je 6 let starý, použil bych nějakou knihovnu např – https://github.com/…entSelectBox

Ok, zkusil jsem knihovnu, ale mám problém s tím, že po změně položek selectu se mi neobnoví select upravený boostrapem. Jde nějak zavolat po změně: $("select").selectpicker('refresh')?

galab
Backer | 74
+
0
-

Můžeš to navěsit třeba na callback dependentselectboxu:

<script>
	$('select').dependentSelectBox(function(){
		$('select').selectpicker('refresh');
	});
</script>
Michal Kumžák
Člen | 106
+
0
-

galab napsal(a):

Můžeš to navěsit třeba na callback dependentselectboxu:

<script>
	$('select').dependentSelectBox(function(){
		$('select').selectpicker('refresh');
	});
</script>

Dík to pomohlo a funguje to.

Leč když sem rozšířil počet závislostí, tak se narazil na několik problémů. Za prvé, chování doplňku je pro mě nevyhovující, protože při třech závislých prvcích, se odešlou minimálně 3 ajaxové dotazy a trvá to fakt dlouho. A za druhé dostane se to do stavu jako sem řešil u předchozího řešení, zase to porovnává hodnotu proti poli prvků a samozřejmě to vyhazuje chybu.

Takže tento doplněk je možná super pro jeden závislý select, ale pro to co potřebuji je nepoužitelný.

Takže se vracím k otázce, jak mohu naplnit setItem správnými prvky podle hodnot z odeslaného formuláře, aby validace proběhla v pořádku.

galab
Backer | 74
+
0
-
  1. jak tam chceš dostat data, když ne AJAXem?
  2. validace neprojde, protože to budeš mít špatně použito

Příklad použití:

$form->addSelect('select1', 'Select 1', $this->repository->getSelect1())
    ->setPrompt('--Select 1--');

$form->addDependentSelectBox('select2', 'Select 2', $form['select1'])
    ->setDependentCallback(function ($values) {
        $data = new DependentData();
        if ($values['select1'] == null) {
            return $data->setItems([]);
        } else {
            return $data->setItems($this->repository->getSelect2());
        }
    })
    ->setPrompt('--Select 2--');

$form->addDependentSelectBox('select3', 'Select 3', $form['select2'])
    ->setDependentCallback(function ($values) {
        $data = new DependentData();
        if ($values['select2'] == null) {
            return $data->setItems([]);
        } else {
            return $data->setItems($this->repository->getSelect3());
        }
    })
    ->setPrompt('--Select 3--');
Michal Kumžák
Člen | 106
+
0
-

galab napsal(a):

  1. jak tam chceš dostat data, když ne AJAXem?
  2. validace neprojde, protože to budeš mít špatně použito

Příklad použití:

$form->addSelect('select1', 'Select 1', $this->repository->getSelect1())
    ->setPrompt('--Select 1--');

$form->addDependentSelectBox('select2', 'Select 2', $form['select1'])
    ->setDependentCallback(function ($values) {
        $data = new DependentData();
        if ($values['select1'] == null) {
            return $data->setItems([]);
        } else {
            return $data->setItems($this->repository->getSelect2());
        }
    })
    ->setPrompt('--Select 2--');

$form->addDependentSelectBox('select3', 'Select 3', $form['select2'])
    ->setDependentCallback(function ($values) {
        $data = new DependentData();
        if ($values['select2'] == null) {
            return $data->setItems([]);
        } else {
            return $data->setItems($this->repository->getSelect3());
        }
    })
    ->setPrompt('--Select 3--');

Takhle sem to měl, akorát já měl ty dependent selecty 3 a při volání ajaxu to vyhazovalo chybu, že prvek není obsažen v poli povolených a ukázalo to pole prvků, které byly nastaveny jako výchozí.

A stejně toto rozšíření nechci použít, protože to posílá několik ajax dotazů a pak změna těch 3 následných selectů trvá několik sekund.

Michal Kumžák
Člen | 106
+
0
-

Tak sem nakonec našel řešení zde https://forum.nette.org/…valid-option.