8722 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

En passant, les arrays sont peut-être plus performants qu'un switch, mais c'est moins lisible pour le débutant. Et pour 5 ou 6 valeurs à tester, l'impact doit rester microscopique pour le serveur, non ?
Sopo a écrit :
Et pour 5 ou 6 valeurs à tester, l'impact doit rester microscopique pour le serveur, non ?

Oui, parfaitement négligeable pour un petit switch
FlorentG a écrit :

Oui, parfaitement négligeable pour un petit switch
C'est bien ce que je pensais.

Dans ce cas, je propose de remplacer l'expression "code de goret" par "code scolaire", "code didactique" ou "code pédagogique" Smiley smile

Tous les visiteurs de sont pas des codeurs aguerris (en particulier ceux qui indiquent dans le titre de leur message Smiley newbie ), pas la peine de leur mettre des claques parce que leur code n'est pas optimisé Smiley ohwell
Et si, en tant que défenseur du switch, vous lui proposiez une version optimisée de son code au lieu de me chercher des crosses Smiley langue

Parce que si c'est pour utiliser un switch autant optimisé son truc alors.
Dans la foulée, quel est le défaut de son entrée en matière ?
if (!isset($_GET['page'])) $page= 'Accueil'; else $page= $_GET['page']; 
Smiley ohwell
Modifié par Bison (08 Nov 2006 - 15:24)
Personne ne te cherche des crosses, mais tu vas un peu vite pour te faire comprendre par un débutant.

Et "code de goret" sonne un peu agressif à mes oreilles.
Code de goret va très bien aux variables dynamiques pourtant. Smiley cligne
Puis c'est sympa un goret, c'est tout rose avec la queue en tire-bouchon... Smiley langue

<?php 
switch($page)
{
case 'accueil': 
include ('up.htm');
include ('left_Accueil.htm');
include ('Accueil.htm');
break;

case 'IPA': 
include ('up.htm');
include ('/Cours/left_IPA.htm');
include ('/Cours/IPA.htm');
break;

case 'PGD':
include ('up.htm');
include ('/Cours/left_PGD.htm');
include ('/Cours/PGD.htm');
break;

case 'Sociologie':
include 'up.htm';
include ('/Cours/left_Sociologie.htm');
include ('/Cours/Sociologie.htm');
break;

case 'TQ':
include 'up.htm';
include ('/Cours/left_Techniques_quantitatives.htm');
include ('/Cours/Techniques_quantitatives.htm');
break;

default:
include ('acceuil.htm');
include ('left_Accueil.htm');
include ('Accueil.htm');
} 
?>


<div id="Head">, <div id="MenuGauche"> et <div id="Centre"> dans les pages respectives.

Voilà, là au moins on justifie l'emploi du switch. Smiley cligne
Ne me prenez pas pour un neuneu quand même... j'apprécie moyennement.
Si j'ai fait cette boucle, c'est parce que c'est moi, en passant à Apache 2 et PHP 5, qui ai désactivé les register_globals sur le serveur Smiley fou ...
Mon prédécesseur a tout codé en s'appuyant dessus. Vous m'excuserez, mais mon "client" m'a fixé d'autres objectifs que de faire du joli code...
Déjà que quand j'ai annoncé qu'il fallait que je reprenne le code sur un site et que j'en avais pour 3-4 mois c'est moyennement passé.

Je pense qu'il vous manque un peu de pédagogie pour faire passer vos messages au lieu d'arriver tambour battant et de taper sur tout ce qui bouge.
Oula... register_globals est désactivé par défaut depuis php4.
Quel est le rapport entre boucle et register_global ? Smiley ohwell
Quel est le rapport avec les variables dynamiques présentées plus haut ? Smiley ohwell

Si tu codes pour un "client", cela sous-entend "pour une perssonne qui paie", c'est une raison de plus pour lui fournir des prestations correctes et pérennes.
Tu devrais être content qu'on se penche sur ton sujet afin de te donner les infos adéquates permettant de fournir une appli qui tienne la route. Smiley smile

Faut pas confondre quand même, le demandeur c'est pas moi ! Smiley langue

