změna onSuccess[] pro editaci
- vitush93
- Člen | 33
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)
- frosty22
- Člen | 373
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
- frosty22
- Člen | 373
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
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
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)