Choix de feuille de style par navigateur dans une page en ph

Petit nouveau ! | 1 Messages

27 sept. 2009, 10:41

Bonjour,
Après beaucoup de recherches infructueuses, me poste mon problème même s'il est récurent.
J'ai ma page (index.php) en php qui appelle une feuille de style. Jusqu'ici tout va bien. Comme on le sait avec IE6 et IE7, le CSS réajit différemment. D'où l'idée de faire deux feuilles de styles. J'ai bien vu le système des commentaires conditionnels pour appeler la bonne feuille de style, mais ça ne fonctionne pas car ma page est en php.
A force de recherches, j'ai trouvé le code suivant en php :

Code : Tout sélectionner

<?php //$_SERVER["HTTP_USER_AGENT"] : variable donnant le navigateur if (ereg("MSIE", $_SERVER["HTTP_USER_AGENT"])) {     //Internet explorer     echo "<link rel=\"stylesheet\" href=\"style_ie.css\" type=\"text/css\" />"; } else {     //Les autres     echo "<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\" />"; } ?>
Mais au final je me retrouve avec une erreur :
Deprecated: Function ereg() is deprecated in C:\...
Comment dois-je m'y prendre pour avoir un affichage corect sur ma page php.
Avez-vous déja eu se problème?

Mammouth du PHP | 2937 Messages

27 sept. 2009, 11:14

Les fonctions ereg (), eregi (), ereg_* () et eregi_* () sont obsolètes en PHP 5.3 (version que tu dois très probablement utiliser). Elles sont avantageusement remplacées par les fonctions utilisant les expressions régulières compatibles PERL (comme preg_match () ou preg_replace ()).

Quant à la détection de navigateur, le fait de sa baser sur la chaîne d'agent utilisateur n'est pas une solution fiable à 100 % : rien ne t'empêche de configurer, par exemple, Safari pour qu'il passe pour Internet Explorer 6. ;)

