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 :
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 <?php class Application_Form_Element_Date extends Zend_Form_Element_Xhtml { public $helper = 'formDate'; }
A l'usage, dans votre formulaire :
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; } }
Il faut d'abord ajouter le chemin vers l'élément personnalisé, dans mon cas :
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 $this->addPrefixPath('Application_Form_Element', 'Application/Form/Element', 'element')
Et voilà, vous aurez trois champs Jour mois année qui seront automatiquement traduits et dans l'ordre de la locale courante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $birthDate = $this->createElement('Date', 'birth_date'); $birthDate->setLabel('Date de naissance');
Partager