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 :

Interprétation de contenu PHP dans une vue HTML


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Interprétation de contenu PHP dans une vue HTML
    Bien le bonjour,

    Actuellement en mission chez un client sur la refonte d'un vieux système en PHP, je dois séparer le rendu HTML des traitements logiques.
    L'architecture existante n'est pas au top donc je dois m'adapter au mieux à ce qui existe sans casser tout ce qui fonctionne déjà (comprendre faire une migration pas à pas). L'architecture tourne sur un pseudo modèle MVC un peu bancale ou le controler fait le rendu sans réellement passer par une vue.

    Mon premier rôle est de transformer ce système en système avec des vues pour bien séparer le code (le client ne veut pas utiliser de moteur template pour ne pas avoir "une trop grosse migration à la fois" ce qui m'aurait bien simplifié le boulot je reconnais).

    Le soucis vient du fait que certains fonctions existantes utilisent print pour un rendu direct à l'écran et certaines se contentent de retourner du code HTML qui sera utilisé plus tard par d'autres briques de l'application. Je dois donc créer 2 méthodes de rendu des vues, une pour afficher directement le rendu et une pour interpréter le code PHP contenue dans la vue pour retourner le contenu au format HTML.

    Pour le premier point aucun soucis j'ai une méthode render qui fait très bien le boulot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
         * Affiche ou retourne la vue spécifiée au format html
         * 
         * @param string $template identifiant du template
         * @param array $params
         */
        public static function render(string $template, array $params = [])
        {
            extract($params);
            $filePath = 'view/'.$template . '.html.php';
            include $filePath;
        }
    Le soucis se pose pour la seconde version. J'ai dans mes vues du code HTML et du code PHP (variable, conditions, structure de contrôle). J'étais parti dans un second temps pour faire du remplacement de variable avant de récupérer le contenu du fichier vue mais cela ne fonctionne pas (les structures de contrôles ne sont pas interprétés). Dans un second temps j'ai voulu m'orienter vers de la tamporisation de sortie avec les fonctions ob_start() et ob_get_content() avant de me rendre compte que ces fonctions étaient utilisés un peu partout dans l'application existante et appelés de manière un peu aléatoire. j'ai donc peur d'avoir quelques effets de bords non anticipés en les utilisant pour appeler la vue. La version actuelle de ma fonction pour récupérer le code HTML est la suivante mais elle ne me satisfait pas pleinement.
    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
    /**
         * Retourne le contenu html de la vue sans l'afficher
         * 
         * @param string $template
         * @param array $params
         * @return string
         */
        public function getHtmlContent(string $template, array $params = [])
        {
            extract($params);
            $filePath = 'view/'.$template . '.html.php';
     
            $current = ob_get_clean();
            ob_start();
            include $filePath;
            $include = ob_get_clean();
            ob_start();
            echo $current;
            return $include;
        }
    Si quelqu'un connait une meilleure façon de faire ou un moyen d'améliorer ce dernier code ce serait top. Je précise que je ne peux pas réellement modifier les vues ou le controleur car l'appli est énorme et revoir l'ensemble serait générateur de pleins de bugs et de régressions impossible à tester réellement. Je suis donc obligé de déporter du code PHP avec quelques boucles et conditions directement dans la vue.

    Un exemple de vue si ça peut aider (c'est pas fou mais c'est le mieux qu'on peut faire sans réecrire entièrement l'appli) :
    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
    <?php
     
    print '
    <fieldset>
        <legend>' . $strLibelleFieldSet . '</legend>
        <table class="demande-conges">';
     
                if (count($aCategorieAbsencesOrganismeListe) > 1) {
                    print '
                        <tr>
                          <td>Regroupement d\'absence :</td>
                          <td>
                            <table cellspacing="0" cellpadding="0">
                              <tr>
                                <td colspan="2">
                                      <select name="categorie_absence" onchange="document.all.code_absence.value=\'\';SubmitForm(\'est_soumis\', null, \'\');">
                                        <option value="">< === Choix === ></option>
                                        ' . $strOptionsCategorieAbsence . '
                                      </select>
                                </td>
                              </tr>
                            </table>
                          </td>
                        </tr>';
                }
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Tiens regarde mon moteur de rendu en une seule classe : PhpEcho.
    Il n'y a rien à apprendre et tu bénéficies de tout ce dont tu cherches à faire.

    Par contre, j'éviterai au maximum les extract() disséminés un peut partout. Même en faisant 'achement gaffe, un jour ou l'autre tu vas récupérer des problèmes.
    D'ailleurs il y a des hébergeurs qui l'interdisent tout simplement.
    Et puis print n'est vraiment pas adapté pour gérer l'affichage au même niveau que echo. Tu ne dois pas l'utiliser, c'est plus destiné dans des cas précis où une valeur de retour est attendue, sinon pour l'affichage brut, c'est tout simplement à proscrire.

    Ta vue en code compatible PhpEcho :
    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
    <fieldset>
        <legend><?= $this('libelleFieldSet') ?></legend>
        <table class="demande-conges">
            <?php if (count($this['aCategorieAbsencesOrganismeListe']) > 1) { ?>        
            <tr>
                <td>Regroupement d'absence :</td>
                <td>
                    <table cellspacing="0" cellpadding="0">
                        <tr>
                            <td colspan="2">
                                <select name="categorie_absence" onchange="document.all.code_absence.value=\"SubmitForm('est_soumis', null, '');\"">
                                    <option value="">< === Choix === ></option>
                                    <?= $this['strOptionsCategorieAbsence'] ?>
                                </select>
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
            <?php } ?>

Discussions similaires

  1. Problème d'intégration de php dans une page html
    Par piwyangel dans le forum Langage
    Réponses: 4
    Dernier message: 16/09/2011, 14h31
  2. Iclur page php dans une page Html
    Par Georges974 dans le forum Langage
    Réponses: 10
    Dernier message: 24/07/2011, 05h39
  3. [phpBB] Insérer du code php dans une page html
    Par hash95 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 26/02/2009, 15h11
  4. Intégrer du PHP dans une page html
    Par toufik1986 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 24/01/2008, 17h55
  5. [HTML] Inclure un code php dans une page html
    Par sanddddy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 31/07/2007, 17h44

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