Mam formularze:
Formularz1, Formularz 2, Formularz 3
Zrobiłem następujący MERGE:
class Formularz1 extends sfGuardUserForm{ public function configure() { /** mergeForms */ $this->mergeForm(new Formularz2()); $this->mergeForm(new Formularz3()); /** i poniżej lista z Widget i Validators */ .... } }
Teraz w kontrolerze mam dwie akcje, które służą do edycji i update'u :
public function executeEdit(sfWebRequest $request){ $user = sfGuardUserTable::getInstance()->findOneById($request->getParameter('id')); $this->form = new Formularz1($user); /** poniżej zrobienie $this->form->setDefault() na polach dwóch złączonych tabel */ } public function executeSave (sfWebRequest $request){ $user = sfGuardUserTable::getInstance()->findOneById($request->getPostParameter('sf_guard_user[id]')); $this->form = new Formularz1() $this->form = new Formularz1($user); $this->form->bind($request->getParameter($this->form->getName())); if ($this->form->isValid()) { $this->form-save(); /** poniżej save() na tabelach zmerżowanych */ } }
Zastanawia mnie dlaczego w momencie gdy klikam button SAVE to dostaję następujące informacje że pola "Username" i "Email address" już istnieją w bazie:
An object with the same "email_address" already exist.
An object with the same "username" already exist.
1) Proszę o podpowiedź czy dobrze obsługuję cały proces UPDATE'U w Symfony przy MERGE trzech Formularzy.
2) Czy w akcji executeEdit muszę zrobić operacje setDefault() na polach tabel złącoznych żeby przekazać do formularza dane. Da się to zrobić prościej? I czy w akcji Save wystarczy że zrobię $this->form->save() czy muszę zrobić operacje save() na tabelach dołączonych?
wiem, że dużo napisałem ale wystarczy mi krótki opis jak to ma wyglądać w moim przypadku czyli gdy mam MERGE trzech tabel
dzięĸi
Może dodam jeszcze że w routingu mam tak:
edit: url: /edit param: {module: test, action: edit} save: url: /save param: {module: test, action: save}
natomiast w temaplate'ach
w akcji formularzy mam tak (w obu, zarówno w editSucces jak i saveSuccess):
może tutaj robię coś źle