Bon bref, pas grave.
Bonjour.
De toute façon, ces comparaisons animalières, outre qu'elles sont vexantes, ne font pas avancer le schmilblick.

Il ne faut pas imaginer de ségrégation entre les tenants du tout switch, et les tenants du tout array, l'une et l'autre structure apportant ses avantages et inconvénients, et se trouve plus adapté à tel ou tel cas.

Dans le cas présent, il est question de remplir trois "div" avec du contenu en fonction d'un paramêtre GET. La proposition de départ consistait à utiliser 3 switch. Or, c'est réalisable avec un seul:


<?php
$context = (isset($_GET["page"])) ? $_GET["page"] : "accueil";

 switch($context)
{
	case 'accueil':
		$left = "left_accueil.htm;
		$mid = "mid_accueil.htm";      
		$right = "right_accueil.htm";
			break;
			
	case 'subject_1':
		$left = "left_subject_1.htm;
		$mid = "mid_subject_1.htm";      
		$right = "right_subject_1.htm";
			break;
			
	case 'subject_2':
		$left = "left_subject_2.htm;
		$mid = "mid_subject_2.htm";      
		$right = "right_subject_2.htm";
			break;
			
	default:     // Le param GET contient une valeur fantaisiste
		$left = "left_accueil.htm;
		$mid = "error.htm";      // un message d'erreur courtois et polis
		$right = "left_accueil.htm";

} 
// à ce stade, tout les cas de figures sont couverts...
?>

<body>

	<div id="menu_gauche">
		<?php include $left; ?>
	</div>

	<div id="main">
		<?php include $mid; ?>
	</div>

	<div id="col_droite">
		<?php include $right; ?>
	</div>

</body>



Objectivement, ceci est "lisible" et maintenable. L'utilisation du switch est conforté par l'exploitation du cas "default" qui, pour être couvert avec des tableaux aurait nécessité autant de "if then else" que de div à remplir.
Modifié par GeorgesM (09 Nov 2006 - 10:39)
Je ne suis pas demandeur... Regarde l'auteur du topic.

Le rapport entre la boucle que j'ai donné et register_globals ?
Simple... quand toutes les variables exploitées dans la page proviennent de GET ou POST. Si ton code utilise directement des $page au lieu des $_GET['page'], tu vas t'amuser à reprendre le formulaire d'origine pour noter un à un tous les champs et refaire des vérifications ?
Avec du temps oui, c'est même une obligation.
Sauf qu'on a tous nos contraintes, les miennes étant ailleurs pour le moment. Cette boucle permet de filtrer ce qui est passé dans GET ou POST sans avoir à retoucher le reste du code et de garder les mêmes noms de variables.
Ca fait gagner un temps fou dans l'immédiat. Ce qui n'exclut pas de reprendre le code à terme.

J'aurais peut être du préciser que cette boucle, qui contient des variables dynamiques, n'est à utiliser qu'en cas de manque de temps...
Ce n'est pas une solution, c'est un palliatif temporaire.
a écrit :
Ce n'est pas une solution, c'est un palliatif temporaire.

Mouarf... fabuleux !
Au fond vous avez raison, je ne vois pas pourquoi je devrais insister.

EDIT :
Arf j'avais pas lu ça !
GeorgesM a écrit :
Objectivement, ceci est "lisible" et maintenable. L'utilisation du switch est conforté par l'exploitation du cas "default" qui, pour être couvert avec des tableaux aurait nécessité autant de "if then else" que de div à remplir.

Smiley ohwell
Modifié par Bison (09 Nov 2006 - 14:01)
Tu fais quand même un peu intégriste là Bison. Le code donné marche, il est facilement maintenable, on a fait le plus gros. Après, si on peut optimiser son code, super, mais c'est pas toujours le cas. L'essentiel, c'est que ça marche et qu'il soit lisible et documenté.
Vikchill a écrit :
Tu fais quand même un peu intégriste là Bison.

C'est moi qui fait intégriste, tu y va fort ! Smiley langue
Ils sont tous les deux occupés à raconter des énormités... Smiley ohwell
Dire qu'il faudrait des tonnes de if else pour le faire avec un tableau... Smiley ohwell

