Mírně odlišný formulář pro add / edit – kde nastavovat?

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

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ší:

  1. 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
  2. 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;
		}
	}
}
  1. 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ář
  2. 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
  3. 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
+
0
-

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)

Tori
Člen | 32
+
0
-

A proč byste nepoužil tu změnu vykreslení komponeny (č.5)? Že přidávání/odstraňování polí tam logicky nepatří?

Editoval Tori (12. 3. 2013 10:59)

Tomáš Kolinger
Člen | 136
+
0
-

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)