Spolecny form pro ruzne moduly

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

Zdravim forum,
mam nasledujici problem: Dejme tomu, ze budu chtit mit jeden formular mezi vice moduly (modA, modB). Proto jsem si ve spolecnem modulu udelal tridu (BaseLoggedUserPresenter), ktera mi definuje formular, akce (a view):

class Common_BaseLoggedUserPresenter extends Common_BasePresenter{

	private $sablona;
	private $userModelService;
	private $uzivatel;

	public function __construct($sablona) {
		parent::__construct();
		$this->sablona = $sablona;
		$this->userModelService = new UserModelService();
	}

	public function handleEditUserDetailedInfo(){
		$this->sablona->h1 = 'Editace uživatele '.$this->getJmenoAPrijmeniUzivatele();
	}

	public function createComponentUserDetailedInfoForm($presenter)
	{
		//TODO
		$form = new BaseForm;
		...
		$form->addText('psc', 'PSČ',5)
			//->addFilter('PscParsformer::pscPreFilter') //filtr, ktery umi vyhazet z psc mezery
			->addRule(Form::INTEGER, 'Musí být INT 1') //pretypovani na int pro dibi
			->addCondition(Form::FILLED)
			->addRule(Form::INTEGER, 'PSČ musí být číslo')
			->addRule(Form::LENGTH, 'Délka PSČ musí být 5',5);
		$form->addSubmit('save', 'Uložit');
		$form->onSubmit[] = callback($presenter, 'userDetailedInfoFormSubmitted'); //byl v poradku a validne odeslan
		return $form;
	}

	public function userDetailedInfoFormSubmitted($form)
	{
		...
		$this->userModelService->save($form->getValues());
		...
	}

V jednotlivych presenterech modA a modB mam

class SupervisorAdmin_SupervisorUserPresenter extends SupervisorAdmin_DefaultPresenter{
 ...
	public function __construct() {
		parent::__construct();
		$this->baseUserPresenter = new Common_BaseLoggedUserPresenter($this->template);
	}

	public function handleEditUserDetailedInfo(){
		$this->baseUserPresenter->handleEditUserDetailedInfo();
		$this->setView('edit');
	}

	public function userDetailedInfoFormSubmitted($form)	{
		$this->baseUserPresenter->userDetailedInfoFormSubmitted($form);

	}
...

Prosim, poradte
1) resim to spravne? Zda se mi to predavani celeho presenteru a sablony z modA do modSpol pomerne podivne :-)
2) mam problem, pokud vypnu javascript a ve formu udelam chybu, chyby se mi nikde nevypisi a po odeslani formu se prejde na renderDefault a nevleze se do userDetailedInfoFormSubmitted jak bych ocekaval…
3) pokud ve formu chybu neudelam, vleze se do userDetailedInfoFormSubmitted, coz je OK

//EDIT – 2) a 3) vyreseno on onInvalidSubmit[]
4) Jak vylepsit praci s polickem „PSČ“ z prikladu, aby:
a) pole proslo pred vykresleni do formu nejakym filtrem, ktery by treba psc rozdelil z „XXXXX“ na „XXX XX“. Nedari se mi, aby mi filtr zabral :-(
b) pokud pole bude prazdne, jak jej uz tady ve formu pretypovat na dibi:integer, aby se mi dibi nepokouselo ukladat psc jako string
c) pokud pole nebude prazdne, prohnat to nejakym filtrem , ktery mi z „XXX XX“ udela „XXXXX“ a provede dalsi kontroly (na integer a delku)
Chtel bych a-c) definovat primo v createComponentUserDetailedInfoForm a nepridelavat dalsi kontroly do userDetailedInfoFormSubmitted…

Diky moc, sedim nad tim uz docela notnou chvili a ne a ne vymyslet nejake rozumnejsi a hlavne funkcni reseni :-)

Editoval zeron (21. 2. 2010 0:35)

despiq
Člen | 320
+
0
-

udelej si na vytvoreni toho formulare nekde statickou metodu, pak to budes mit jednoduse pristupny ale uplne nejlip mit nejakej BasePresenter kterej je predkem vsech presenteru a tam pak soupnout tu
public function createComponentUserDetailedInfoForm()

kdyz bude psc xxx xx tak to musi bejt string, takze budto chces aby tam kazdej mohl napsat cokoliv protoze tam nemuzes dat rule na integer a nebo tam zavesis callback funkci ktera teda bude dodatecne ten retezec nejak kontrolovat, coz mi prijde na hlavu, pokud je to pouze pro cr tak bych se na mezeru vykaslal, pokud je to i pro zahranici kde jsou psc i pisemna tak tam je to pak jedno,

kdyz nebude psc vyplnene tak bude NULL takze se do DB zadnej string zapisovat nebude

Ondřej Mirtes
Člen | 1536
+
0
-

No můžu ti říct, že to máš celé špatně :) Konstruktor v Presenteru? Nic takového se nedělá. $this->sablona? WTF? Ale nezazlívám ti to, za takové hrůzy může nejspíše hodně děravá dokumentace.

zeron
Člen | 12
+
0
-

desiq: Spolecneho rpedka presenteru mam, asi mas pravdu a bude to pro tento ucel lepsi hodit to do nej, ale uvazoval jsem, ze treba v budoucnu bude takovych formularu sdilenych vice moduly vic a pak bych takovych metod mel na predkovi strasnou spoustu…
To psc byl spis jen priklad, ale takova funkcionalita je potreba treba pro datum, telefonni cislo apod – pred zobrazeni to musim nejak zformatovat z db formatu a pri ukladani prevest zpet na db. Napadlo me vyuziti filtru, ale nejak se mi nepodarilo rozchodit funkcni priklad – nevim presne kdy ma filtr zabrat?

Ondřej Mirtes: Hehe, tak porad, co na tom mam tak spatne nebo spis jak to vyresit lip? Taky se mi to moc nelibi :-) To $this->sablona je tam kvuli tomu, abych predal sablonu z toho modulu, kde ten form chci pouzit, proto je to v konstruktoru. Common_BaseLoggedUserPresenter je spis takovy pseudopresenter :-) Nevim, jestli za to muze spatna dokumentace, mozna spis me mizerne znalosti a navyky :-)

Ondřej Mirtes
Člen | 1536
+
0
-

Pokud chces mit jeden formular na vice mistech, proc si ho nedefinujes jako samostatnou tridu (MyForm extends AppForm) a mas pak v jednotlivych presenterech tovarnicky obsahujici jen return new MyForm? Pripadne si form a odesilaci metodu definovat v BasePresenteru (ktery dedi vsechny moduly).

Tyhle obstrukce s konstruktorem a $this->sablona fakt ee :)