Editační formulář

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

Zdravím lidičky. Na stránkách používám jeden a ten stejný formulář pro vložení i pro editaci novinky. Už jsem zde na foru vyhledal, jak formulář při editaci předvyplnit, ale stále nemůžu upravit, kam se editační formulář odesílá. Jasnější to bude určitě, když sem pastnu můj kod.

protected function createComponentNovinkaForm() {
    $form = new AppForm;

    $viditelnost = array("1" => "Zobrazeno", "0" => "Schováno");

    $form->addText('nadpis', 'Nadpis:')->addRule(AppForm::FILLED, 'Zadejte nadpis novinky');
    $form->addTextArea('text', 'Obsah novinky:')->addRule(AppForm::FILLED, 'Zadejte text novinky');

    $form->addSelect('viditelnost', 'Viditelnost:', $viditelnost);

    $form->addSubmit('odeslat', 'Odeslat');

    $form->onSubmit[] = array($this, 'novinkaFormSubmitted');

    return $form;

}

public function novinkaFormSubmitted(AppForm $form) {

    $values = $form->getValues();

    $vlozeni = UvodniStrana::insertNewNews($values["nadpis"], $values["text"], $values["viditelnost"]);
    if ($vlozeni) {
        $this->flashMessage('Novinka byla úspěšně vložena', 'green');
        $this->redirect('administrace:uvodniStrana');
    } else {
        $this->flashMessage('Nepodařilo se vložit novinku. Opakujte akci znovu prosím', 'red');
    }

}

public function novinkaEdit($idNews) {
    $form = $this->getComponent('novinkaForm');

    $news = uvodniStrana::getNews($idNews);

    $form->setDefaults(array(
        "text" => $news["text"],
        "nadpis" => $news["nadpis"],
        "viditelnost" => $news["viditelnost"]
    ));

    $form->onSubmit[] = array($this, 'editNovinkaFormSubmitted');

    $this->setView('uvodniStranaEditace');
}

public function editNovinkaFormSubmitted(AppForm $form) {

    $values = $form->getValues();

    $editace = UvodniStrana::editNews($values["nadpis"], $values["text"], $values["viditelnost"]);
    if ($editace) {
        $this->flashMessage('Novinka byla úspěšně upravena', 'green');
        $this->redirect('administrace:uvodniStrana');
    } else {
        $this->flashMessage('Nepodařilo se upravit novinku. Opakujte akci znovu prosím', 'red');
    }

}

Editační formulář se mi stále odesílá na novinkaFormSubmitted a ne na editNovinkaFormSubmitted. A tím pádem se mi tam novinka, kterou edituju uloží jako nová a editovaná zůstane bez změny (jelikož se nezavolá ta editNovinkaFormSubmitted). A už fakt nevím co s tím :-( Určitě to bude jen nějaká blbost, ale stále ji nemohu najít :-(

Ondřej Mirtes
Člen | 1536
+
0
-

No ony se ti zavolají obě ty metody. onSubmit[] je běžné pole, které plníš callbacky, takže v té metodě novinkaEdit ho jen vymaž – $form->onSubmit = array();.

BTW: Kdy voláš tu metodu novinkaEdit?

chemikus
Člen | 47
+
0
-

Volám to při render fázi

public function renderUvodniStranaEditace($idNews) {
        $this->novinkaEdit($idNews);
        $this->template->NovinkaForm = $this["novinkaForm"];
    }

snad je to ve správné fázi :-)

Jinak dodal jsem to tam a nic. Přepsal jsem to na

$form->onSubmit[] = array();

a stále nic :-/

Editoval chemikus (4. 2. 2010 10:18)

Ondřej Mirtes
Člen | 1536
+
0
-

Protože to je pozdě :o) Přendej to do action (v render fázi je už po zpracování formuláře, tak je jasné, že se ti volá jen ta původní metoda udaná v továrničce):

public function actionUvodniStranaEditace($idNews) {
        $this->novinkaEdit($idNews);
}

A klidně tu metodu novinkaEdit můžeš dát jako private.

Patrik Votoček
Člen | 2221
+
0
-
$form->onSubmit[] = array();

nic neudela jenom nastavi další „prázdný callback“ spíš přesuň

$form->onSubmit[] = array($this, 'novinkaFormSubmitted');

do renderUvodniStranaAdd nebo jak se to u tebe jmenuje… :-)

EDIT: kua tady nez clovek neco napise… to aby se na to jeden rovnou vy… :-D

Editoval vrtak-cz (4. 2. 2010 10:30)

chemikus
Člen | 47
+
0
-

No jasný .. já jsem pako :-( Díky moc ;-)

Ondřej Mirtes
Člen | 1536
+
0
-

Já ale psal $form->onSubmit = array() ! :) Ale do renderu tohle fakt nepatří… Buďto do továrničky nebo do action fáze.

Patrik Votoček
Člen | 2221
+
0
-

Ondřej Mirtes napsal(a):

Já ale psal $form->onSubmit = array() ! :) Ale do renderu tohle fakt nepatří… Buďto do továrničky nebo do action fáze.

to moje taky nebyla reakce na tebe…

PetrP
Člen | 587
+
0
-

public function novinkaEdit($idNews) {
$form = $this->getComponent(‚novinkaForm‘);

Tohle se mi moc nelíbí.
raději bych šel cestou mít tvě továrničky, kdy jedna vychází z druhé:

protected function createComponentNovinkaForm()
 // to co tam mas

protected function createComponentEditNovinkaForm($name)
{
	$form = $this->createComponentNovinkaForm($name);
	$form->setDefaults(...);
	$form->onSubmit = array();
	$form->onSubmit[] = array($this, 'ditNovinkaFormSubmitted');

	a treba i
	$form['odeslat']->caption = 'Editovat';

	return $form;
}