Séparer le code PHP du HTML : besoin d'avis / conseils

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Séparer le code PHP du HTML : besoin d'avis / conseils

par AB » 20 mai 2008, 18:31

Mais ça reviens au même que d'avoir une boucle et une concaténation... mais c'ets peut être plus propre et plus rapide qu'un while ?
A priori oui cela devrait être plus rapide mais aussi plus facile à gérer

par Quoi » 20 mai 2008, 11:50

Mais ça reviens au même que d'avoir une boucle et une concaténation... mais c'ets peut être plus propre et plus rapide qu'un while ?

par FredoMkb » 20 mai 2008, 02:09

Re...

Pour revenir à ton problème Supercanard, tu peux adopter une solution intermédiaire de ce type :

Dans ton template, au lieu d'avoir :

Code : Tout sélectionner

<ul> <li>%%NOM%%</li> </ul>
Tu aurais plutôt :

Code : Tout sélectionner

<ul> %%NOM%% </ul>
Puis, dans ton code Php, tu pourrais faire un truc du genre :
// Tableau des éléments à remplacer 
$recherche[] = '%%NOM%%'; 
// Eléments de remplacement 
$remplacement[] = '<li>'.implode('</li><li>', $nom).'</li>'."\n"; 
// Remplacement 
$html = str_replace( $recherche, $remplacement, $html ); 
De cette manière tu construits l'ensemble de la liste (idem pour les tableaux, même si c'est parfois un peu plus compliqué)...

Bien-sûr, dans une approche de séparation la plus poussée possible entre le code Php et le Hmtl, cette technique ne s'avère pas idéale, puisqu'on commence déjà à mettre des balises Html dans le Php, mais, ne soyons pas trop puristes non plus, on insère quelques balises Html et uniquement juste avant de les remplacer dans le template... ce n'est pas si embêtant que ça à mon avis, d'autant qu'on peut considérer la fonction qui se charge du rechercher/remplacer comme faisant partie intégrante du système de templates... non ? :shock: ;)


à+ :)

par FredoMkb » 20 mai 2008, 00:30

Bonsoir :)
Imaginons que le but est de récupérer une liste de nom, et de l'afficher sous forme de liste. Et surtout qu'aucune balise <li></li> n'apparaisse donc dans le tableau stockant ces noms ( $nom[] )
[...]
Dans ma template j'ai ceci et le hic c'est que je ne connais pas à l'avance le nombre de noms... :
[...]
La je suis bien bloqué :D
Et oui... ça devait arriver :D ... c'est pourquoi lors de ma première intervention je notais :
Bon, cette technique ne fait pas totalement l'économie du Html dans le Php, certaines choses sont plus simples à réaliser sans passer par des modèles, comme les listes ou tableaux, mais on peut déjà imaginer des modèles pour le gros du code Html, et le reste est fait dans le Php...
On peut aussi ajouter les "select" et leurs "options" dans les formulaires... bref, tout ce qui fonctionne sous forme de liste ou tableau de données, est assez difficile à "modéliser" ou "templater", car, fatalement, on doit insérer des balises entre les items, dont on ne connaît pas forcément le nombre au départ, et que ceci serait bien trop laborieux à faire avec notre première approche des templates...

C'est aussi la raison pour laquelle les gros système de templates ont imaginé des solutions en intégrant des balises qui déclenchent des boucles pour pouvoir construire ces contenus Html dynamiques difficilement réalisables autrement...

Moralité, soit le projet est important et mérite qu'on prenne une solution de templates pro, Smarty étant un des plus populaires et aboutis, mais il y en a d'autres, soit on bricole une solution fait maison mais alors on doit se résoudre à faire quelques concessions pour que ça ne devienne pas rapidement une véritable usine à gaz... :shock:

C'est toujours une question de choix... et les critères peuvent être si nombreux et variés, qu'il faudra adapter son choix en conséquence... pas toujours évident... je sais ;)

à+ :)

par Patriboom » 20 mai 2008, 00:24

Simple remarque comme ça, l'utilisation de % comme marqueur de balise peut facilement porter à confusion avec du code MySQL, puisque % est le jocker MySQL. La proposition qui est faite en début de discussion me semble plus pratique ( <!-- ) car c'est un marqueur de remarque en HTML ce qui fait en sorte que si tu loupes ton code d'interprétation, ta balise reste cachée (en remarque) dans le HTML, reste présente, reste inerte, reste repérable et tout cela sans entrer en conflit avec un autre langage fort utile.