Si tu cherches à trier les navigateurs avec, d'une part, Internet Explorer (et ses différentes version) et, d'autre part, tous les autres navigateurs, la solution la plus fiable (et préconisée, d'ailleurs, par Microsoft) est de recourir aux commentaires conditionnels.
<!-- Feuille de style pour tous les navigateurs -->
<link rel="stylesheet" href="style.css" type="text/css" />

<!-- Feuille de style pour IE, toutes versions confondues -->
<!--[if IE]>
<link rel="stylesheet" href="style-ie.css" type="text/css" />
<![endif]-->

<!-- Feuille de style pour les versions d'IE strictement postérieures à la 7 -->
<!--[if gt IE 7]>
<link rel="stylesheet" href="style-ie8-et-plus.css" type="text/css" />
<![endif]-->

<!-- Feuille de style pour IE 7 et versions antérieures -->
<!--[if lte IE 7]>
<link rel="stylesheet" href="style-ie7-et-moins.css" type="text/css" />
<![endif]-->

<!-- Feuille de style pour IE 6 seulement -->
<!--[if IE 6]>
<link rel="stylesheet" href="style-ie6.css" type="text/css" />
<![endif]-->

<!-- Feuille de style pour tous les navigateurs et pour les versions d'IE au moins égales à la 7 (noter le balisage particulier) -->
<!--[if gte IE 7]><!-->
<link rel="stylesheet" href="style-tous-plus-ie7-et-plus.css" type="text/css" />
<!--><![endif]-->

<!-- Feuille de style pour tous les navigateurs, sauf IE (noter le balisage particulier) -->
<!--[if !IE]><-->
<link rel="stylesheet" href="style-tous-sauf-ie.css" type="text/css" />
<!--><![endif]-->
Comme la coloration syntaxique le donne à voir, tout ce qui figure entre les blocs de commentaire conditionnel if et endif sera considéré comme un simple commentaire HTML par tous les navigateurs qui n'utilisent pas Trident comme moteur de rendu (même s'ils se font passer artificiellement pour IE), qui ne chargeront donc pas la feuille de style indiquée. Si les autres navigateurs doivent charger la feuille de style indiquée dans un commentaire conditionnel, il faut faire suivre le bloc if d'un <--> pour fermer le commentaire et faire précéder le bloc endif d'un <!--> pour rouvrir le commentaire (si au moins une version d'IE doit aussi charger la feuille de style, pour éviter l'affichage d'un <--> disgrâcieux, le <--> est à remplacer par <!-->).

Il est même possible d'imbriquer des commentaires conditionnels, comme suit :
<!--[if IE]>
Vous utilisez Internet Explorer<![if lte IE 8]> <![if IE 8]>8<![endif]><![if IE 7]>7<![endif]><![if IE 6]>6<![endif]><![if lt IE 6]>5.5 (ou une version encore antérieure remontant au vingtième siècle)<![endif]><![endif]>
<![endif]-->

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

27 sept. 2009, 16:41

C'est hors-sujet, mais pour info, pour faire des CSS dédiées par navigateurs, il existe encore une 3e solution outre les hacks et/ou les commentaires conditionnels : une analyse du user-agent (en PHP ou en Javascript, au choix selon les avantages et inconvénients de chaque) pour ajouter des classes dans le tag <body> :)
Par exemple, quand un utilisateur d'IE8/Windows visitera votre page, on aura '<body class="win ie ie8">', alors qu'un autre sous Opera/Linux aura '<body class="linux opera opera10">'. Ainsi vos règles "dédiées" à un type de navigateur pourront être incluses dans votre feuille de style sans hack ni commentaire conditionnel :
.my-container {
  margin: 2px;
}
.ie6 .my-container {
  margin: 4px;
}

body {
  font-family: Arial, Helvetica, Sans Serif;
}
body.linux {
  font-family: Sans Serif;
}
Voir par exemple : http://bastian-allgeier.de/css_browser_selector/

Mammouth du PHP | 2937 Messages

27 sept. 2009, 16:46

il existe encore une 3e solution outre les hacks et/ou les commentaires conditionnels : une analyse du user-agent (en PHP ou en Javascript, au choix selon les avantages et inconvénients de chaque) pour ajouter des classes dans le tag <body> :)
Et lorsqu'on a un utilisateur qui fait passer, par exemple, son Safari pour IE 6, on retombe dans le problème de la fiabilité de la chaîne d'agent utilisateur (alors que, même dans ce cas de figure, Safari ne chargera jamais un commentaire conditionnel réservé à IE). :roll:

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

27 sept. 2009, 19:10

Chaque méthode a ses avantages & inconvénients, c'en est un effectivement ;) mais l'utilisateur qui "bidouille" son user-agent est un utilisateur dit "avancé" et conscient des éventuels effets de bord de ce type de changement. L'inconvénient reste réel néanmoins.

Au passage, notez que ce type de solution s'adapte également à la plate-forme (exemple : polices lissées différemment sous Windows XP / Windows Vista / Linux, menant à des choix de font-family différentes), où là aucune autre solution n'existe.

ViPHP
ViPHP | 2287 Messages

28 sept. 2009, 17:52

Et lorsqu'on a un utilisateur qui fait passer, par exemple, son Safari pour IE 6, on retombe dans le problème de la fiabilité de la chaîne d'agent utilisateur (alors que, même dans ce cas de figure, Safari ne chargera jamais un commentaire conditionnel réservé à IE). :roll:
Quand on cherche les problèmes, on les trouve ;) Rien de plus logique finalement...
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
AB
ViPHP | 5818 Messages

28 sept. 2009, 19:51

Et lorsqu'on a un utilisateur qui fait passer, par exemple, son Safari pour IE 6, on retombe dans le problème de la fiabilité de la chaîne d'agent utilisateur (alors que, même dans ce cas de figure, Safari ne chargera jamais un commentaire conditionnel réservé à IE). :roll:
Quand on cherche les problèmes, on les trouve ;) Rien de plus logique finalement...
Oui c'est aussi mon avis. Tant que cela n'engendre pas des problèmes de sécurité du script... pour le reste on ne peut pas s'assurer que tout fonctionne correctement avec toutes les bidouilles que l'utilisateur peut faire. In fine il peut aussi éteindre son ordi pour ne plus rien voir :)