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

Zend Framework PHP Discussion :

[Contribution] Élément "Date" pour Zend_Form


Sujet :

Zend Framework PHP

  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut [Contribution] Élément "Date" pour Zend_Form
    Bonsoir

    Il n'y a pas de section "Contribuer" sur la partie ZF donc je poste ici, en espérant que ça puisse servir à certaines personnes. Si vous avez des suggestions pour l'améliorer n'hésitez pas (notamment pour simplifier l'expression régulière, je suis pas très bon sur ça). Mon code adapte la date suivant la locale (donc on aura automatique Jour mois année en France, alors que s'affichera Mois Jour, Année en anglais.

    A noter qu'il n'y a pas de vérification actuellement (on peut choisir le 31 février 2010, à vous d'ajouter un validateur par dessus).

    Tout d'abord l'élément Date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
     
    	class Application_Form_Element_Date extends Zend_Form_Element_Xhtml
    	{
    		public $helper = 'formDate';
    	}
    Puis l'aide de vue FormDate, qui récupère le formatage correct suivant la locale, récupère les mois (traduits), les jours et les années. Concernant le formatage, j'utilise la fonction Zend_Locale_Format::getDateFormat qui renvoie une chaîne de caractères avec le formatage d'une date dans la locale courante, par exemple dd mmm yy ou d/MM/yyyy ou dd-MM-yyyy ou n'importe quoi d'autre. Je sépare tous ces éléments avec une expression régulière et je traverse chaque élément afin d'ajouter dans l'ordre correct ces différents éléments.

    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
     
    <?php
     
    	class View_Helper_FormDate extends Zend_View_Helper_FormElement
    	{
    		public function formDate($name, $value = null, array $attribs = array())
    		{
    			$regex = '/([dmy]+)([-., \\/]+)/i';
    			$format = Zend_Locale_Format::getDateFormat();
    			$result = preg_split($regex, $format, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
     
    			$xhtml = '';
    			foreach($result as $dateElement)
    			{
    				if (stripos ($dateElement, 'd') !== false)
    					$dateElement = $this->view->formSelect('day', null, null, $this->_getDayList());
    				else if (stripos ($dateElement, 'm') !== false)
    					$dateElement = $this->view->formSelect('month', null, null, Zend_Locale::getTranslationList('Month'));
    				else if (stripos ($dateElement, 'y') !== false)
    					$dateElement = $this->view->formSelect('year', null, null, $this->_getYearList());
     
    				$xhtml .= $dateElement;
    			}
     
    			return $xhtml;
    		}
     
    		protected function _getDayList()
    		{
    			$result = array();
    			for ($i = 1 ; $i <= 31 ; ++$i)
    				$result[$i] = $i;
     
    			return $result;
    		}
     
    		protected function _getYearList()
    		{
    			$result = array();
    			for ($i = 2010 ; $i >= 1900 ; --$i)
    				$result[$i] = $i;
     
    			return $result;
    		}
    	}
    A l'usage, dans votre formulaire :

    Il faut d'abord ajouter le chemin vers l'élément personnalisé, dans mon cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->addPrefixPath('Application_Form_Element', 'Application/Form/Element', 'element')
    Puis vous créez l'élément Date suivant le nom de l'élément (donc Date) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $birthDate = $this->createElement('Date', 'birth_date');
    $birthDate->setLabel('Date de naissance');
    Et voilà, vous aurez trois champs Jour mois année qui seront automatiquement traduits et dans l'ordre de la locale courante.

  2. #2
    Inactif
    Inscrit en
    Octobre 2008
    Messages
    826
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 826
    Points : 172
    Points
    172
    Par défaut
    Je suis sidéré par le nombre de ligne, juste pour l'affichage d'une date en fr.

  3. #3
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Citation Envoyé par thebarbarius Voir le message
    Je suis sidéré par le nombre de ligne, juste pour l'affichage d'une date en fr.
    Ca va encore, ça aurait pu être pire

  4. #4
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par thebarbarius Voir le message
    Je suis sidéré par le nombre de ligne, juste pour l'affichage d'une date en fr.
    Si tu te contentes de la date française, quelque chose comme ça devrait suffire :

    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
    <?php
     
    	class View_Helper_FormDate extends Zend_View_Helper_FormElement
    	{
    		public function formDate($name, $value = null, array $attribs = array())
    		{
     
    			$xhtml = '';
    			$xhtml .= $this->view->formSelect('day', null, null, $this->_getDayList()) . ' ';
    			$xhtml .= $this->view->formSelect('month', null, null, Zend_Locale::getTranslationList('Month')) . ' ';
    			$xhtml .= $this->view->formSelect('year', null, null, $this->_getYearList());
     
    			return $xhtml;
    		}
     
    		protected function _getDayList()
    		{
    			$result = array();
    			for ($i = 1 ; $i <= 31 ; ++$i)
    				$result[$i] = $i;
     
    			return $result;
    		}
     
    		protected function _getYearList()
    		{
    			$result = array();
    			for ($i = 2010 ; $i >= 1900 ; --$i)
    				$result[$i] = $i;
     
    			return $result;
    		}
    	}
    Mais mon site ayant l'intention d'être traduit dans un nombre important de langue, ça me semblait important de pouvoir localiser également la manière de formater les dates sur les formulaires.

  5. #5
    Inactif
    Inscrit en
    Octobre 2008
    Messages
    826
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 826
    Points : 172
    Points
    172
    Par défaut
    Je te rassure, je ne critique pas ton code.

    Un code avec 20 ligne n'est pas forcement pire qu'un code de 10 ligne, dont le résultat final est identique.

  6. #6
    Membre éclairé Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Points : 663
    Points
    663
    Par défaut
    Merci pour ta contribution!
    Les idiots sont ceux qui ne posent jamais de question!

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