Multilevel menu v selectboxu vrací NULL

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

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'].'">&nbsp;&nbsp;'.$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
+
0
-

Koukni, jak se select pouziva: https://doc.nette.org/cs/forms

nemuzes mu predavat html data, ale pole prvku (value, text)

Hankill
Člen | 9
+
0
-

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

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

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)

srigi
Nette Blogger | 558
+
0
-

@arron mylis sa (prejdi si zivotny cyklus Presentera) – action prebehne pred signalmi, takze je to OK. Neskoro je v render metode.

arron
Člen | 464
+
0
-

ha, pravdicka…vic premyslet a potom teprve psat ;-)