Selectbox – validace getValue vs getRawValue

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
stefi023
Člen | 71
+
0
-

Ahoj,
resim takovy orisek (mozna na to jen spatne jdu).

Mam formular se selectboxem (ktery ma celkem dost hodnot), ktery je naplnen hodnotami v tovarnicce. Tzn po odeslani formulare se nejprve zase cely naplni, pak probehnou validace, atd.. a az pak onSubmit callback, ve kterem redirectuju – coz me neprijde jako moc rozumne, kdyz vlastne hodnota je predana v POSTU, proc znova nacitat vsechny hodnoty?

Tak me napadlo tyto hodnoty lejt do selectu az nekde jinde v render fazi, coz sice zafungovalo, ale na druhou stranu po submitu zase metodou getValue() tuto hodnotu neziskam. I to jsem poresil v mistech kde getValue() vraci null tak jeste zkusim metodu getRawValue().
Coz ale neresi stejny problem pri validaci, kde jsou opet volany getValue().

Je nejaka moznost jak to jednoduse upravit, nebo si mam vytvorit svuj vlastni selectbox, kde tyto metody prepisu? Nebo je to cele blbe (napr z bezpecnostnich duvodu)? A mam ty hodnuty nacitat i po odeslani formulare pred redirectem?

Diky

Martin
Člen | 171
+
0
-

Předpokládám, že víš, proč se celý formulář znovu vytváří (kontrola povolených hodnot). Jen tak namátkou – v továrničce jsou již odeslané hodnoty známy při kontrolním vytváření. Co tedy přidat podmínku na odeslání (isSubmitted – bez validace) a povolené hodnoty v takovém případě načítat z databáze pomocí where(…rawValues). Jsem ale opět jen u mobilu, takže to teď nevyzkouším, ani se nepodívám, v jakém pořadí se co kde volá. Třeba se Ti ještě ozve někdo zkušenější.

stefi023
Člen | 71
+
0
-

Kontrolu samo chapu.

To je clekem dobry napad…cili jestli jsem to pochopil spravne, bude nejjednodussi si udelat svuj selectbox, kde prepisu pouze metodu getValue() – podminku „allowed“ nahradim nejakym selectem, ktery zjisti, zda ta raw hodnota je real (zjednodusene receno – takhle by to totiz asi nebyl moc univerzalni selectbox :) )

Editoval stefi023 (17. 5. 2011 14:13)

Filip Procházka
Moderator | 4668
+
0
-

Pozor: na takové podmínky musí být formulář připojený pomocí konstruktoru, jinak to nebude fungovat

protected function createComponentMyForm($name)
{
	$form = new Nette\Application\UI\Form($this, $name);
	$form->addText('neco', 'Něco');

	if ($form['neco']->value == 'hodnota') {
		// ...
	}

	// ...
}
stefi023
Člen | 71
+
0
-

HosipLan napsal(a):

Pozor: na takové podmínky musí být formulář připojený pomocí konstruktoru, jinak to nebude fungovat

Tak ted jsem nejak nepochopil jak to s tim souvisi :) Kazdopadne formulare obecne vsechny pripojuju v konstruktorech.

Ale to co jsem popisoval by se dalo vjadrit asi takto:

Presenter:

<?php
    public function renderDefault() {
        //nacte velke mnozstvi hodnot - pomale
        $this['testForm']['seznam']->setItems(Test::getSeznam());
    }

    protected function createComponentTestForm($name) {
        $form = new \Nette\Application\AppForm($this, $name);
        $form->addMySelect('seznam','Seznam')
                ->addRule(\Nette\Forms\Form::FILLED);
        $form->addSubmit('save');
        $form->onSubmit[] = callback($this,'saveForm');
    }

    public function saveForm($form) {
        $form['seznam']->getValue();
    }
?>

a MySelectbox prepsana metoda:

<?php

public function getValue()
    {
            //zjednudusene, jeste musim promyslet skipFirst()
            //a asi nejake callbacky na ty checkovaci fce

            //kontrola pouze na jednu hodnotu - rychle
            $isAllowed = Test::isValueAllowed($this->value);

            return is_scalar($this->value) && $isAllowed ? $this->value : NULL;
    }

?>
Martin
Člen | 171
+
0
-

Já jsem ani tak nemyslel přepisovat getValue, ale mít podmínku přímo v továrně. Tedy vytvářet poprvé se všemi hodnotami z databáze, při kontrolní výrobě jen s některými (sestavit where tak, abys dostal průnik toho, co je v databázi, a toho, co je v getRawValues). Nevím ale, jak jsou escapované rawValues, tak pozor při vytváření toho dotazu. Předpokládám, že Ti jde o výkonnostní optimalizaci, jinak není důvod nenačíst vždy vše. Pokud ale budeš načítat z neindexovaných sloupců, where Ti to může zdržet ještě víc než vytváření pole a plnění selectBoxu. Chce to zkusit, já teď nejsem u počítače.

Editoval Martin (17. 5. 2011 19:29)