Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2][Symfony2] Checkbox i dodatkowy formularz
Forum PHP.pl > Forum > PHP > Frameworki
Fluke
Witam,

Mam problem z formularzem w Syfmony 2. Mianowicie, mam pole typu "checkbox" (name="createNewGroup") i pole typu "group" - własna klasa formularza która zawiera 2 pola(id, term). Pole term służy do do wyszukania istniejących grup (autocomplete). Teraz chcę umożliwić użytkownikowi dodatkowo stworzenie nowej grupy(jeśli zaznaczy pole "createNewGroup"). Pole "group" zostaje schowane i ma pojawiać się dodatkowy formularz z polami do tworzenia nowej grupy(nazwa, opis, itp...).

W jaki sposób można to rozwiązać w Syfmony 2? Może znacie jakieś proste rozwiązania ? Próbowałem coś z FormEvents ale nie widzę tego za bardzo.

Pozdrawiam.

Nie ma nikt pomysłu jak można było by to zrobić ?
skowron-line
Ukrywanie pól formularza to po stronie JS

A co do SF2 to poszukaj sobie na YT prezentacji Bernarda Schusska on opowiada jak rozwiązać taką systuację jaką ty masz

https://speakerdeck.com/webmozart/3-steps-t...y2-form-mastery tu jest prezentacja ale na YT też gdzieś znajdziesz.
Fluke
Głowna klasa formularza
  1. $builder->add(
  2. 'group',
  3. new FindOrCreateType(
  4. $builder->create(
  5. 'findGroup',
  6. new Autocomplete(
  7. $this->getRouter()->generate('_coupon_groups_ajax_find')
  8. ),
  9. 'required' => false,
  10. 'mapped' => false
  11. )
  12. ),
  13. $builder->create(
  14. 'newGroup',
  15. new CouponGroupType(),
  16. 'mapped' => false,
  17. 'required' => false
  18. )
  19. )
  20. ),
  21. 'mapped' => false
  22. )
  23. );


Klasa typu, który będzie dodawał 3 pola:
  1. class FindOrCreateType extends AbstractFormType {
  2. protected $findType;
  3. protected $createType;
  4. protected $checkboxChoserOption = 'createOrFind';
  5.  
  6. public function __construct(
  7. FormBuilderInterface $findType,
  8. FormBuilderInterface $createType,
  9. $checkboxChoserOption = 'createOrFind')
  10. {
  11. $this->findType = $findType;
  12. $this->createType = $createType;
  13. $this->checkboxChoserOption = $checkboxChoserOption;
  14. }
  15.  
  16. public function buildForm(FormBuilderInterface $builder, array $options) {
  17. $builder->add($this->findType);
  18. $builder->add($this->createType);
  19.  
  20. $builder->add(
  21. $this->checkboxChoserOption,
  22. 'checkbox',
  23. 'required' => false,
  24. 'mapped' => false
  25. )
  26. );
  27.  
  28. $builder->addModelTransformer(new FindOrCreateTransformer());
  29. }
  30.  
  31. /**
  32.   * Returns the name of this type.
  33.   *
  34.   * @return string The name of this type
  35.   */
  36. public function getName() {
  37. return 'find_or_create';
  38. }
  39. }


DataTransformer:
  1.  
  2. class FindOrCreateTransformer implements DataTransformerInterface {
  3. public function transform($value) {
  4. var_dump($value);
  5. }
  6.  
  7. public function reverseTransform($value) {
  8. var_dump($value);
  9. }
  10. }


I niestety ale w każdym przypadku zwraca albo pustą tablicę albo null. W zend jakoś normalnie chyba te formularze były zrobione. Tutaj na każdym kroku mam problem. Nie wierzę, że nikt nie miał takiego przypadku i nie ma na to rozwiązania.

Głowię się z tym już 3 dni i nic mi nie przychodzi do głowy. Pewnie to jest banalnie proste dla was ale dla mnie jest to w ogóle nie logiczne. W tym momencie uważam, że formularze w Symfony2 są beznadziejne w porównaniu z innymi fw... - oczywiście to moje aktualne zdanie tongue.gif

No dobra, już prawie mam to co chciałem. Ale ....

Główny formularz:
  1. $builder->add('createNewGroup', 'checkbox', array(
  2. 'mapped' => false,
  3. 'required' => false
  4. ));
  5.  
  6. $builder->add(
  7. 'newGroup',
  8. new CouponGroupType(),
  9. 'mapped' => false,
  10. 'required' => false
  11. )
  12. );
  13. $builder->add(
  14. $builder->create(
  15. 'findGroup',
  16. new Autocomplete($this->getRouter()->generate('_coupon_groups_ajax_find')),
  17. 'mapped' => false,
  18. 'required' => false
  19. )
  20. )->addModelTransformer(new DataToEntityTransformer(Group::class, null, $this->getContainer()))
  21. );
  22.  
  23. $builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) {
  24. $form = $event->getForm();
  25. $data = $event->getData();
  26.  
  27. if((boolean) $form->get('createNewGroup')->getData()) {
  28. $data->setGroup($form->get('newGroup')->getData());
  29. } else {
  30. $data->setGroup($form->get('findGroup')->getData());
  31. }
  32. });

To załatwia to co jest w temacie. Tylko teraz mam problem jak zrealizować aby formularz nie przechodził walidacji gdy użytkownik zaznaczy checkbox i nie wprowadzi żadnych danych w formularzu: newGroup. Zrobiłem sobie taki event:

  1. $builder->addEventListener(FormEvents::SUBMIT, function(FormEvent $event) {
  2. $form = $event->getForm();
  3.  
  4. $checkbox = $form->get('createNewGroup');
  5.  
  6. if((boolean) $checkbox->getData()) {
  7. $form->add(
  8. 'newGroup',
  9. new CouponGroupType(),
  10. 'auto_initialize' => false,
  11. 'required' => true,
  12. 'mapped' => false,
  13. 'cascade_validation' => true
  14. )
  15. );
  16. }
  17. });


A o to mój typ (CouponGroupType):
  1. $builder->add('id', 'hidden');
  2. $builder->add('name', 'text', array(
  3. 'required' => true
  4. ));
  5. $builder->add('description', 'textarea', array('required' => false));
skowron-line
  1. $builder->add('field', new FieldType(), array(
  2. 'required' => false,
  3. 'validation_groups' => function (FormInterface $form) {
  4. if ($form->getParent()->get('field')->getData() === false) {
  5. return array();
  6. }
  7. return array('Default');
  8. }
  9. ))
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.