8792 sujets

Développement web côté serveur, CMS

Bonjour,

j'aimerais avoir l'avis de spécialistes sur la séparation des couches dans une page web. J'aime bien l'idée d'utiliser :

- des fichiers pour la structure du document (en XHTML) ;
- des fichiers pour la couche métier (en PHP );
- des fichiers pour la mise en page (en CSS),
etc.

J'ai utilisé un moteur de template pour monter un site, c'est sympa sur le moment, mais je trouve ça finalement lourdingue, le PHP en lui-même me convient parfaitement.
Mon but est de rester simple tout en séparant la structure des requêtes.

Si je prends l'exemple d'un petit gestionnaire de news, j'en viens à ça :

metier.php
$connection = mysql_connect('localhost','root','') or die(mysql_error());
$database = mysql_select_db('mabase') or die(mysql_error());
		
$query = "SELECT * FROM matable";
$result = mysql_query($query) or die(mysql_error());
		
$totalitems = mysql_num_rows($result);
		
while($row = mysql_fetch_assoc($result)) {
	$id[] = $row['id'];
	$titre[] = $row['titre'];
	$auteur[] = $row['auteur'];
}
		
mysql_free_result($result);
mysql_close($connection);


et

index.php
<p>Il y a <?php echo $totalitems ?> enregistrements :</p>

<?php for($i=0; $i < $totalitems; $i++): ?>
   <p><strong><?php echo $id[$i] ?></strong></p>
   <p><?php echo $titre[$i] ?></p>
   <p><em><?php echo $auteur[$i] ?></em></p>
<?php endfor ?>


Je retourne le problème depuis un moment, je ne vois pas trop comment faire plus simple. Je pourrais tout stocker dans un grand tableau et utiliser foreach au lieu de for, mais les variables seraient plus longues à écrire.

Qu'en pensez-vous ?
Salut Opentype Smiley cligne ,

Pour ma part, j'ai l'habitude de toujours séparer mes fonctions php de la page proprement dite.
Ce qui donne :

index.php
...
include_once 'include/fonctions.php';
...
<?php
echo affiche_news()."\n";
?>
...


fonctions.php
<?php

// --------------------------------------------------------------------------------------------------------------------------
// Se connecte à la DB
// Paramètres : nom de la base -> $name_DB
function connexion_DB($name_DB) {
// Déclaration des paramètres de connexion
 	$NomServeur = $_SERVER['SERVER_NAME'] ; 
	$local=((substr($NomServeur,0,7)=="192.168") || ($NomServeur=="localhost") || ($NomServeur=="127.0.0.1"));
	$host = ($local) ? "localhost" : "host"; 
	$user = ($local) ? "root" : "user"; 
	$passwd = ($local) ? "" : "passwd"; 
	$database = ($local) ? "database_local" : "database"; 

// Connexion au serveur
	mysql_connect($host, $user,$passwd) or die("erreur de connexion au serveur");
	mysql_select_db($database) or die("erreur de connexion a la base de donnees");
}

// --------------------------------------------------------------------------------------------------------------------------
// Deconnection de la DB
function deconnexion_DB() {
	mysql_close();
}

// --------------------------------------------------------------------------------------------------------------------------
// Exécute une requète SQL. Si la requête ne passe pas, renvoir le message d'erreur MySQL
// Paramètres : chaine SQL -> $strSQL
// Renvoie : enregistrements correspondants -> $result
function requete_SQL($strSQL) {
	$result = mysql_query($strSQL);
	if (!$result) {
		$message  = 'Erreur SQL : ' . mysql_error() . "<br />\n";
		$message .= 'SQL string : ' . $strSQL . "<br />\n";
		$message .= "Merci d'envoyer ce message au webmaster";
		die($message);
	}
	return $result;
}

// --------------------------------------------------------------------------------------------------------------------------
// Affiche les news.
function affiche_news() {
	$strSQL = 'SELECT * FROM `news` WHERE `deleted`="N" ORDER BY `date_news` DESC, `id_new` DESC';
	$resultat = requete_SQL($strSQL);
	$nb=mysql_num_rows($resultat);
	if (mysql_num_rows($resultat) == 0) {
		echo ("<p>Aucune news</p>");
	}
	else
	{
	$menu_retour = "\t\t\t\t<br />\n";
	while ($tabl_result = mysql_fetch_array($resultat)) {
		$menu_retour .= "\t\t\t\t".'<h4>'.$tabl_result['titre_news']."</h4>\n";
		$menu_retour .= "\t\t\t\t".'<span class="news">'.nl2br($tabl_result['contenu_News'])."\n<br />\n";
		list($year, $month, $day) = explode("-", $tabl_result['date_news']);
		$menu_retour .= "\t\t\t\t<br />\n\t\t\t\t".'<span class="date">(Publié le '.$day.'/'.$month.'/'.$year.")</span>\n\t\t\t\t</span>\n\t\t\t\t<br />\n";
	}
	return $menu_retour;
	}
}

[b]etc...[/b]

?>


A+


[ EDIT]
En relisant ton post je vois que tu demandais l'avis de spécialistes !
Ce qui n'est pas mon cas Smiley biggol
[ /EDIT]
Modifié par Heyoan (09 May 2007 - 19:38)
Hello Heyoan !

Merci pour ta réponse. En fait, j'ai fait exactement comme toi jusqu'à récemment.

Seulement, j'ai dû un jour modifier la structure même des articles, et j'ai trouvé assez pénible d'aller fouiller dans le fichier PHP et de modifier des lignes genre :
$menu_retour .= "\t\t\t\t".'<span class="news">'.nl2br($tabl_result['contenu_News'])."\n<br />\n";

Et surtout, un tel fichier PHP mélange les requêtes et la présentation, et c'est ce que j'aimerais justement séparer Smiley sweatdrop
Re '

Opentype a écrit :

Et surtout, un tel fichier PHP mélange les requêtes et la présentation, et c'est ce que j'aimerais justement séparer Smiley sweatdrop

Comme je te disais c'est surtout par habitude et aussi parce que...
Une place pour chaque chose et chaque chose à sa place ! Smiley vieux


Le cas de news est typique : tu es de toutes façons obligé de boucler sur chacun de tes résultats avant de faire la mise en page. Le double intérêt (selon moi Smiley fut ) de tout regrouper dans fonctions.php est que tout l'enchaînement se retrouve logiquement au même endroit (pas une partie dans metier.php et l'autre dans index.php) et que tu ne fait ta boucle qu'une seule fois...

Mais c'est vrai que ce n'est qu'un compromis et que ce n'est pas entièrement satisfaisant. Si quelqu'un connaît une autre technique je suis également preneur Smiley biggrin