Validace hodnot select a multiselect
- vitezslav.mergl
- Member | 2
Ahoj.
Ve formuláři používám combobox select2(https://select2.github.io/examples.html) pro autocomplete
pomocí AJAX.
Do definice formuláře nechci předávat všechny hodnoty, které select může
nabýt, jelikož jich je tisíce a nechci tím zatěžovat render stránky.
Když je ale do definice nedodám a vložím jen prázdné pole, formulář je
(nejspíš z důvodu bezpečnosti) nezpracuje protože mu odeslané hodnoty
chybí v jeho definici.
Lze tedy nějakým způsobem zakázat validaci selectu, popřípadě je možné napsat validaci tak, aby se hodnoty nepředávali do renderu a ověřovali se třeba přímo selectem do db?
Diky.
- Pavel Janda
- Member | 977
Podstata věci je SelectBox zabezpečit – jak říkáš, takže “odbezpečení” SelectBoxu nemá smysl a předpokládám, že to ani nejde.
Použij low-level příjem hodnot formuláře, nebo jedné hodnoty.
Manuálně si vyrob formulář a pak čapni sanitizované hodnoty:
$values = $form->getHttpData($form::DATA_TEXT | $form::DATA_KEYS, 'select[]');
Tady je docu.
- old.gandalf
- Member | 17
@PavelJanda I believe a better idea is to allow optional value filling of the selectbox, which depends on a GET parameter of the current action.
<?php
public function actionDefault($fill = FALSE) {
if ($fill) {
$this->selectItems = $this->complicatedMethodForGettingSelectItems();
} else {
$this->selectItems = array();
}
}
protected function createComponentForm() {
$form = new UI\Form();
$form->addSelect('select', "List", $this->selectItems);
//the important part
$form->setAction($this->link('this', TRUE)); //the TRUE causes the items to load when form is submitted so it does not slow down initial rendering
return $form;
}
?>
I had used getHttpData() for some time and started thinking it should not be used if not completely necessary since it does not allow proper validation.
However I am not completely sure this attitude is the right one.
Edit: change createComponentForm() from public to protected, not to show improper example of code.
Last edited by old.gandalf (2015-09-16 12:51)
- Pavel Janda
- Member | 977
@old.gandalf Správná validace odeslanéh selectu znamená jednak sanitizace a jednak ověření proti hodnotám, které opravdu selectbox nabízí. Jenže to druhé je přesně to, čemu se chce Vítek vyhnout. Proto dává smysl použít pouze sanitizaci.
V tvém příkladu se opět zbytečně generuje obrovský SelectBox. Není to potřeba.
- old.gandalf
- Member | 17
Pavel Janda wrote:
@old.gandalf Správná validace odeslanéh selectu znamená jednak sanitizace a jednak ověření proti hodnotám, které opravdu selectbox nabízí. Jenže to druhé je přesně to, čemu se chce Vítek vyhnout. Proto dává smysl použít pouze sanitizaci.
V tvém příkladu se opět zbytečně generuje obrovský SelectBox. Není to potřeba.
I see, you're right.
- vitezslav.mergl
- Member | 2
Ahoj.
Díky za odpověďi. Obešel jsem to pomocí getHttpData(resp. getPost) i když
jsem doufal v elegantnější řešení(nemůžu si třeba nějakým způsobem
přepsat validaci pro tuto konkrétní componentu?). Narazil jsem ale na jiný
problém. Formuláři předávám jako defaultní hodnoty celé pole dat pomocí
$form->setDefaults($values); Tady mi ovšem znovu zařve nette, že
přiřazuji neexistující hodnoty. Dá se vyřešit jinak než hodnoty posílat
do šablony a ty pak zpracovat JS? Přide mi to dost prasácký :)
Dik