8792 sujets

Développement web côté serveur, CMS

Modérateur
Salut,

Je compte bidouiller quelques pages en XHTML 1.1 sans pour autant me rendre incompatible avec différentes versions d'IE. Du coup, j'ai fait un code répondant à ces exigences... mais au passage, ben, je me suis passé des commentaires conditionnels via PHP (parce que si je peux me passer de code spécial M$croft, je préfère).

Ma question est de savoir si ce que j'ai fait convient et si, ce n'est pas le cas, pourquoi ?
-> On ne parle que des commentaires conditionnels sans évoquer cette version PHP, quelle en est la raison ?
Ah! puis si vous voyez de quoi parfaire ce code, je suis tout ouïe... Merci. Smiley ravi
<?php
ob_start("ob_gzhandler");
$test = stristr($_SERVER["HTTP_ACCEPT"], "application/xhtml+xml");
if($test)
{
	header("content-type: application/xhtml+xml; charset=utf-8");
	echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
                      "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'."\n";
}
else
{
	header("content-type: text/html; charset=utf-8");
	echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n";
}
?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"<?php if(!$test) echo ' lang="fr"'; ?>>
	<head>
		<meta http-equiv="content-type" content="<?php echo $test ? 'application/xhtml+xml' : 'text/html'; ?>; charset=utf-8" />
		<title>Page XHTML 1.1</title>
		<style type="text/css"><?php echo $test ? '<![CDATA['."\n" : '/*<![CDATA[*/'."\n"; ?>
			@import url('style.css.php');
<?php
$agent = getenv("HTTP_USER_AGENT");
if(ereg("MSIE 7", $agent) && !ereg("Opera", $agent))
{
	echo "\t\t\t@import url('styleIE7.css.php');\n";
}
elseif(ereg("MSIE 6", $agent) && !ereg("Opera", $agent))
{
	echo "\t\t\t@import url('styleIE6.css.php');\n";
}
elseif(ereg("MSIE 5.5", $agent) && !ereg("Opera", $agent))
{
	echo "\t\t\t@import url('styleIE5_5.css.php');\n";
}
elseif(ereg("MSIE 5.0", $agent) && !ereg("Opera", $agent))
{
	echo "\t\t\t@import url('styleIE5.css.php');\n";
}
?>
		<?php echo $test ? ']]>' : '/*]]>*/'; ?></style>
		<script type="text/javascript" src="script.js.php"></script>
	</head>	
	<body>
		<p id="nojava">test</p>
	</body>
</html>


exemple de css associé :
<?php
ob_start("ob_gzhandler");
header("content-type: text/css; charset=utf-8");
?>
@media screen, projection
{
	body
	{
		background-color: #FFF;
		color: #000;
		font-size: 100%;
	}
	p
	{
		font-size: 1em;
		color: red;
	}
}
Hello,

Il y a toujours le problème de la page enregistrée avec un navigateur puis ouverte en local avec un autre, qui n'est certes pas très important... Ou alors celui d'un proxy qui enlèverait ou modifierait le header HTTP_USER_AGENT (mais est-ce réaliste ?).

Petite question en passant : pourquoi utilises-tu une section CDATA alors que tu es assuré que ton élément ne contient pas de caractères spéciaux XML ?

Voilà, c'était ma contribution guère constructive au débat. Smiley smile
Modérateur
Salut Eldebaran, Smiley smile

Je me disais bien que tu passerais par là. Smiley ravi

a écrit :
Il y a toujours le problème de la page enregistrée avec un navigateur puis ouverte en local avec un autre, qui n'est certes pas très important...
En supposant que tu sois fan de la navigation sur IE5 (pourquoi pas, après tout... Smiley langue ), tu vas récolter la feuille de style normale ainsi que celle dédiée à IE5 lors de l'enregistrement de la page... Le problème ne se pose alors que si tu changes de navigateur en cours de route, chose qui est intéressante pour nous qui développons mais peu commune pour l'utilisateur lambda... Néanmoins, bien que ce cas ne me semble plausible que pour un utilisateur qui choisit de consulter la page hors connection et sur un navigateur différent de celui utilisé pour l'enregistrement, c'est une chose dont il faut avoir conscience... (ce n'était pas mon cas jusqu'à ce que tu en parles) Celà dit, rien ne l'empêche de réenregistrer la page sur ce second navigateur. (à idée saugrenue, réponse saugrenue)
a écrit :
Ou alors celui d'un proxy qui enlèverait ou modifierait le header HTTP_USER_AGENT (mais est-ce réaliste ?).
Euh... il ne va pas avoir un petit problème sur de nombreux sites le bonhomme qui navigue via ce proxy ? Smiley lol Si le header est supprimé, je pense que si mais si ce n'est que modifié, il devrait récupérer la feuille de style adaptée...

Ce qui me semble intéressant ici, c'est qu'on ne récupère que la (ou les) feuille(s) de style dont on a réellement besoin à la consultation et qu'on élimine les codes propriétaires (commentaires conditionnels)...