par supercanard » 19 mai 2008, 23:47

J'ai une petite question interessante pour en revenir aux templates. En tous cas elle m'intéresse car si le but et de séparer le code de la mise en forme elle est intéressante ;)

Imaginons que le but est de récupérer une liste de nom, et de l'afficher sous forme de liste. Et surtout qu'aucune balise <li></li> n'apparaisse donc dans le tableau stockant ces noms ( $nom[] )
$ReqPage = "SELECT nom FROM zcms_pages";
$ResPage = mysql_query( $ReqPage );
while ( $ValPage = mysql_fetch_array( $ResPage ) )
{
$nom[] = $ValPage['nom'];
}
### Template
// Ouverture template
$template = 'tpl/pages.htm';
$fichier = fopen( $template, 'r' );
$html = fread( $fichier, filesize( $template ) );
fclose ( $fichier );
// Tableau des éléments à remplacer
$recherche[] = '%%NOM%%';
// Eléments de remplacement
$remplacement[] = $nom[];
// Remplacement
$html = str_replace( $recherche, $remplacement, $html );
// Affichage
echo $html;
Dans ma template j'ai ceci et le hic c'est que je ne connais pas à l'avance le nombre de noms... :

Code : Tout sélectionner

<ul> <li>%%NOM%%</li> </ul>
La je suis bien bloqué :D

par Albat90 » 19 mai 2008, 09:29

Merci pour ce topic très enrichissant.
En effet, il y a beaucoup de façon pour développer une page, et la mienne je l'a trouve un peu Barbare et lorsque que je code des pages énormes, on pourrais croire qu'elle sont crypter :P.

Cependant, je vais essayer de m'orienter vers une de vos technique ;)

Albat90 ;)

par FredoMkb » 19 mai 2008, 00:41

Re...
Bon pour commencer à m'habituer aux templates j'ai suivis la méthode de FredoMkb.
Oui... bon, n'exagérons rien non plus :shock: ... ce n'est pas "ma" méthode, disons que c'est une de celles que j'utilise, mais je ne suis en rien l'inventeur (manquait plus que ça :D )...
... ça me parrait beaucoups mieux :


Oui, je trouve ton code un peu plus clair désormais, et j'imagine c'est la cas pour toi aussi... ça a l'air d'être une piste intéressante dans le cadre de ton projet donc... en avant toutes alors ! ;)

à+ :)

par supercanard » 18 mai 2008, 21:07

Merci à tous pour vos réponses =)

Bon pour commencer à m'habituer aux templates j'ai suivis la méthode de FredoMkb.
Le tout avec une avec un index qui contient le doctype et tout ça, ça me parrait beaucoups mieux :
<?php
#### Initialisation variables
#### Si $page est posté en GET
if ( isset( $_GET['page'] ) )
{
	// Récupération contenu page selectionée
	$IdPage = mysql_real_escape_string( $_GET['page'] );
	$ReqPage = "SELECT nom, description, contenu, mod_news 
	FROM zcms_pages  
	WHERE id_pages = $IdPage AND etat = 1";
	$ResPage = mysql_query( $ReqPage );
	$ValPage = mysql_fetch_array( $ResPage );
}
#### Si $page est pas posté en GET
else
{
	// Récupération page par défaut, par rapport à l'ordre de sa section et à son propre ordre
	$ReqPage = "SELECT nom, description, contenu 
	FROM zcms_pages 
	WHERE etat = 1 
	ORDER by ordre LIMIT 0,1";
	$ResPage = mysql_query( $ReqPage );
	$ValPage = mysql_fetch_array( $ResPage );
}
#### Options affichage page
if ( AFFICHER_TITRE == 1 )
{
	$TitrePage = '<h1>'.$ValPage['nom'].'</h1>';
}
else
{
	$TitrePage = NULL;
}
### Template
// Ouverture template
$template = 'tpl/pages.htm';
$fichier = fopen( $template, 'r' );
$html = fread( $fichier, filesize( $template ) );
fclose ( $fichier );
// Tableau des éléments à remplacer
$recherche[] = '%%TITRE_PAGE%%';
$recherche[] = '%%CONTENU_PAGE%%';
// Eléments de remplacement
$remplacement[] = $TitrePage;
$remplacement[] = $ValPage['contenu'];
// Remplacement
$html = str_replace( $recherche, $remplacement, $html );
// Affichage
echo $html;
?>

