Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][Symfony2]This form should not contain extra fields
Forum PHP.pl > Forum > PHP > Frameworki
bartos12
Witam,

Każdy użytkownik na mojej stronie ma możliwość zmodyfikowania swoich danych, tj. imię, nazwisko, hasło. Chce, aby wszystko było zrobione za pomocą jednego formularza z tym, że jeżeli użytkownik nie chce zmienić hasła a jedynie imię i nazwisko to nie uaktywnia pola password (pole password normalnie jest disabled i można je odblokować za pomocą checkbox).

A teraz w czym problem. Mam taki formularz :

  1. $builder->add('userName', 'hidden', array("label" => 'Name'))
  2. ->add('userFirstname', 'text', array("label" => 'First name'))
  3. ->add('userLastname', 'text', array("label" => 'Last name'))
  4. ->add('', 'checkbox', array(
  5. "label" => "Change password",
  6. "value" => false
  7. ))
  8. ->add('userPass', 'repeated', array(
  9. 'type' => 'password',
  10. 'first_name' => 'Password',
  11. 'second_name' => 'Re-enter Password',
  12. 'invalid_message' => "The passwords don't match!",
  13. 'read_only' => true
  14. ))
  15. ->add('userId', 'hidden');


Jak widać już na samym początku blokuje pola password.
Akcja wygląda tak :

  1. $em = $this->getDoctrine()->getEntityManager();
  2.  
  3. if($request->getMethod() == "POST")
  4. {
  5. $user = new user();
  6. $form = $this->createForm(new UserConfigType(), $user);
  7. $form->bindRequest($request);
  8.  
  9. if($form->isValid())
  10. {
  11. $id = $user->getUserId();
  12. $object = $em->getRepository('AcmeFootballBundle:User')->find($id);
  13. $object->setUserFirstname($user->getUserFirstname());
  14. $object->setUserLastname($user->getUserLastname());
  15.  
  16. if($user->getPassword()){
  17. $encoder = $this->container->get('sha256salted_encoder');
  18. $password = $encoder->encodePassword($user->getPassword(), $user->getSalt());
  19. $user->setUserPass($password);
  20. }
  21.  
  22. $em->flush();
  23. return $this->redirect ($this->generateUrl ('_userIndex'));
  24. }
  25. }else
  26. {
  27. $id = $this->get('security.context')->getToken()->getUser()->getUserId();
  28. $user = $em->getRepository('AcmeFootballBundle:User')->find($id);
  29. $form = $this->createForm(new UserConfigType(), $user);
  30. }
  31.  
  32. return $this->render('AcmeFootballBundle:User:config.html.twig', array(
  33. "form" => $form->createView()
  34. ));


i na koniec widok :

  1. <form action="{{ path('_userConfig') }}" method="post" {{ form_enctype(form) }}>
  2. {{form_widget(form)}}
  3. <input type="submit" class="button"/>
  4. </form>


Problem polega na tym że gdy próbuje zapisać zmiany w imieniu czy nazwisku bez aktywowania przez js pól password wszystko jest wporządku. Jednak gdy uaktywnie pole password to nie przechodze walidacji. Pojawia się komunikat "This form should not contain extra fields". Co najlepsze gdy pozbęde się

  1. 'read_only' => true


z formularza i spróbuje zapisać nowe hasło jest ok. Ale gdy z dezaktywuje a potem znów aktywuje pola znowu pojawia się ten błąd. Trochę to dziwne po przecież nie robię nic oprócz dodania atrybutu disabled.
nospor
Ale paranoja te formy w symfony :/ A może to tylko ty ustawiłeś jakieś dziwne opcje dla forma? Bo nie chce mi się wierzyć że normalna klasa ot tak sobie zabrania mi wysłać formem dodatkowych danych, której jej nie opisałem

No nic, do rzeczy: nie znam się na formach w symfony a nasuwa się baaaardzo logiczny wniosek: gdy postem poleci też hasło, to najzwyklej w świecie
zamiast : 'read_only' => true
rób: 'read_only' => false

Tłumacząc na język php:
'read_only' => !isset($_POST['userPass'])
bartos12
Ok, miałeś racje w momęcie gdy ustawiłęm w form "read_only" na true to przy bindowaniu formularza danymi z post, password nie miał jak się ustawić.

Rozwiązanie : read_only na false i w przypadku gdy nie interesuje mnie zmiana hasła to blokuje pole. (domyślnie jest aktywne)

I tutaj kolejne pytanie mianowicie jak zrobić żeby działało to na odwrót (domyślnie blokuje,a gdy chce zmienić hasło to aktywuje pole).

---------------------------------------------------------------------------------------------------------------------------------------------------------------

Heh próbowałem na wszystkie znane mi sposoby i albo nie działało albo działało ale nie do końca. Także poprostu zaczołem ukrywać pola zamiast blokować i teraz jest ok.

Pusz łapka dla ciebie tongue.gif
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.