Maintenable, non c'est pas maintenable !
- Pour le moment, il y a 3 pages pas plus à son truc... ça va donner quoi son switch avec 200 pages ????
- C'est moins souple d'ajouter un choix avec un switch qu'avec un tableau puisque dans le cas du switch il faudra écrire le code lié au nouveau choix... pas avec un tableau !
- si c'est pour donner au switch une structure identique à celle d'un array, pourquoi donc utiliser le switch qui est moins performant ?

Bref, l'intégriste c'est pas moi !
En plus, je remarque qu'aucun des deux n'a demandé à voir une version avec tableau juste pour savoir si je ne pouvais pas avoir raison. (6 lignes de code)

Voilà.
Si indiquer des bonnes habitudes et proposer du code à la hauteur c'est être intégriste, alors oui je suis un intégriste. Smiley ohwell
Modifié par Bison (09 Nov 2006 - 15:26)
Aureance a écrit :
Bonsoir.
Oserais-je demander à Bison quelle solution il apporte au problême ?
Le code proposé plus haut m'avait paru futé (le premier, je veux dire), mais je suis novice; Si une "array" peut remplacer plus simplement et solidement le "switch / case"… J'aimerai bien une petite démonstration de code. Et celà résoudrai peut_être la question ?


... je cite ...

en réponse à
a écrit :
En plus, je remarque qu'aucun des deux n'a demandé à voir une version avec tableau juste pour savoir si je ne pouvais pas avoir raison. (6 lignes de code)

Modifié par GeorgesM (09 Nov 2006 - 15:31)
Aureance a écrit :

Bonsoir.
Oserais-je demander à Bison quelle solution il apporte au problême ?

Au temps pour moi !
Cela m'a échappé.

<?php
$pages=array(
	'accueil'=>'accueil',
	'page1'=>'mapage1',
	'page2'=>'mapage2'
	);
if(isset($_GET['page']) && array_key_exists($_GET['page'],$pages)) $suite=$_GET['page']; else $suite='accueil';
?>
<div id="menu_gauche">
	<?php include 'left_'.$suite.'.htm'; ?>
</div>
<div id="main">
	<?php include 'mid_'.$suite.'.htm'; ?>
</div>
<div id="col_droite">
	<?php include 'right_'.$suite.'.htm'; ?>
</div>


De plus, sortir de php par 3 fois pour afficher 3 bête div c'est idiot, autant tout faire en php.
Donc ça donne :
<?php
$pages=array(
	'accueil'=>'accueil',
	'page1'=>'mapage1',
	'page2'=>'mapage2'
	);
if(isset($_GET['page']) && array_key_exists($_GET['page'],$pages)) $suite=$_GET['page']; else $suite='accueil';

echo '
<div id="menu_gauche">',include ('left_'.$suite.'.htm'),'</div>
<div id="main">',include ('mid_'.$suite.'.htm'),'</div>
<div id="col_droite">',include ('right_'.$suite.'.htm'),'</div>';
?>
- Votre solution implique de disposer et maintenir quinze pages externes, soit le produit du nombre de div (3) par le nombre de contextes (5).
Hors, dans le cas présenté, plusieurs pages sont communes à plusieurs contexte.

- On ne gère pas de solution de signalement si le nom de contexte est farfelu.

- Dans le projet réel, les trois "div" ne sont pas nécessairement contigus.
Admettons que les menus des cinq contextes soient de deux types : menu_a.htm et menu_b.htm.
On aurait :

 switch($context)
{
	case 'accueil':
		$left = "menu_a.htm;			//	<< menu_a
		$mid = "mid_accueil.htm";      
		$right = "right_accueil.htm";
			break;
			
	case 'subject_1':
		$left = "menu_a.htm;			//	<< menu_a (le même)
		$mid = "mid_subject_1.htm";      
		$right = "right_subject_1.htm";
			break;

	case 'subject_2':
		$left = "menu_b.htm;			//	<< menu_b (un autre)
		$mid = "mid_subject_2.htm";      
		$right = "right_subject_2.htm";
			break;
...

C'est sans soucis particulier.
Pages :