IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Form] Formulaire avec deux entités abstraites


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Février 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 47
    Par défaut [Form] Formulaire avec deux entités abstraites
    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 :

    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;
    }
    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
     
    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';
    	}
    }
    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
    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 %}
    Grâce a tous ce code ! j'ai visuellement ce que je souhaite c'est à dire :

    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 :

    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,
    	    ));
    	}
    }
    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...)

    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 !

  2. #2
    Membre actif
    Inscrit en
    Février 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 47
    Par défaut
    petit up :$

Discussions similaires

  1. [AJAX] Formulaire avec deux listes dynamiques liées
    Par gotcha5832 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/03/2007, 10h40
  2. Formulaire avec deux boutons submit
    Par Taz_8626 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 30/03/2006, 11h41
  3. Réponses: 8
    Dernier message: 13/03/2006, 17h37
  4. Formulaire avec deux boutons
    Par Oberown dans le forum Langage
    Réponses: 1
    Dernier message: 12/09/2005, 17h06
  5. Réponses: 10
    Dernier message: 10/06/2004, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo