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 type date jours et mois non obligatoire


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut Form type date jours et mois non obligatoire
    Bonjour

    J'ai un champ date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    ->add('date_deces', 'birthday', array(
                        'empty_value' => '',
                        'label' => "Date de décès",
                        'years' => range(1800,date('Y')),
                        'empty_value' => array('year' => 'Année', 'month' => 'Mois', 'day' => 'Jour'),
                        'required' => false,
                        'attr' => array('class' => $class)))
    Dans mysql il s'agit d'un champ date

    Je voudrais qu'on puisse n'encoder que l'année car dans certains cas on a pas la date complète de mort
    Comment faire ?

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Si tu types ta données en date, datetime ou timestamp en base de données, c'est pas physiquement possible de stocker juste une année. Pour moi il faut créer un champ année de type varchar (ou char(4)) en base de données.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    Ben si c'est possible sous le format 2010-00-00

    Je pourrai utiliser l’événement POST_SUBMIT sur le formulaire pour venir ajouter les 00-00 avant d'enregistrer dans la db
    mais le formulaire resterai quand même bloqué à cause de la contrainte mise automatiquement par sf

    Comment ne pas faire de vérif sur un champ ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Pour ton cas moi j'utiliserais un data_transformer ....
    http://symfony.com/fr/doc/current/co...nsformers.html

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    J'essaie un datatransformer mais je sèche un peu
    Le premier soucis c'est que j'ai sf qui me dit donnée invalide quand je submit le form
    alors que j'ai ajouté : 'constraints' => array(),


    voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    //Mon defuntType.php
    $datetransformer = new IncompleteDateTransformer();
     
    ->add($builder->create('date_deces', 'date', array(
                        'empty_value' => '',
                        'label' => "Date de décès",
                        'constraints' => array(),
                        'years' => range(1800,date('Y')),
                        'empty_value' => array('year' => 'Année', 'month' => 'Mois', 'day' => 'Jour'),
                        'required' => false,
                        'attr' => array('class' => $class)))
                            ->addModelTransformer($datetransformer))
    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
     
    <?php
    //Ma class IncompleteDateTransformer
     
    class IncompleteDateTransformer implements DataTransformerInterface {
     
        /**
         * 
         */
        public function transform($date) {
     
            if (null === $date) {
                return $date;         
            }        
     
            return $date;
        }
     
        /**
         *
         *
         */
        public function reverseTransform($date) {               
     
            if (!is_array($date)) {
                return $date;
            }
     
            if (empty($date['year'])) {
                return $date;
            }
     
            if (empty($date['day'])) {
                $date['day'] = 00;
            }
     
            if (empty($date['month'])) {
                $date['month'] = 00;
            }
     
            return $date;
        }

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Une autre piste serait de créer ton propre champs date perso plutot qu'utilisé le date par défaut de symfony (comme ca, tu peux mettre toutes tes contraintes etc..)
    http://symfony.com/fr/doc/current/co...ield_type.html

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    Bon peu importe la manière dont je contourne le problème
    à partir du moment ou j'ai définis dans mon entité le champ en date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
        /**
         * @ORM\Column(type="date", nullable=true, options={"comment" = "date de mort"})
         */
       protected $date_deces;
    sf va passer par \DateTime pour enregistrer avec doctrine
    Et DateTime refuse, logiquement, une date sans jour ni mois

    Tant pis, je passe mon champ en string

  8. #8
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    A minima, un int(4) non signé me paraît plus approprié qu'une string.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  9. #9
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    Oui pour quand on a juste l'année de mort, mais on a aussi parfois la date complète...

  10. #10
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Dans ce cas, il me semble (à voir pour toi), tu t'enlèves une épine du pied mais tu t'en rajoutes deux ou trois. Ca risque de compliquer ton développement par la suite.

    Créer un type personnalisé, comme suggéré ci-dessus, me semble être une bonne solution.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  11. #11
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    oui mais le soucis comme dit plus haut, en mettant le champ de mon entité doctrine en type date
    sf passe obligatoirement par la fonction datetime de php

    je ne sais pas comment outre passer ça

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Hey, t'aimes pas les DataTransformer toi ?


    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
     
    <?php
     
    namespace App\ProductBundle\Form\DataTransformer;
     
    use Symfony\Component\Form\DataTransformerInterface;
    use Symfony\Component\Form\Exception\TransformationFailedException;
     
    class StringToDatetimeTransformer  implements DataTransformerInterface
    {
     
        public function transform($date)
        {
            if (null === $date) {
                return "";
            }
            return $date->format('j/m/Y');
     
        }
     
        public function reverseTransform($number)
        {
            if (!$number) {
                return null;
            }
     
     
            if (preg_match('/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/', $number, $matches)) {
                $date = \DateTime::createFromFormat('d-m-Y', $matches[1].'-'.$matches[2].'-'.$matches[3]);
                return $date;
            }
     
            if (preg_match('/([0-9]{2})\/([0-9]{4})/', $number, $matches)) {
                $date = \DateTime::createFromFormat('m-Y', $matches[1].'-'.$matches[2]);
                return $date;
            }
     
            if (preg_match('/([0-9]{4})/', $number, $matches)) {
                $date = \DateTime::createFromFormat('Y', $number);
                return $date;
            }
     
     
            return null;
        }
    }

    le form type :

    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
     
    <?php
     
    namespace App\ProductBundle\Form\Type;
     
     
    use App\ProductBundle\Form\DataTransformer\StringToDatetimeTransformer;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class DateStringType extends AbstractType
    {
        public function __construct()
        {
        }
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->addModelTransformer(new StringToDatetimeTransformer());
        }
     
     
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
            ));
        }
     
        public function getParent()
        {
            return 'text';
        }
     
        public function getName()
        {
            return 'date_string';
        }
    }

    il faut l'enregistrer comme service ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
     
        <services>
            <service id="product.form.type.date_string" class="App\ProductBundle\Form\Type\DateStringType">
                <tag name="form.type" alias="date_string" />
            </service>
        </services>
     
    </container>

  13. #13
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    Hey, t'aimes pas les DataTransformer toi ?
    Si.... mais comme je le répète un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php
    $t = \DateTime::createFromFormat('Y',1920)
    echo $t;
    Affiche

    "1925-06-03"

    Ce qui ne m'arrange pas

    Mais merci quand même je garde ton code pour au cas où ;-)

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Et tu voudrais quoi comme sortie ?
    tu veux un 00-00-2004 ?

  15. #15
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    J'ai un champ date dans ma bd sql donc
    si je veux enregistrer une date incomplète je dois mettre
    00-00-2014

    Mais doctrine vu que mon champ entite "date_deces" est définis au format "date", doctrine
    d'office convertit la valeur donnée en DateTime et DateTime refuse (heu modifie ma date) si je ne lui
    donne pas de valeur pour jour et mois

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Alors il faut juste que tu "set" les paramètres manquant lors de la transfo, non ?

Discussions similaires

  1. [HighCharts] Affichage de ma date (jour et mois) dans la tooltip ?
    Par [ZiP] dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 18/12/2013, 13h35
  2. Réponses: 4
    Dernier message: 04/09/2009, 12h07
  3. Problème de dates (jour et mois inversés)
    Par Razor82 dans le forum VB.NET
    Réponses: 4
    Dernier message: 07/08/2009, 16h55
  4. Réponses: 4
    Dernier message: 31/05/2009, 20h42
  5. Format date jour du mois en lettres
    Par Mykhell dans le forum SQL
    Réponses: 8
    Dernier message: 08/04/2009, 12h29

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