Odeslání formuláře se nedostane tam kam chci

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

Mám v presenteru nadefinovaný formulář a na onSuccess mám definovanou funkci. Po odeslání formuláře se dostanu zpět do té části, která vytváří formulář a ne do té definované funkce.
Do adresniho radku se prida ?do=categoryForm-submit
Co dělám špatně.

protected function createComponentCategoryForm() {
    $form = new AppForm();
    $form->addTextArea('category_text','Category text:',180,3)
        ->addRule(Form::FILLED, 'Category must be filled' );
    $form->addTextArea('category_description', 'Description',180,10);
    $form->addHidden('lang_id');
    $form->addHidden('category_id');
    (int)$tmpId = $this->id;
    if ($tmpId == 0) {
        Debugger::dump($tmpId);
        $form->addHidden('test_id');
        $form['test_id']->setDefaultValue($this->test_ident);
        $form->addText('category_order','Order')
            ->addRule(Form::FILLED,'Category order must be filled')
            ->addRule(Form::INTEGER,'Category order must be number');
        $labelSubmit = "Insert category";
    }
    else {
        $tmp_labels = $this->categoryLabel->findBy(array('lang_id' => $this->lang, 'category_id' => $this->id))->select('*')->fetch();
        $formData = array('category_text' => $tmp_labels['category_text'],
                        'category_description' => $tmp_labels['category_description'],
                        'lang_id' => $tmp_labels['lang_id'],
                        'category_id' => $tmp_labels['category_id']);
        $form['category_text']->setDefaultValue($tmp_labels['category_text']);
        $form['category_description']->setDefaultValue($tmp_labels['category_description']);
        $form['category_id']->setDefaultValue($tmp_labels['category_id']);
        $form['lang_id']->setDefaultValue($tmp_labels['lang_id']);
        $labelSubmit = "Update category";
    }
    $form->addSubmit('submit', $labelSubmit);
    $form->onSuccess[] = $this->categoryFormSubmitted;
    return $form;
}

public function categoryFormSubmitted(AppForm $form) {

    $this->presenter->flashMessage('Test vlozeni');
    $values = $form->getValues();
    Debugger::dump($values);
    die;
}
Majkl578
Moderator | 1364
+
0
-

Formulář nejspíš není po odeslání validní.
Zkus přidat ještě toto:

$this->onSubmit[] = function (Form $form) {
	dump($form->isValid());
	dump($form->getErrors();
};
svobodai
Člen | 136
+
0
-

Tak problém je v tom, že mám podmíněnou část, která se má vložit do formu při insertu. Při updatu je nepotřebuju.
Ale je zajímavé, že data se mi načtou správně. Jen se mi do toho formu propašuje Order a na jeho validaci to končí.
Jak docílit toho, když chci mít jeden formulář pro insert i update a jen potřebuju nepracovat při updatu s tím jedním polem a tudíž ho nechci validovat.

if ($tmpId == 0) {
    Debugger::dump($tmpId);
    $form->addHidden('test_id');
    $form['test_id']->setDefaultValue($this->test_ident);
    $form->addText('category_order','Order')
        ->addRule(Form::FILLED,'Category order must be filled')
        ->addRule(Form::INTEGER,'Category order must be number');
    $labelSubmit = "Insert category";
}
else {
    $tmp_labels = $this->categoryLabel->findBy(array('lang_id' => $this->lang, 'category_id' => $this->id))->select('*')->fetch();
    $formData = array('category_text' => $tmp_labels['category_text'],
                    'category_description' => $tmp_labels['category_description'],
                    'lang_id' => $tmp_labels['lang_id'],
                    'category_id' => $tmp_labels['category_id']);
    $form['category_text']->setDefaultValue($tmp_labels['category_text']);
    $form['category_description']->setDefaultValue($tmp_labels['category_description']);
    $form['category_id']->setDefaultValue($tmp_labels['category_id']);
    $form['lang_id']->setDefaultValue($tmp_labels['lang_id']);
    $labelSubmit = "Update category";
}
Majkl578
Moderator | 1364
+
0
-

Ideálně si asi udělat továrničku na nějaký base form (teď nemyslím továrničku ve smyslu továrničky komponenty, ale obecně) a pro každý druh si jej doupravit v příslušné továrně komponenty. Něco jako:

protected function createComponentAddCategoryForm()
{
	$form = $this->createBaseCategoryForm();

	// přidání dodatečných polí a callbacků do formuláře na přidání

	return $form;
}

protected function createComponentEditCategoryForm()
{
	$form = $this->createBaseCategoryForm();

	// přidání dodatečných polí a callbacků do formuláře na editaci

	return $form;
}

private function createBaseCategoryForm()
{
	$form = new Form();

	// nadefinování společné části formuláře

	return $form;
}
xxxmisko
Člen | 140
+
0
-

ahoj, ja som to riešil tak, že ak updatujem, kontrolujem jeden parameter navyše – id. Ten je ako hidden pri update, inak nie je zadaný. Formulár vyzerá rovnako aj pri editácii aj pri pridávaní, až na ten jeden element a predvyplnené dáta.