Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pytanie - problem z Update trzech zmerżowanych formularzy
Forum PHP.pl > Forum > PHP
damianooo
Witam,

Mam formularze:

Formularz1, Formularz 2, Formularz 3

Zrobiłem następujący MERGE:

  1. class Formularz1 extends sfGuardUserForm{
  2. public function configure()
  3. {
  4. /** mergeForms */
  5. $this->mergeForm(new Formularz2());
  6. $this->mergeForm(new Formularz3());
  7.  
  8. /** i poniżej lista z Widget i Validators */
  9. ....
  10. }
  11. }



Teraz w kontrolerze mam dwie akcje, które służą do edycji i update'u :

  1. public function executeEdit(sfWebRequest $request){
  2. $user = sfGuardUserTable::getInstance()->findOneById($request->getParameter('id'));
  3. $this->form = new Formularz1($user);
  4.  
  5. /** poniżej zrobienie $this->form->setDefault() na polach dwóch złączonych tabel */
  6. }
  7.  
  8. public function executeSave (sfWebRequest $request){
  9. $user = sfGuardUserTable::getInstance()->findOneById($request->getPostParameter('sf_guard_user[id]'));
  10. $this->form = new Formularz1()
  11.  
  12. $this->form = new Formularz1($user);
  13. $this->form->bind($request->getParameter($this->form->getName()));
  14. if ($this->form->isValid()) {
  15. $this->form-save();
  16. /** poniżej save() na tabelach zmerżowanych */
  17. }
  18. }


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:

  1. edit:
  2. url: /edit
  3. param: {module: test, action: edit}
  4. save:
  5. url: /save
  6. param: {module: test, action: save}


natomiast w temaplate'ach

w akcji formularzy mam tak (w obu, zarówno w editSucces jak i saveSuccess):

  1. <form action="<?php echo url_for('test/save')?>" method="POST">



może tutaj robię coś źle


jaro87
$form1->mergeForm($form2) kopiuje wszystkie widgety i walidatory z $form2 do $form1 i nic poza tym. Możesz sobie otworzyć klasę tego drugiego formularza zaznaczyć widgety i validatory, zrobić ctr+c a potem ctr+v w pierwszym formularzu i dostaniesz w efekcie dokładnie to samo. Nie są kopiowane żande metody więc jeżeli w formularzu drugim masz np. save() to musisz pamiętać żeby skopiować co tam chcesz do pierwszego formularza.

Co do aktualizacji danych w bazie mergeForm() nie ma zadnego znaczenia. Formularz to formularz, nieważnie że mergowany. Musisz mieć namieszane albo o czymś zapomniałeś w metodzie save(). Jeżeli w tych mergowanych formularzach masz dane dla innych tabel bazy to musisz je sam zapisać(w przeciwieństwie do embedded forms które są zapisywane automatycznie). Ten komunikat z polami unique walidator wywala dlatego, że zamiast edytować próbujesz jeszcze raz go dodać.
damianooo
zapominałem dodać że wogóle pierwszy błąd po zapisie to:

  1. Id: Invalid.


co wydaje się najistotniejsze ....

ciekawe jest też że jak sprawdzę Firebugiem jaką wartośc ma pole ukryte a wiec ID to jest tam przypisany ID =1 tutaj:

  1. <input id="sf_guard_user_id" type="hidden" value="1" name="sf_guard_user[id]">
  2. <input id="sf_guard_user__csrf_token" type="hidden" value="7c28fd40e8d2f1bde13d29e02eb4dc3e" name="sf_guard_user[_csrf_token]">


nie rozumiem dlaczego tak się dzieje .. postanowiłem to przerobić aby by ło tak jak w Jobeet ale nadal jest coś nie tak ... i podejrzewam że coś mam źle w ustawieniach Formularz1 ...

dodam jeszcze, że jak mam konfigurację tego złożonego formularza to mam wypisane wszystkie potrzenbne mi Validatory, które sobie przedziedziczyłem z sfGuardUser oraz z tych dołączonych formularzy , natomiast te pole które nie są mi potrzebne to na nich mam zrobiony UNSET ... nie mam jednak zrobionego validatora na ID (może to jest problem. Poza tym właściwie to widgety przedziedziczyłem z password i password_again (który dopisałem) , a pozostałe pola mam tylko Validatory (bez widgetów, których nie dziedziczyłem) ... no i nie zrobiłem UNSET na ID ftabeli 2 i tabeli 3 ponieważ one się tak samo nazywają ( ID ) jak w tabeli sfGuardUser ...



To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.