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

Autres composants PHP Discussion :

Zend_Date dans un format précis


Sujet :

Autres composants PHP

  1. #1
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut Zend_Date dans un format précis
    Bonjour,

    Je voudrais avoir une date sous le format dd-mm-yyyy à partir de Zend_date.

    Je fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $date = new Zend_date();
    //ajoute 15 jours
    $this->view->date = $date->add('360', Zend_Date::HOUR);
    mais cela affiche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    4 déc 2008 10:49:36
    or je voudrais juste

    Merci de votre aide.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Je me réponds à moi même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $date = new Zend_Date(Zend_Date::ISO_8601);//je crée la date     
     $date->add('360', Zend_Date::HOUR);//j'ajoute 15 jours
     $date = $date->toString('dd-MM-yyyy');//je passe le format
     $this->view->date = $date;//je passe à  la vue

  3. #3
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Salut,

    si je puis me permettre une remarque, cette conversion devrait s'effectuer dans ta vue et non dans l'action de ton contrôleur, pour rester conforme au pattern MVC.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Je veux bien que tu développes, Pq je passerais dans ma vue une classe , plutôt qu'un String, je pensais justement que dans le MVC, le traitement ce fais au niveau du contôleur ?

  5. #5
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Dans le contrôleur on ne doit en principe trouver que la logique de l'application, la façon dont doit s'afficher la date est un détail de présentation qui ne doit donc concerner que la vue. Pour le changement de format, tu peux utiliser les ViewHelpers qui sont là pour ça.

    Pour prendre un exemple, imagine que demain l'IHM de ton application ne soit plus en français mais en anglais ; ce changement de langue ne modifie pas la logique interne de ton application, et donc seules les vues devraient être impactées. Pourtant, tel que tu as codé, le fait de devoir maintenant présenter la date au format anglo-saxon (MM/JJ/AAAA) va entraîner une intervention sur le contrôleur, ce qui ne devrait pas être le cas.

    Au final, le fait de déporter tous les traitements destinés à un affichage (ou à une interface avec une application cliente) dans les vues permet d'alléger le code des contrôleurs, et faciliter la maintenance. C'est tout l'intérêt de MVC.

    Selon la même logique, ton calcul de date, en tant que règle métier, devrait être implémenté dans une méthode de classe modèle, appelée par l'action du contrôleur ; le code de cette action se limiterait donc à initialiser le modèle, appeler sa méthode qui renvoie la date incrémentée, et la transmettre à la vue.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Ok, je développe.

    Question : Puis-je utiliser plusieurs méthodes dans mon Helper, ou juste un helper/une méthode?

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Ok, j'ai fais ceci

    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
     
    <?php
    class Zend_View_Helper_DateFormat {
     
     
        public function dateFormat($date = null,$heures = '0') {
     
            //creation de la date
            $jours = new Zend_Date($date,Zend_Date::ISO_8601);
           // nombres d'heures à rajouter pour avoir une date différencié.
            $jours->add($heures, Zend_Date::HOUR);
            return $jours->toString('dd-MM-yyyy');
     
        }
     
    }
    ?>
    dans mon controller

    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
     
     public function impEtatPrestationAction() {
            $interval1 = null;
            $interval2 = null;
     
            if ($this->_request->isPost()) {
     
                $formData = $this->_request->getParams();  
     
                if ($formData['date'] == '' ||$formData['date2'] == '') {
                    $this->_flashMessenger->addMessage('Vous n\avez notez correctement une date');
                    ($formData['date']=='')?$interval1 = null:$interval1 = $formData['date'];
                    ($formData['date2']=='')?$interval2 = null:$interval2 = $formData['date2'];
                }            
     
            }
     
            $this->view->assign(array(
            'interval1'=>$interval1,
            'interval2'=>$interval2));
     
        }

    et dans ma vue, j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo $this->dateFormat($this->interval1,'0');
    echo $this->dateFormat($this->interval2,'360')

  8. #8
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Tu vas sans doute trouver que je pinaille, mais j'aurais retiré le calcul de date de ton viewHelper et je l'aurais placé dans une méthode publique d'une classe modèle, ou à defaut dans une méthode privée du contrôleur.

    En principe, un viewHelper n'est pas un bon endroit pour placer une règle métier (ici, le calcul d'une nouvelle date). Et d'ailleurs, le nom du ViewHelper (dateFormat) ne rend pas compte de ce calcul, ce qui est un indicateur infaillible du fait que son rôle est bancal.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  9. #9
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Pinaille, pinaille mon ami, ça fais réfléchir.

    Alors plutôt que de me disperser, autant créer une classe qui gère cette date, avec l'avantage que je pourrais l'agrémenter plus-tard, et même la réutilisée.

    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
     
    <?php
    class My_Gestion_Date {
     
        private static $_jours;
     
        private static function dateJours($date = null) {
     
            self::$_jours = new Zend_Date($date,Zend_Date::HOUR);
        }
     
        public static function dateFormat($date = null) {
     
            //creation de la date
            self::dateJours($date);
            return self::$_jours->toString('dd-MM-yyyy');
     
        }
     
        public static function ajoutJoursDate($date = null,$heures = '0' ) {
            self::dateJours($date);
            self::$_jours->add($heures,Zend_Date::ISO_8601);
            return self::$_jours->toString('dd-MM-yyyy');
        }
     
    }
    ?>

  10. #10
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Alors plutôt que de me disperser, autant créer une classe qui gère cette date, avec l'avantage que je pourrais l'agrémenter plus-tard, et même la réutilisée.
    Ce que tu appelles dispersion est en fait une des forces du développement objet : en créant des classes génériques utilisables dans une multitude de contexte, on favorise leur réutilisation et la clarté du code.

    Le défaut de ta solution, c'est que ta classe a une faible cohérence : elle fait beaucoup de choses à la fois ayant peu de rapports entre elles, et s'apparente plus à une librairie de fonctions disparates rassemblées dans une classe qu'à une véritable classe ayant une sémantique définie et remplissant un rôle précis. Tu pourras effectivement réutiliser la méthode de formatage de cette classe dans une autre application, mais son code comprendra également les autres méthodes de calcul de dates qui n'auront plus de signification et d'utilité dans ce nouveau contexte. Une des conséquences possibles est que cela compliquerait inutilement la tâche d'un autre développeur qui serait chargé de l'audit ou de la maintenance de ton code ; si tu ne commentes pas tout cela, il pourrait se demander quelle est la raison d'être de ces méthodes, et ce qu'il doit en faire.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Ben du coup je suis un peu perdu.

    donc je dois afficher deux dates, celle du jours et celle du jours + 15 .

    alors, si je suis ton raisonnement.

    Je fais un Helper, pour la date du jours.

    Je crée un model pour la dateJours + 15, que j'appelle dans un contrôleur?

    Peux-tu me montrer un exemple ?

    Merci.

  12. #12
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    En fait, je simplifierais ton ViewHelper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    class My_View_Helper_DateFormat {
     
        public function dateFormat(Zend_Date $date) {
            return $date->toString('dd-MM-yyyy');
        }
     
    }
    ?>
    Et je déporterais le calcul de date dans une méthode privée du contrôleur :
    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
    const ECHEANCE_15_JOURS = '360';
    ...
    public function myAction()
    {
      ...
      $interval1 = new Zend_Date($formData['date'], Zend_Date::ISO_8601);
      $interval2 = new Zend_Date($formData['date'], Zend_Date::ISO_8601);
      $interval2 = $this->calculeDateEcheance($interval2, self::ECHEANCE_15_JOURS);
      $this->view->interval1 = $interval1;
      $this->view->interval2 = $interval2;
    }
     
    private function calculeDateEcheance(Zend_Date $date, $echeance)
    {
      return $date->add($echeance, Zend_Date::HOUR);
    }
    Et dans ta vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $this->dateFormat($this->interval1);
    echo $this->dateFormat($this->interval2);
    Bilan, ton viewHelper fait bien ce que son nom indique : il formate les dates, ni plus ni moins, et sera réutilisable sans problème ailleurs. D'autre part, la règle de calcul apparaît explicitement dans le contrôleur aux yeux des lecteurs de ton code.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  13. #13
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    En fait j'y étais presque........

    Merci pour la leçon.

    une dernière question , comme tu nommes ta classe helper My , tu l'a met aussi dans le répertoire Helpers ?

  14. #14
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Le préfixe Zend est resérvé aux classes du framework. Si tu crées des classes personnalisées, il faut leur trouver un autre préfixe ; personnellement j'ai choisi le nom de mon entreprise. Ensuite, il suffit de spécifier au framework quels sont les répertoires contenant les classes ayant un préfixe particulier, avec les méthodes setHelperPath() et addHelperPath() de Zend_View (c'est expliqué dans le chapitre 42.4 de la doc).
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  15. #15
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    oki, merci

    Edit : petite rectification dans le code proposé.

    Ne pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $interval2 = $this->calculeDateEcheance($interval2, self::ECHEANCE_15_JOURS);
    mais bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->calculeDateEcheance($interval2, self::ECHEANCE_15_JOURS);
    dans le premiers cas, la variable $interval2, perd sa consistance objet, pour devenir une simple variable string, et ne passera donc pas le Helper DateFormat().

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Par défaut
    Bonjour,

    J'ai lu avec beaucoup d'attention ce post et il est assez intéressant au niveau pour la mise en place des bonnes pratiques.

    Je me pose juste une question au niveau de l'utilité de l'helper pour le formatage de la date.

    Zend Framework a une classe qui gère parfaitement les formats quelqu'il soit.
    Où se trouve l'interêt de créer un helper pour faire appel à une seule methode de formatage qui pourrait être appelée directement dans la vue ?

    Puisqu'en MVC le rôle de la vue est bien le formatage, donc pourquoi pas faire appel directement à la méthode de Zend_Date dans la vue...

    Le seul avantage que j'y vois, c'est de n'avoir qu'un seul point de contrôle pour l'ensemble des formats des dates sur toute l'application.
    Mais en même temps, cela ne vaut que pour la partie présentation et ne gère pas le format d'encodage des dates au niveau du model qui lui aussi pourrait changer.
    De plus dans un site multi-lingue il est fort probable d'avoir plusieurs format de date pour la même date en fonction de l'origine de l'utilisateur (EU, US, ...).
    Dans ce cas le helper devrait prendre un paramètre, ce qui nous ramène quasiement à la même utilisation que la méthode toString() du Zend_Date ...

    Donc mis à part ce point, y a-t-il une raison plus "philosophie MVC" derrière ce helper ?

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Par défaut
    En poussant un peut plus loin la réflexion, je me dis que ce format de date n'est autre qu'une variable de configuration et devrait donc se retrouver dans dans Zend_Config...

    un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    date.format.eu = 'd/MM/YYYY'
    date.format.us = 'm/dd/yyyy'
    ...
    Ceci évitant de recréer la roue tout en gardant un point d'accès unique, simple et logique au type format.

    Le formatage même de la date se ferait directement dans la view (ce qui est son métier) grâce à la méthode toString() de Zend_Date.

    Dites moi ce que vous en pensez

    PS: Comme on était dans le pinaillage, je me suis permis de continuer

  18. #18
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par oliviercuyp Voir le message
    Donc mis à part ce point, y a-t-il une raison plus "philosophie MVC" derrière ce helper ?
    Ce n'est pas intrinséquement lié à MVC, ça permet de découpler au maximum les vues de l'implémentation de MVC employée (ici Zend Framework).

    Si tu fais appel explicitement dans tes vues à des méthodes du framework Zend autres que celles liées aux vues, tu seras obligé de modifier profondément en cas de migration vers un autre framework MVC, ou même une autre version de ZF qui comporterait des incompatibilités d'interface avec celle précédemment employée. Tandis qu'en employant des helpers, tu « découples » les vues du framework, et facilites ainsi leur réutilisation dans un autre contexte ; idéalement il n'y aurait que les helpers à modifier en cas de migration, ce qui est bien moins coûteux que de modifier les vues elle-mêmes.

    Personnellement, j'ai poussé la logique que je viens d'exposer jusqu'au bout en utilisant Smarty pour implémenter les vues dans les applications que je développe avec ZF ; si demain je migre de ce framework à un autre, je le fais sans toucher à aucune de mes vues, et même pas aux plugin Smarty écrits pour elles et qui sont l'équivalent des View Helpers de ZF. Le découplage et donc la possibilité de réutilisation sont ainsi totals.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  19. #19
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 65
    Par défaut
    Je fais remonter ce topic pour savoir si quelqu'un connaît finalement une solution pour spécifier un format de date précis pour différentes locales.

    Actuellement on peut

    - Spécifier un format précis pour une date (le format vaudra alors pour toutes les locales)
    - Passer en paramètre une locale à Zend Date et une constante qui fait la liaison avec des formats prédéfinis dans Zend_Framework

    Problème aucun de ces formats ne correspond exactement au format que je souhaiterais utiliser.

    Any help ?

    (j'utilise la version 1.11 de Zend Framework)

  20. #20
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    tu voudrais avoir quelle format ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2007] concatener des nombres dans un format précis
    Par projekx dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/07/2011, 17h41
  2. Réponses: 11
    Dernier message: 01/08/2006, 05h15
  3. Comparaison de 2 dates dans des formats différents
    Par frdek dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/02/2005, 15h05
  4. Selection des x premiers caractères dans un champ précis
    Par Schulman dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/01/2005, 09h23
  5. [C#] Lecture dans un endroit précis d'un fichier ...
    Par maitrebn dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/10/2004, 13h36

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