a écrit :
Petite question en passant : pourquoi utilises-tu une section CDATA alors que tu es assuré que ton élément ne contient pas de caractères spéciaux XML ?
Par habitude... Rien ne m'interdit de nommer un fichier style--IE.css il me semble (Je n'ai pas testé) mais ça poserait problème au parseur dans ce cas. Avec CDATA, je n'ai pas besoin d'y faire attention.

a écrit :
Voilà, c'était ma contribution guère constructive au débat. Smiley smile
C'est constructif au contraire... Je cherche justement à voir quels pourraient être les soucis qui en découlent... Smiley biggrin
Eldebaran a écrit :
Ou alors celui d'un proxy qui enlèverait ou modifierait le header HTTP_USER_AGENT (mais est-ce réaliste ?)

Certaines personnes désactivent l'envoie de l'en-tête User-agent pour se rendre plus "anonyme". Moi je ne vois pas l'intérêt mais je me rappelle que Norton Internet Security faisait ça par défaut dans le temps. C'est pour ça qu'il ne faut pas partir du principe que etenv("HTTP_USER_AGENT") va renvoyer quoi que ce soit et prévoir un cas par défaut.

Au cas où la page soit mise en cache par un proxy il faudrait également indiquer que le contenu change en fonction du navigateur à l'aide de l'en-tête Vary:
header('Vary: user-agent');


Pour le reste... moi je ne suis pas fan d'envoyer du contenu différent selon la valeur de User-Agent, mais Yahoo! le fait bien donc ça ne donc pas être une si mauvaise technique Smiley cligne

Au fait, si tu ne l'as connais pas déjà tu seras certainement intéressé par la fonction get_browser() de PHP (nécessite Browscap).
Modérateur
Hubert Roksor a écrit :

Certaines personnes désactivent l'envoie de l'en-tête User-agent pour se rendre plus "anonyme". Moi je ne vois pas l'intérêt mais je me rappelle que Norton Internet Security faisait ça par défaut dans le temps. C'est pour ça qu'il ne faut pas partir du principe que etenv("HTTP_USER_AGENT") va renvoyer quoi que ce soit et prévoir un cas par défaut.
Etant donné qu'il s'agit de feuilles de style, optionnelles en soi, le cas par défaut est ici @import url('style.css.php'); qui transmet les styles aux navigateurs "récents"... Ce serait donc ce qu'obtiendraient les personnes ayant désactivé l'envoi d'entête... bon... mais si on passe par les commentaires conditionnels, on a le même soucis, non ? Smiley confuse Si le navigateur ne peut être déterminé, une feuille de style spéciale IE n'apparaîtrait jamais... Je ne suis pas sûr et suppose qu'il y a d'autres manières de repérer le browser mais quelqu'un qui ferait cela irait certainement jusqu'au bout de son acte et se retrouverait vite contraint d'ôter la présentation pour pouvoir lire le texte correctement...

a écrit :
Au cas où la page soit mise en cache par un proxy il faudrait également indiquer que le contenu change en fonction du navigateur à l'aide de l'en-tête Vary:
header('Vary: user-agent');
Ca, je le note. Smiley cligne

a écrit :
Pour le reste... moi je ne suis pas fan d'envoyer du contenu différent selon la valeur de User-Agent, mais Yahoo! le fait bien donc ça ne donc pas être une si mauvaise technique Smiley cligne
Euh... moi non plus, je ne suis pas fan et si je pouvais me passer de commentaires conditionnels ou de cette technique, ce serait avec grand plaisir... Smiley ravi
Le but n'est pas réellement d'envoyer un contenu textuel différent mais plutôt de ne mettre que les appels aux feuilles de style réellement nécessaires, bref, obtenir un code plus propre... (J'ai bien conscience que c'est du crépage de chignon mais si ça marche, pourquoi pas... Smiley smile )

a écrit :
Au fait, si tu ne l'as connais pas déjà tu seras certainement intéressé par la fonction get_browser() de PHP (nécessite Browscap).
En faisant un petit tour rapide via Google, il semble que tous les hébergeurs ne le permettent pas... à voir...

Du coup, je suis un peu indécis... Je me disais que j'avais prévu l'affichage sur les navigateurs concernés mais après, si je tombe sur des zigotos qui cassent tout, ça devient difficile d'y répondre... Smiley confus
koala64 a écrit :
Si le navigateur ne peut être déterminé, une feuille de style spéciale IE n'apparaîtrait jamais... Je ne suis pas sûr et suppose qu'il y a d'autres manières de repérer le browser mais quelqu'un qui ferait cela irait certainement jusqu'au bout de son acte et se retrouverait vite contraint d'ôter la présentation pour pouvoir lire le texte correctement...
Je pense que le fait de désactiver l'en-tête User-Agent n'a pas d'influence sur le parsing du document par le navigateur et donc sur le fait que IE lise les commentaires conditionnels ou non.
Modérateur
A la rigueur, je peux tester si l'entête est bien renvoyée et si ce n'est pas la cas, envoyer les commentaires conditionnels... Smiley murf

hum... pourquoi faire simple quand on peut faire compliqué ?!! Smiley lol
Modérateur
Si l'entête n'est pas renvoyée ? Smiley biggol Oui, pourquoi pas ! En plus d'être parano, ça leur fera les pieds... Smiley lol