Multilevel menu v selectboxu vrací NULL
- Hankill
- Člen | 9
Ahoj, mám takový problém, že když odešlu formulář tak se mi objeví
při výpisu $values = $form->getValues()
v selectboxu
$form['parent_id']
se objeví NULL a u ostatní položky
formuláře se zobrazí bez problému. HTML kód se vypíše bez problému.
Díval jsem se tady na fóru a zjistil jsem akorat toto:
Problém je ten, že Nette formuláře obsahují feature, která kontroluje zda souhlasí SELECT vygenerovaný a SELECT přijatý. Jelikož jsem SELECT generoval na základě $this->tyden tak tato proměnná nebyla dostupná ve fázi tohoto porovnání, které se děje právě v getValues. Řešením bylo nastavit $this->tyden jako persistent. Můj problém to vyřešilo a věřím že u vás to bude stejný důvod.
Když jsem zkoušel to dělat přes persistentní proměnou tak mi to taky nebralo.
Jinak jsem začátečník a tohle je moje první větší web.
Za jakékoliv rady budu vděčný díky:)
public function actionAddItem($id_menu){
$id = $id_menu;
$items = array();
try{
$result = dibi::query('SELECT * FROM [items_menu] ORDER BY [order] ASC');
$menu_array = array();
foreach ($result as $post) {
$menu_array[$post['id']] = $post;
}
$items = self::get_menu_items2($menu_array);
}catch(DibiException $e){
$this->flashMessage('Položky nenalezeny');
}
// polozky pro selectbox PARENT_ID
$line_text = '<option value="0">Nejvýše</option>';
foreach($items as $value){
$line_text .= '<option value="'.$value['parent_id'].'"> '.$value['prefix'].$value['name'].'</option>';
}
$items_radio = array('no' => 'ne', 'yes' => 'ano');
$form = new AppForm($this, 'addItemForm');
$form->addText('name', 'Název:')
->addRule(Form::FILLED, 'Prosím vyplňte název.');
$form->addText('link', 'Odkaz:');
$form->addHidden('id_menu', $id);
$form->addSelect('parent_id', 'Nadřazená položka:')->getControlPrototype()->setHtml($line_text);
$form->addRadioList('public', 'Zveřejněno:',$items_radio);
$form->setDefaults(array('public' => 'yes'));
$form->addProtection('Vypršel ochranný časový limit, odešlete prosím formulář ještě jednou');
$form->addSubmit('add', 'Přidat');
$form->addSubmit('back', 'Zpět')
->setValidationScope(NULL)
->onClick[] = array($this, 'cancelClickedItem');
$form->onSubmit[] = array($this, 'additem');
$this->template->form = $form;
}
Editoval Hankill (7. 10. 2010 12:49)
- Lei
- Člen | 4
Koukni, jak se select pouziva: https://doc.nette.org/cs/forms
nemuzes mu predavat html data, ale pole prvku (value, text)
- Hankill
- Člen | 9
Tak jsem to nakonec vyřešil stačilo použít správně getRawValue() :))
Kdyby někdo měl podobný problém tak tady dávám kousek kódu, který zpracovává ten formulář.
public function additem($form){
$values = $form->getValues();
$value = $form['parent_id']->getRawValue(); //hodnota ze selectboxu
- arron
- Člen | 464
V tom kodu vidim hned dve zasadni chyby. Prvni je, ze spatne pouzivas nettovsky selectbox (kounki do dokumentace, jak se sparvne vytvari). Druhy problem je, ze formular vytvaris az primo v action metode. Obsluha pro submit formulare se vola jeste pred touto metodou. V te dobe ale formular jeste nebude vytvoreny, takze to nemuze fungovat. Hledej jak vytvorit formular pomoci tovarnicky.
- Hankill
- Člen | 9
To arron: Vím jak se selectbox se vytváří ale problem mi tam nastal, když jsem chtěl mít před hodnotou prázdné mezery. Dalo mi je to pryč, takže jsem to vykutil podle Odkaz
kde měl stejný problém a proto zde používám
getControlPrototype()->setHtml();
Obsluha pro submit formulare se vola jeste pred touto metodou. V te dobe ale formular jeste nebude vytvoreny, takze to nemuze fungovat. Hledej jak vytvorit formular pomoci tovarnicky.
Hmm ale mě ty formuláře takhle běží v pohodě.
Editoval Hankill (7. 10. 2010 13:33)