Mélanger, c'est mal

Bon la je suis en phase de finalisation de mon framework PHP. Le seul problème qui subsiste c’est le rendu HTML. J’ai horreur de mixer PHP et HTML, pour des raisons évidentes de lisibilité du code.

J’ai regardé du coté des systèmes de templates préfaits en PHP. Lourd. Très lourd je trouve. Et en fait ca n’utilise pas les fonctions “objets” PHP5, alors que tout le reste de mon framework est codé en objet.

  • J’ai lorgné du coté de SimpleXML (pour pondre du beauuu XHTML). Mais je me suis dit, si je fais tout en code à partir du PHP, ca va pas être facilement maintenable.
  • J’ai pensé a des blocs d’HTML. Problème: on se retrouve vite avec plein de petits blocs, et la jointure des blocs est toujours faite dans le PHP, sans explication pour un quelconque graphiste.
  • J’ai pensé à une architecture “objet” en forme de spécialisation: genre cDocument (qui genère les balises HTML HEAD, etc…) ensuite une spécialisation qui génère une autre partie du document (genre un bloc menu). C’est relativement élégant, mais encore une fois, pour le graphiste/designer (je cherche absolument à séparer le code PHP du reste) pour changer un truc, il n’aura plus que le CSS vu que l’HTML est foutu à l’intérieur du PHP…

bon bref, comment faites vous?

Je ne suis pas sûr de comprend ton problème, mais moi je conseillerai l’utilisation de Xsl + Xml avec un bon parser au milieu.
Si tu ne changes pas tes formats xml, tu as juste à changer tes xsl pour avoir un rendu différent.

Ensuite je ne sais pas comment PHP gère ça, moi j’utilisais ça en ASP (tout court).

Mon problème:

Imagine que tu dois bosser avec un designer web qui connaisse pas le PHP ni Javascript, mais qui torche en CSS, et HTML. Je m’occupes du coding, il s’occupe du design.

Comment faire pour faire cohabiter le code aux 2, sans que le designer ai à intervenir dans le code PHP, et sans que le codeur PHP ai a pondre une ligne de HTML?

edit: Le XML/XSL peut être bien, mais je trouves que c’est une technologie qui est encore très lourde à l’emploi…

Eeeuuuuuhhhh, je dis peut être une bêtise parce que j’ai mal compris, mais un bête include dans les pages html, ça irait pas ? En tous cas, je bossais comme ça moi, je faisais le code php dans des fichiers que je rattachais par la suite aux pages oueb par cette fonction.
Ou alors non ?

Dans ce cas, tu as quand meme des éléments de PHP dans ton HTML… rien que pour présenter une table… ou alors tu fais la présentation de la table dans le PHP. Mais c’est mal aussi.

euh… bin tu fais les templates toi même ou tu travailes a/ des fonctions…

style:

[code] <?php include ("my.lib") ?>

<?php php_the_function ?> [/code]

my.lib contient le code des fonctions qui sortent les données voulues et le codeur HTML n’a qu’à placer la balise php qui print les résultats où il faut.

ou alors gabarit:

[code]

{content}

[/code]

machin.php:

[code]<?php

$data = mon beau code qui crée le contenu;

$output = str_replace("{content}",$data, $content, file_get_content(“machin.html”));

print $output;

?>[/code]

Et si tu as du contenu qui est une suite de résultats différents mais avec la même structure (boucle qui vomit des lignes de tableaux) tu peux aussi imbriquer un gabarit dans un gabarit (le gabarit de la ligne du tableau par exemple).

C’est ça ou j’ai pas bien compris ce que tu cherches?

C’est exactement ca nolan, c’est la technique que j’utilisais auparavant. Mais le problème, c’est qu’on se retrouve tres vite submergés de gabarits dans le cadre de sites à fort contenu.

Pour ma part, j’ai développé une petite classe de moteur de template qui me permet de placer des balises dans mon unique fichier HTML. Pendant l’exécution de mon code, je balance mon contenu dynamique à la classe qui stocke tout le bordel, et tout à la fin, je dis à la classe de parser le template, et pouff, ça traite le tout.

