Mírně odlišný formulář pro add / edit – kde nastavovat?
- Tori
- Člen | 32
Pěkné dopoledne,
mám formulář (samostatná třída), který chci použít jak pro nahrání
souboru, tak pro editaci údajů o něm. Většina polí je stejných,
odlišnosti:
addForm – má navíc pole pro upload
editForm – pole „filename“ je povinné.
Jak byste to řešili? Napadlo mě několik způsobů, ale nevím, který je lepší:
- nastavit povinné pole / přidat upload v Presenter.createComponentMyForm
- tohle bych nerada, formuláře mám oddělené do tříd právě abych se vyhnula jejich definování v presenterech
- přepínač v konstruktoru formuláře
- tady mi zas nesedí změna signatury konstruktoru
class MyForm extends Nette\Application\UI\Form
{
const ADD = 1;
const EDIT = 2;
public function __construct($type = null)
{
parent::__construct();
// definice společných polí
switch ($type) {
case self::ADD:
$this->addUpload(...);
break;
case self::EDIT;
$this['filename']->setRequired();
break;
}
}
}
- Něco podobného, akorát volba typu + donastavení polí bude v jiné
metodě
MyForm::create(MyForm::ADD)
- celkem fajn, ale nevýhoda je, že konstruktor nemůže být soukromý, takže zůstane možnost vytvořit neúplný formulář
- Společné části nechat ve třídě MyForm, specializace podědit do
MyAddForm, resp. MyEditForm
- v presenter.createComponentMyForm bych musela podle this.action rozlišovat, jaký formulář se chce – čímž přijdu o hlavní výhodu využití jednoho formuláře pro obě akce
- Parametr ovlivňující způsob vykreslení až v šabloně:
{control myForm:$actionName}
, a změny formuláře řešit v MyForm.renderAdd resp. MyForm.renderEdit.- to se mi zatím líbí nejvíc, ale nevím, jestli v renderX metodách už není pozdě na některé změny formuláře.
Editoval Tori (12. 3. 2013 10:06)
- Tomáš Kolinger
- Člen | 136
V případě malých změn (přidání jednoho pravidla a dalších úprav „na jeden řádek“) ovlivňuju komponentu z Presenteru – třeba v action metodě.
Pokud je to něco složotějšího, tak formuláře skládám a dědím.
Editoval Tomáš Kolinger (12. 3. 2013 16:24)
- Tomáš Kolinger
- Člen | 136
S tím nemám zkušenosti, pokud se to ale bude volat až při vykreslení šablony a formuláři se změní struktura či validace, tak je pozdě a fungovat to nebude. Při odeslání formuláře se totiž formulář nejdřív validuje, pak se zavolají callbacky a pak teprve se volají render metody a šablony = změny se při zpracování formuláře vůbec neprojeví.
Zkrátka měnit formulář po zavolání signálů (popř. action metod u presenteru) nemá smysl. Tam lze aplikovat jen kosmetické úpravy = popisky, classy, …
Editoval Tomáš Kolinger (12. 3. 2013 16:24)