Selectbox – validace getValue vs getRawValue
- stefi023
- Člen | 71
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
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
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
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
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
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)