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à. 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 :
/**
* 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.
/**
* 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 :
<?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