Niveau balises, on peut envoyer du contenu (chaine ou array), faire des if, while… directement au niveau du template HTML. Ca donne des trucs comme ça (c’est tout le html de mon site :stuck_out_tongue: ). Ceci dit, rien empêche de créer plusieurs templates HTML.

:stuck_out_tongue:

C’est pas une critique ni quoi que ce soit hein mais j’ai une question. A partir du moment où ton système gère des conditions et des boucles… quelle différence pour le gars qui ne veut voir que l’html avec le code php ? Ca lui crée juste un paradigme en plus non?

Je comprend pas trop ta question en fait donc je répond dans le tas. :stuck_out_tongue: Tu demandes quel intérêt de séparer la forme et le fond ?

Je viens de jetter un coup d’oeuil dans punBB, et ils gèrent ca (je pense) comme tu le souhaiterais.

C’est un fichier template : (ex avec main.tpl)

[code]




<pun_title>

	</div>
	<div id="menu">
	<ul>
		<li class="home"><a href="http://www.ehia.org/">home</a></li>
		<li class="charte"><a href="http://www.ehia.org/index.php/charte">charte</a></li>
		<li class="panel"><a href="http://panel.ehia.org/">panel</a></li>
		<li class="forum"><a href="http://www.ehia.org/board/">forum</a></li>
	</ul>
	</div>
	<pun_navlinks>
	<pun_status>
</div>
[/code]

Ce fichier est inclus dans la page index.php, et, via la fonction str_replace(), les éléments personnels (genre <pun_status>) sont modifiés.

Voila, je pense que ca peut t’aider :stuck_out_tongue:

Moi j’avais fait super simple : chaque morceau de HTML généré ést rangé dans un tableau de variables, et une fonction remplace le nom de cette variable par cette valeur dans une page html qui ressemblerait à ca par exemple :

<?HEAD?> <?HEADER?> <?MENU> <?CONTENU?> <?FOOTER?>

(et au final, j’avais meme la possibilité de coller du html généré dans du html généré, dans du html généré, dans du… etc.)

(par contre, c’est une solution qui date d’y a des années, y a ptete moyen de faire mieux maintenant).

De toute facon, si tu dois lister des tables ou quoi que ce soit qui necessite une boucle (ou un if), tu seras obligé de passer du code dans ton template…

Alors que ce soit du code perso genre :

{for blablabla...}

Et foutre dans ton moteur de template un str_replace sur ton {for} OU directement mettre du PHP dans le template…

De toute facon tu devras y passer, j’vois pas comment tu peux éviter de placer le moindre bout de code dans le template pour des cas comme celui-la.

Atta je suis un peu malade en ce moment je la refais en m’exprimant mieux avec des exemples:

[code]

(if var_login = true}

données trop secrètes

{else}

roooh t’es pas catalogué…

{endif}

[/code]

[code]<?php if var_login == "true" {?>

données trop secrètes

<?php }else { ?>

roooh t’es pas catalogué…

<?php } ?>[/code]

