Naplnění setItems před validací
- Michal Kumžák
- Člen | 106
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
ten návod je 6 let starý, použil bych nějakou knihovnu např – https://github.com/…entSelectBox
- Michal Kumžák
- Člen | 106
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')
?
- Michal Kumžák
- Člen | 106
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
- jak tam chceš dostat data, když ne AJAXem?
- 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
galab napsal(a):
- jak tam chceš dostat data, když ne AJAXem?
- 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.