Bonjour à tous !
Je galère a faire ce que je veux avec symfony 2.1 je vais tâché de m'expliquer correctement
J'ai une notion de contrainte d'accès.
Une contrainte d'accès est représenté par 2 date.
Sachant qu'une date peut être soit relative soit absolue (DateRelative, DateAbsolue)
Une date relative étant représenter par un DateInterval et une date absolue étant représenter par un DateTime.
Voici mes entités :
Voici mes formulaires :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 /** * @ORM\Entity * @ORM\Table(name="et_contraint_access") */ class ConstraintAccess { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var Bundle\Entity\Date * @ORM\OneToOne(targetEntity="Date") * @ORM\JoinColumn(name="id_date", referencedColumnName="id") */ protected $DateStart; /** * @var Bundle\Entity\Date * @ORM\OneToOne(targetEntity="Date") * @ORM\JoinColumn(name="id_date", referencedColumnName="id") */ protected $DateEnd; } /** * @ORM\Entity * @ORM\Table(name="et_date") * @ORM\InheritanceType("SINGLE_TABLE") * @ORM\DiscriminatorColumn(name="type", type="string") * @ORM\DiscriminatorMap({"Relative" = "DateRelative", "Absolue" = "DateAbsolue"}) */ class Date implements IDate { /** * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * @ORM\Column(type="integer") */ protected $id; } /** * @ORM\Entity * @ORM\Table(name="et_date_relative") */ class DateRelative extends Date { /** * @ORM\Id * @ORM\Column(type="integer") */ protected $id; /** * @var \DateInterval * @ORM\Column(type="string", length=50) */ protected $DateInterval; } /** * @ORM\Entity * @ORM\Table(name="et_date_absolue") */ class DateAbsolue extends Date { /** * @ORM\Id * @ORM\Column(type="integer") */ protected $id; /** * @var \DateTime * @ORM\Column(type="datetime") */ protected $DateTime; }
Et enfin mes vues :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 class ConstraintAccessType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('DateStart', new DateType(), array( 'label' => 'Date début' )) ->add('DateEnd', new DateType(), array( 'label' => 'Date fin' )) ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Bundle\Entity\ConstraintAccess', 'csrf_protection' => false )); } } class DateType extends AbstractType { public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Bundle\Entity\ConstraintAccess', 'csrf_protection' => false, 'label' => 'Type', 'empty_value' => 'Selectionnez un type de date', 'choices' => array( 'Relative' => 'Relative', 'Absolue' => 'Absolue', ), 'attr' => array( 'onchange' => 'getAjaxForm(this)', ) )); } public function getParent() { return 'choice'; } }
Grâce a tous ce code ! j'ai visuellement ce que je souhaite c'est à dire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 {% block bundle_constraintaccesstype_widget %} {% spaceless %} {% for field in form %} <div class="row"> <div class="column twelve"> {{ form_errors(field) }} </div> </div> <div class="row"> <div class="column three"> {{ form_label(field) }} </div> <div class="column three"> {{ form_widget(field) }} </div> <div class="column six" id="bundle_datetype_form-container"> </div> </div> {% endfor %} <script type="text/javascript"> function getAjaxForm(elt) { $.get('{{path('date_getAjaxForm')}}', {type: $(elt).val()}, function(data) { $(elt).parent().next().html(data); }); } </script> {% endspaceless %} {% endblock %} {% block bundle_datetype_widget %} {% spaceless %} <div class="row"> <div class="column five"> {{ block('choice_widget') }} </div> <div class="column seven" id="bundle_datetype_form-container"> </div> </div> {% endspaceless %} {% endblock %} {% block bundle_daterelativetype_widget %} {% spaceless %} <div class="row"> <div class="column twelve"> {{ form_errors(form) }} </div> </div> <div class="row"> <div class="column twelve"> {{ form_widget(form) }} </div> </div> {% endspaceless %} {% endblock %}
quand je veux ajouter une contrainte d'accès j'ai 2 champs
Date début
Date fin
pour chacun de ces champs j'ai un select me demandant de choisir le type de date que je souhaite pour chacune (Relative ou Absolue) en fonction du choix que je fait j'ai le formulaire qui s'injecte.
Le souci est lors de la validation du formulaire j'ai des retours avec des erreurs de type : ConstraintAccessateDebut doit être de type date (hors sa valeur vaut la valeur du select (c'est à dire soit "Relative" soit "Absolue")
je commence à bloquer réellement la :/
Voici pour finir mes controllers qui sont rester classique :
Si je fait un dump de $form->getData(); dans mon ConstraintAccessController je n'obtient que 2 valeurs (correspondant au choix de mes 2 selects) je ne récupère pas les valeurs des formulaires injectés en ajax du coup je ne peut pas les travailler...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 /** * ConstraintAccess controller. * */ class ConstraintAccessController extends Controller { /** * Displays a form to create a new ConstraintAccess entity. * */ public function newAction() { $entity = new ConstraintAccess(); $form = $this->createForm(new ConstraintAccessType(), $entity); return $this->render('Bundle:ConstraintAccess:new.html.twig', array( 'entity' => $entity, 'form' => $form->createView(), )); } /** * Creates a new ConstraintAccess entity. * */ public function createAction(Request $request) { $entity = new ConstraintAccess(); $form = $this->createForm(new ConstraintAccessType(), $entity); $form->bind($request); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($entity); $em->flush(); return $this->redirect($this->generateUrl('constraintaccess_show', array('id' => $entity->getId()))); } return $this->render('Bundle:ConstraintAccess:new.html.twig', array( 'entity' => $entity, 'form' => $form->createView(), )); } } /** * Date controller. * */ class DateController extends Controller { public function getAjaxFormAction() { $type = $this->get('request')->query->get('type'); switch( $type ) { case 'Relative': $form = $this->createForm(new DateRelativeType()); break; case 'Absolue': $form = $this->createForm(new DateAbsolueType()); break; default: return new Response(); break; } return $this->render('Bundle:Date'.$type.':new.html.twig', array( 'form' => $form->createView(), 'type' => $type, )); } }
je ne sais absolument pas si c'est la bonne technique pour faire ce que je souhaite.
Je compte sur vous pour m'éclairer !
D'avance merci !
Partager