Validace hodnot select a multiselect

Notice: This thread is very old.
vitezslav.mergl
Member | 2
+
0
-

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
+
+1
-

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
+
0
-

@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
+
0
-

@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
+
0
-

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
+
+1
-

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