Si au final tu refiles les mêmes gabarits mais avec un code balisé avec des ‹ { › au lieu des ‹ <? › tu as juste rajouté une couche sur l’interprétation des pages. Me trompe-je?

Haha que c’est drôle.

Le pb avec ta méthode nolan c’est que selon la complexité du site tu peux te retrouver avec des trucs horribles, genre :

[code]<?php

while ($var = $db->get_val() ) {
?>

<?php if ($var['type'] == 'news') { ?>
<?php echo ($html_news); ?> <?php if ($var['extrainfo']) { ?>
extra info :<?php echo ($extra) ?>
<?php } } else { ?>
<?php echo ($html_comment); ?> <?php ...

?>
}
…[/code]

Exemple à la con, bien sûr, mais c’est parfaitement illisible. Rajoute quelques boucles for au milieu, avec des if dans les for et c’est bon, tu peux te tirer une balle.

Nan, sérieux, faut pas programmer comme ça.

Remarque au passage : utiliser des str_replace pour remplacer des balises dans un fichier template est mauvais. Non seulement ça pourra jamais gérer les balises imbriquées, mais en plus, c’est lent, vu qu’il va parcourir le fichier complet à chaque str_replace.

Oui, là on est d’accord si c’est pour une question de lisibilité graphique; même si je ne pense pas que le code qui génère les données soit séparé de celui qui génére l’HTML de mise en page. J’utilise toujours la deuxième méthode (gabarit HTML avec placeholders parsés).

Comment est-ce qu’on pourrait faire sans utiliser un str_replace? Eval bouffe vraiment trop de ressources lui. Peut-être un output avec ob_content?

On peut gérer les balises imbriquées et les boucles avec str_replace et je n’ouvre le fichier qu’une seule fois (je le mets dans ma string) et c’est sur cette string que je travaille côté php. Si je dois imbriquer un autre contenu (genre un tableau contenant plusieurs lignes) je parse le template html, je remplace ma variable $contenu par une boucle qui produit les lignes du tableau (en ayant lu préalablement le gabarit de chaque ligne du tableau et l’ayant stocké dans une variable $ligne); j’ai donc deux gabarits: page.html contenant {content} et ligne.php/txt/whatever content une tr (ou autre hein c’est pour l’exemple) avec des

{data} dedans qui est stocké dans une variable avant la boucle produisant plusieurs lignes.

Qu’est-ce qui serait plus rapide qu’un str_replace là-dessus?

(et sinon pour [PERE]Cil y a une solution ?) (non parce qu’on vire HS là)

J’abonde également dans ce sens. Tu es obligé de passer par un langage de template, qui ne sera pas plus compréhensible par le graphiste que du PHP, donc autant que ce soit du PHP.

Personellement je fais toujours des scripts PHP qui calculent toutes mes variables à l’avance, et je me contente d’appeler à la toute fin mon « template » qui ne va contenir que des <?php echo $telle_variable ?> ou des trucs du genre, avec bien sûr, quelques if() et des for() pour les condition et les tableaux. Ca fait au final du code assez lisible et assez propre je trouve, et je suis assez exigeant de ce côté là aussi.

exemple:

[code]

<?php if(!empty($posts)){ ?> <?php foreach($posts as post){ ?>
	<h2><?php echo $post->title ?></h2>
	<?php echo $post->content ?>
<?php } ?> <?php } ?>
</div>

// aux erreurs de code près[/code]

J’indente différemment les balises HTML et le contenu des balises PHP, je trouve ça plus clair. De même, je ferme mes balises PHP à chaque fin de ligne. Ce sont là mes deux choix clairement discutables :stuck_out_tongue:

Puisqu’on en est a parler de differents modeles de separation fond/forme, controlleur/view, code/html, whatever vous voulez l’appeller, je conseille a tous les monde de jetter un coup d’oeil a la maniere dont c’est fait en asp.net 2.0 et codebehind. Y a VS2005 Web Developper Express de gratos par ici. Le modele est tres different mais c’est justement pour ca qu’il est interessant et qu’il faut l’aborder sans vouloir forcement appliquer ses methodes “phpesques”. Moi je trouve que c’est assez imbatable, et meme si c’est pas du tout votre truc y a aussi plein de bonnes idees transposable en PHP dans la maniere de faire les choses et d’architecturer ses modules.

P.S: Ha ouai sinon, au passage, DIE XSL DIE. Voila c’etait un P.S. a caractere haineux.

N’ayant pas de machine windows, je ne peux pas regarder comment codebehind fonctionne.
J’ai cherché de la ressource sur le net mais sans grand succès.
Tu peux me donner des détails ?

J’abonde ( plein ) :stuck_out_tongue:

Je suis en train d’en faire en ce moment … HTML / XSL / XML / PL/SQL … c’est la putain de mort, je DÉTESTE ce truc. Je préfère PHP 1000 fois. Lourd, illisible, chiant, bref … je vois vraiment pas les avantages.

( désolé pour le HS, moi je faisais tout mon HTML / PHP / JavaScript / CSS, donc je mélangeais allégrement tout ça tout en sachant ce que faisait chaque truc, donc pas tellement de soluces dans ce cas ).