Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][Symfony]FOSUserBundle - nadpisywanie formularzy
Forum PHP.pl > Forum > PHP > Frameworki
adibak20
Witam:
Zrobiłem nadpisywanie formularza rejestracyjnego tak jak jest w dokumentacji: https://github.com/FriendsOfSymfony/FOSUser...riding_forms.md

Dodałem kilka pól i wszystko działa teraz chce aby była możliwość edycji danych. Po przeanalizowaniu pakietu stwierdziłem że trzeba nadpisać kontroler ProfilControler, ProfileFormType i ProfileFormHandler, zrobiłem prawie analogiczne do rejestracji, czyli:

w ProfileFormType:

  1. public function buildForm(FormBuilderInterface $builder, array $options){
  2.  
  3. parent::buildForm($builder, $options);
  4.  
  5. $builder->add('imie')
  6. ->add('nazwisko','text')
  7. ->add('telefon','text')
  8. ->add('miejscowosc','text')
  9. ->add('dataurodzienia','birthday')
  10. ->add('plec','choice',array(
  11. 'choices'=> array(
  12. 1 => 'Kobieta',
  13. 2 => 'Meczyzna'
  14. )))
  15. ->add('pesel','text');
  16. }
  17.  
  18. public function getName(){
  19. return 'my_user_profile';
  20. }
  21.  


ProfileFormHandler
  1. protected function onSuccess(UserInterface $user)
  2. {
  3. $data_ur=date_format($user->getDataurodzienia(),"Y-m-d");
  4. $data_br=date("Y-m-d");
  5. $data_ur_unix=strtotime($data_ur);
  6. $data_br_unix=strtotime($data_br);
  7. $wiek=round(($data_br_unix-$data_ur_unix)/(60*60*24*365.25));
  8.  
  9.  
  10. $user->setWiek($wiek);
  11.  
  12. //$this->userManager->updateUser($user);
  13.  
  14. parent::onSuccess($user);
  15. }


w services.xml dodałem:

  1.  
  2. <service id="my_user.profile.form.type" class="My\FrontendBundle\Form\Type\ProfileFormType">
  3. <tag name="form.type" alias="my_user_profile"/>
  4. <argument>%fos_user.model.user.class%</argument>
  5. </service>
  6. <service id="my_user.profile.form.handler.default" class="My\FrontendBundle\Form\Handler\ProfileFormHandler" scope="request" public="false">
  7. <argument type="service" id="fos_user.profile.form" />
  8. <argument type="service" id="request" />
  9. <argument type="service" id="fos_user.user_manager" />
  10. </service>
  11.  


oraz w conifig.yml

  1. ...
  2. profile:
  3. form:
  4. type: my_user_profile
  5. handler: my_user.profile.form.handler.default


Teraz w nadpisałem akcje edit w ProfileController:

  1. /**
  2. * Edit the user
  3. */
  4. public function editAction()
  5. {
  6. $user = $this->container->get('security.context')->getToken()->getUser();
  7. if (!is_object($user) || !$user instanceof UserInterface) {
  8. throw new AccessDeniedException('This user does not have access to this section.');
  9. }
  10.  
  11. $form = $this->container->get('my_user.profile.form.type');
  12. //$form = $this->container->get('fos_user.profile.form'); <- zmiana
  13.  
  14. $formHandler = $this->container->get('my_user.profile.form.handler.default');
  15. //$formHandler = $this->container->get('fos_user.profile.form.handler'); <- zmiana
  16. $process = $formHandler->process($user);
  17. if ($process) {
  18. $this->setFlash('fos_user_success', 'profile.flash.updated');
  19.  
  20. return new RedirectResponse($this->getRedirectionUrl($user));
  21. }
  22.  
  23. return $this->container->get('templating')->renderResponse(
  24. 'FOSUserBundle:Profile:edit.html.'.$this->container->getParameter('fos_user.template.engine'),
  25. array('form' => $form->createView())
  26. );
  27. }


Teraz jak uruchamiam projekt to twierdzi że nie zna 'my_user.profile.form.handler.default' .

Wie ktoś gdzie robię błąd.
Z góry dziękuje za pomoc.
ano
1. Wyczyść cache (ale jeżeli pracujesz w środowisku dev to niestety nie z cachem problem)
2. Wklej exception, który Ci wywala Symfony2.

PS.
  1. $data_ur=date_format($user->getDataurodzienia(),"Y-m-d");
  2. $data_br=date("Y-m-d");
  3. $data_ur_unix=strtotime($data_ur);
  4. $data_br_unix=strtotime($data_br);
  5. $wiek=round(($data_br_unix-$data_ur_unix)/(60*60*24*365.25));


Jeszcze takiego kodu nie widziałem... Po coś zrobili typy formularzy "DateTime"/"Date" więc nie rozumiem co chcesz osiągnąć tym kodem... ;o
A różnice dat robisz metodą DateTime::diff a potem DateInterval::format żeby uzyskać wiek np w latach)
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.