Spolecny form pro ruzne moduly
- zeron
- Člen | 12
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
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
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
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
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 :)