Validace hodnot select a multiselect

3 years ago

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.

3 years ago

Pavel Janda
Member | 798
+
+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.

3 years ago

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)

3 years ago

Pavel Janda
Member | 798
+
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.

3 years ago

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.

3 years ago

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