par lux » 18 mai 2008, 20:21

Au début, pour mes premiers sites, je codais comme supercanard.

Par la suite, j'ai eu des pages de plus en plus complexes, et je suis passé au templates, smarty en l'occurrence. Depuis je ne peux plus m'en passer :wink:

par AB » 18 mai 2008, 19:58

@supercanard

Sur le principe ça à l'air correct. Quelque soit la méthode que tu emploies, le principal est que tu puisse gérer facilement l'ensemble de ton code. Apparemment ça à l'air d'être le cas dans ce que tu nous montre.
Juste une petite critique concernant la présentation du code. En faisant quelques indentations et sauts de lignes ce serait un plus facile à lire et à comprendre.

par FredoMkb » 18 mai 2008, 15:52

Re...
Y a une autre méthode aussi, c'est la POO, qui permet de séparer la logique de l'affichage...
Je ne suis nullement spécialiste, mais je ne crois pas que la POO (Programmation Orientée Objet), soit en soi une méthode qui permette à elle seule de résoudre les problèmes inhérents à l'intégration Html<->Php, on a déjà tous vu des codes basés sur la POO et qui, pourtant, utilisent amplement du Html dans leur classes et méthodes... bref, ce que je veux dire, c'est que développer en POO n'est pas forcément une garantie d'une architecture d'intégration Html<->Php réussie...

En revanche, puisque j'en ai pas mal entendu parler, il me semble que ce qui se rapproche d'avantage à une séparation claire et "propre" entre logique, données et présentation, est l'architecture MVC (Modèle Vue Contrôleur), où, grosso-modo, le Modèle représente les données à traiter et à exploiter, la Vue est l'affichage ou représentation de ces données, et le Contrôleur est le programme à proprement parler qui gère tout ce petit monde...

Dans le cadre d'un développement sous architecture MVC, que ce soit en POO ou pas (même si la POO semble justement bien indiquée pour ce type de développement), on peut bien séparer tout ce qui est l'affichage Html du code d'exécution en Php (c'est d'ailleurs un peu le but quand-même) et, le plus souvent, le solutions basées sur ce type d'architecture, utilisent des systèmes de gabarits ou templates pour construire les pages Html à publier...

Enfin, tout ceci reste encore au stade de la pure théorie en ce qui me concerne, n'ayant absolument aucune expérience en développement POO ou en architecture MVC, je ne parle donc pas en véritable connaissance de cause, mais suite aux quelques lectures faites ci-et-là sur le net... mais il me semble en tout cas très utile que nous puissions en parler librement, afin de clarifier au mieux ces concepts et éviter ainsi les confusions qui peuvent parfois enduire en erreur...

Bref, en deux mots et suivant mes connaissances actuelles, je dirais, le plus simplement possible, que la POO est une méthode de développement alors que la MVC est une architecture d'application. Les deux pouvant bien-sûr cohabiter, mais pas nécessairement.

Maintenant, pour revenir au sujet principal de cet échange, je suis plutôt d'accord avec Patriboom, le choix du type d'intégration Html<->Php doit répondre à plusieurs critères, dont l'importance et la complexité du projet et le ratio de code de chaque langage, car toutes les solutions, aussi pertinentes soient-elles, ne peuvent répondre à tous les cas de figure (on va rarement recourir à un système complexe de gabarits Html pour afficher un simple compteur dynamique en bas de page... non ? :shock: :D )...

à+ :)

par katagoto » 18 mai 2008, 14:29

Y a une autre méthode aussi, c'est la POO, qui permet de séparer la logique de l'affichage...

par d0m » 18 mai 2008, 12:03

il vaut mieux enlever les messages d'erreurs de ce type, c'est surtout pour toi en phase de développement.

Après tu peux gérer les erreurs toi même et mettre des messages appropriés.

par supercanard » 18 mai 2008, 11:50

Merci pour vos réponses.
Bon je suis rassuré dans le sens ou je ne suis pas seul à faire comme ça.
Sinon les templates c'est surement une solution plus propre mais il faut que j'étudie un peu des projets existants pour comprendre comment organiser tout ça ^^

Autre question qui n'a rien à voir :
Faut-il laisser les or die dans les requêtes ou doit-on s'en servir uniquement au stade du développement ?
Car si on réfléchis bien un or die peut donner des informations à une personne ma intentionnée...