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

Langage PHP Discussion :

[POO] Séparer le contenu HTML dans le cas de modules


Sujet :

Langage PHP

  1. #1
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 912
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 912
    Points : 14 865
    Points
    14 865
    Par défaut [POO] Séparer le contenu HTML dans le cas de modules
    Bonjour,

    J'essaie de limiter au maximum (voire supprimer totalement) l'utilisation de HTML dans mes classes.

    Cependant, j'aimerais avoir vos conseils dans le cas de gestion de modules tels qui suivent :

    Admettons deux "zones" qui ont un code HTML en commun mais qui peuvent avoir des modules différents :

    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
    class Mere
    {
     
    protected $module1;
    protected $module2;
     
    public function getModule1()
    {
       ob_start();
     
       if ( isset( $this->module1 ) && $this->module1 == true )
       {
          ?>
          <p>Module 1</p>
          <?php
       }
     
       return ob_get_clean();
    }
     
    public function getModule2()
    {
       ob_start();
     
       if ( isset( $this->module2 ) && $this->module2 == true )
       {
          ?>
          <p>Module 2</p>
          <?php
       }
     
       return ob_get_clean();
    }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Zone1 extends Mere
    {
    protected $module1 = true;
    protected $module2 = true;
    }
     
    class Zone2 extends Mere
    {
    protected $module1 = true;
    protected $module2 = false;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $mod = new Zone2; // $mod = new Zone1; en fonction de la zone
     
    include( 'fichier/commun/aux/zones.php' );
    Ce fichier commun :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $mod->getModule1();
    echo $mod->getModule2();
    Donc si vous m'avez suivi jusque là (pas dit que mes explications soient claires), où mettriez-vous le code HTML contenu dans la classe Mere ?

    Merci !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Salut,

    Pour le moment nulle part. Sa manque de quelque chose à mon goût.
    Tu pourrais avoir une classe de <gabarit de code> HTML.
    Un module pour s'afficher nécessiterais de connaître ces informations, et de recevoir un gabarit de code.
    Ensuite il faut opérer une fusion entre ton gabarit et les données du module.

    le code HTML reste dans le gabarit. Qui par ailleurs pourrait pointer sur un fichier inclus avec le HTML, et non du HTML écrit dans la classe.

    La data du module reste dans le module.

    Entre les deux il te faudra un agent de fusion. Ou alors tu le mets dans le gabarits, sa dépendra de la complexité que tu veux y donner.

    a plus

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Salut,

    En ce qui me concerne j'applique souvent la solution proposée par Kaymac : j'ai une classe gabarit à laquelle je confie la création de div masquable ou autres elements HTML comme mes listes déroulantes.

    Mais j'utilise aussi des systèmes de Templates personnalisés.

    Dans ce cas 2 solutions : soit j'accepte d'avoir un peu de php dans mes templates (pour des boucles en particulier) soit je passe par un outil de template (phplib, smarty) pour des solutions selon moi un peu plus lourdes mais sans doute plus conforme aux standards en vigueur.

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 912
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 912
    Points : 14 865
    Points
    14 865
    Par défaut
    Donc si j'ai bien compris, il faudrait faire une classe qui au final contiendrait du HTML mais ne servirait qu'à ça. Et j'imagine que dans cettedite classe, la plupart (voire toutes) des méthodes seront statiques ?

    Genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Mere
    {
     
    protected $module1;
     
    public function getModule1()
    {
       if ( isset( $this->module1 ) && $this->module1 == true )
       {
          return HTML::module1();
       }
    }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class HTML
    {
     
    public static function module1()
    {
       ob_start();
       ?>
       <p>Module 1</p>
       <?php
       return ob_get_clean();
    }
     
    }
    Ou mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static function module1()
    {
       ob_start();
       include( 'chemin/vers/module1.php' );
       return ob_get_clean();
    }


    (A savoir qu'étant donné que l'exemple est simplifié, le code HTML du module 1 et du module 2 est totalement différent, donc ne changer que le contenu dynamiquement n'est pas le but recherché (même s'il va y avoir ce genre de fonction au final pour certains des modules))

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Quand je regarde ma classe gabarit (au méthodes static effectivement) je reconnais qu'elle ne correspond pas du tout à l'idée que j'ai d'une classe.

    Il s'agit souvent plus d'une façon d'afficher du HTML qui m'évite d'avoir ledit HTML éparpillé dans d'autres classes

    La vrai solution pour une séparation claire et nette des langages est je crois une séparation stricte des couches par l'utilisation d'un moteur de Templates.

    Le problème étant qu'il faut définir le projet comme tel depuis le départ.

    c'est pourquoi je me contente de cette solution un peu batarde mais qui me permet d'y voir plus clair dans mes pages et mes classes.

    tous les javascripts dans un dossier, les gabarits dans une classe PHP, les PHP dans un dossier de fonctionnement principal et pratiquement aucun HTML

    voici par exemple un gabarit paramétrable que j'appelle lorsque j'ai besoin d'une Div qui se masque ou se démasque.

    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
     
     
    //////////////////   Afficher une DIV masquable   ///////////////////////////////
     
    public static function divRoulIn($i,$param1,$param2,$separ,$mask,$fonction="",$bouton="",$check=""){
    //$width2=($bouton!="") ? "70%" : "95%";
    //$width2=(($bouton!="")&&($bouton2!=""))? "55%" : "95%";
     
    if(($bouton!="")&&($check=="")) $width2="70%";
    elseif($check!=""){
    $width2="60%";
    $width3="10%";
    }else $width2="95%";
     
    $img=($mask==1) ? "/".$this->path."images/deroule.png" : "/".$this->path."images/roule.png";
    $affich=($mask==1) ? "none" : "block";
     
    echo '<table align="center" width="800" border="1" cellpadding="0" cellspacing="0">
    <tr bgcolor="#BBBBBB"><td width="5%" align="center" onclick="masque(\'maskdetail'.$i.'\',\'flech'.$i.'\',\'test'.$i.'\')';
    if($fonction!="") echo ';'.$fonction;
    echo'"><input id="test'.$i.'" type="hidden" value="'.$mask.'" /><img id="flech'.$i.'" src="'.$img.'" /></td>
    <td width="'.$width2.'" style="padding:7px;font-weight:bold;padding-left:20px">'.$param1.$separ.$param2.'</td>';
    if($bouton!="") echo '<td align="center">'.$bouton.'</td>';
    if($check!="") echo '<td align="center" width="'.$width3.'">'.$check.'</td>';
    echo '</tr></table><div id="maskdetail'.$i.'" style="display:'.$affich.'">';
    }
    Comme tu peux le constater à mon niveau c'est un peu de la bibouille

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    Euh moi j'ai totalement banni l'HTML de mes classes ou page php, par contre j'ai un dir contenant tout mes templates (1 page générique, n templates par module de mon appli que j'ajoute à la page générique)

    Mes controleurs gérant la construction et l'affichage

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    Jette un oeil a Flexy

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    J'aimerai bien être aussi bien organisé

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Moi je voaysi plutot une classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    gabarit{
    function lireTemplate();
    function applyValues($arrValues );
    }
     
    module{
    fucntion getValues
    function getHTML( gabarit );
    }
    La classe gabarit, load le template avec un file_get_contents par exemple. Et remplace les tags (si tu ne veux pas de php dedans) par les valeurs de $tableaux.

    module à une fonction getValues, qui renvoies un tableaux avec pour index les noms de valeurs et valeur, la valeur.
    getHTML prend le gabarit et renvoie $gabarit->applyValues( $this->getValues() ) );

    Dans les grands lignes avec un système simple.

    Voilà, n'hésites pas si ce n'est pas plus clair qu'avant.

    salut.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    En partant du principe qu'un bon informaticien est un informaticien fainéant qui ne réinvente pas la machine à café tout les 3 mois, je te conseille vivement de comparait les moteurs de templates et de t'y penchais car ca vaut vraiment le coup !

    Ya 3 mois je connaissais pas du tout flexy et je peux te promettre que j'ai finis un projet qui tabasse au niveau perf et niveau maintenance, ils vont se régaler !

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Citation Envoyé par lespoches Voir le message
    En partant du principe qu'un bon informaticien est un informaticien fainéant qui ne réinvente pas la machine à café tout les 3 mois, je te conseille vivement de comparait les moteurs de templates et de t'y penchais car ca vaut vraiment le coup !

    Ya 3 mois je connaissais pas du tout flexy et je peux te promettre que j'ai finis un projet qui tabasse au niveau perf et niveau maintenance, ils vont se régaler !
    Tu parles du package pear ? http://pear.php.net/package/HTML_Template_Flexy ?

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    Oui exactement kaymak

  13. #13
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 912
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 912
    Points : 14 865
    Points
    14 865
    Par défaut
    Merci à tous !

    Pour mes développements perso je pense tenter de voir pour un système de templates.

    En revanche, n'étant pas seul sur ce projet et l'autre personne étant assez réfractaire à la POO, je vais rester dans un système de gestion assez simple, même si cela implique une séparation moins totale. De plus, il s'agissait d'une amélioration mineure du projet et il m'est impossible de refondre le tout pour utiliser un système complet comme Smarty.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [javascript]Contenu HTML dans un fichier xml
    Par s.n.a.f.u dans le forum APIs
    Réponses: 4
    Dernier message: 15/11/2007, 14h46
  2. [javascript]Contenu HTML dans un fichier xml
    Par s.n.a.f.u dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 15/11/2007, 14h46
  3. Appel d'un contenu HTML dans flash
    Par smh_master dans le forum Flash
    Réponses: 9
    Dernier message: 01/12/2006, 17h14
  4. [XSLT] Afficher du contenu HTML dans une feuille XSL
    Par krapno dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/10/2006, 15h07
  5. [POO] Modèle objet: this inutilisable dans certains cas?
    Par vlord dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 13/08/2005, 11h41

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