změna onSuccess[] pro editaci

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

Nazdar, používám stejný formulář pro vytváření a editaci. V actionEdit standardně plním formulář default daty a měním onSuccess[]. Řeším to takto:

public function actionEdit($id) {
    .
    .
    $this['someForm']->onSuccess = null;
    $this['someForm']->onSuccess[] = $this->editData;
    .
    .
}

je to funkční, ale nelíbí se mi to. Existuje nějaký lepší způsob jak na jiný edit callback? Díky za odpovědi.

Editoval vitush93 (6. 8. 2013 17:30)

Felix
Nette Core | 1254
+
0
-

Pokud to mas takhle, tak bych to bude zpracovaval vsechno jednim callbackem a pak se rozhodl co s tim nebo muzes v actionDefault a actionEdit navesi prece pokazde jiny callback a nedelat to v tovarnicce.

frosty22
Člen | 373
+
0
-

A nebo se na to podívat trošku jinak, zda-li by ve finále nemohl být callback stejný, já používám něco jako:

<?php
class ProductPresenter extends Presenter {

	private $product;

	public function actionEdit($id)
	{
		$this->product = // Načtení z db
		$this["editForm"]->setDefaults($this->product);
	}

	protected function createComponentEditForm()
	{
		$form = ...
		$form->onSuccess[] = $this->processEditForm;
	}

	public function processEditForm($form)
	{
		if (!$this->product) {
			$this->product = new Product();
		}

		$this->product->name = $form["name"]->value;
		...

		$this->flashMessage("Produkt uložen.");
		$this->redirect("this");
	}
}
?>

Tímto tedy actionCreate nepotřebuji nic by se v ní nedělalo, pouze když jde o editaci tak předvyplním formulář, ale oba směřují na jeden proces, kde se podívám zda-li produkt existuje, když ne vytvořím jeho instanci, naplním daty.

PS: Ve skutečnosti již to používám jinak, jelikož nemám formuláře v presentrech a na zpracování mám procesní objekty, ale schéma by zůstalo.

PSS: Všimněte si neutrální hlášky „Produkt uložen“ abych nemusel řešit „vytvořen / upraven“ :D

vvoody
Člen | 910
+
0
-

A čo takto použiť dedičnosť?

frosty22
Člen | 373
+
0
-

To mě sice taky napadlo, ale pak jsem se zamyslel nad tou otázkou znovu a došlo mi že on nemyslí stejný formulář napříč presentery nýbrž v každém presenteru má jeden formulář, kterým edituje i vytváří uživatele. Ale mezi presentery má jiné formuláře předpokládám. V podstatě klasika

vvoody
Člen | 910
+
0
-

Nechápem v čom sa odporuje dedičnosť oproti tomu čo si napísal. Stále môže mať v každom presenteri/ ku každej entite 3 form triedy (base, base > edit, base > add). Je to síce kopec súborov ale nieje nič horšie ako ta frustrácia keď sa snažím po mesiaci vysomáriť vo forme ktorý robí „všetko“.

frosty22
Člen | 373
+
0
-

Tak to je úhel pohledu, podle mě formulář nemá nic dělat – formulář by nemělo zajímat jestli bude pro úpravu nebo pro vytvoření. Formulář je kolekce dat a ve většině případů je pro editaci či vytvoření stejná množina dat, čili proto může být jen jeden a navěší se na něj události z vně, tj. presenteru.

Ano může se stát že při editaci například nejde změnit již email, v tomto případě ano vytvořit formuláře dva, s tím že budou mít společného předka.

Ale tak či tak neříkám, že form má dělat všechno. Formulář nemá zpracovávat nic, podle mě.

Edit: A propo nepoužil bych dědění formuláře, ale továrničku:

<?php
class UserFormFactory {

	public function create($editableEmail = TRUE)
	{
		$form = new Form;
		$form->addText("email", "E-mail")->setDisabled(!$editableEmail);
		return $form;
	}

}
?>

Ikdyž u tohoto pak není hezké, pokud těch parametrů je hodně, na to bych založil pak nějaký objekt zvlášť, něco jako: UserFormSetting, který by se předával namísto těch parametrů metodě create.

Editoval frosty22 (7. 8. 2013 13:04)