Aller au contenu

[résolu]Style Switcher


Perrine

Sujets conseillés

Re-bonjour à tous :)

Je souhaite intégrer le style switcher PHP de ElMoustiko, décrit dans son tutorial mais je bloque.

ElMoustiko, si tu as quelques instants, peux-tu m'expliquer ou je coince ? Sinon, quelqu'un qui aurait utilisé le script et qui aurait compris comment ça marche (pas comme moi quoi ^^ )

Voilà le code que j'ai mis dans la page aide.php :

<?php
if(isset($_POST['change_style']))
// On vérifie que le formulaire a été soumis
{
if(file_exists("style/".$_POST['style'].""))
// Si le fichier *.css existe on écrit la ligne d'appel de cette feuille de style
{
 echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/".$_POST['style']."\" />\n";
 setcookie('style', $_POST['style'], time()+(365*24*3600));
 // On fait un cookie d'une année de durée pour garder en mémoire le style choisi et le récupérer à la prochaine visite
}
}
elseif(isset($_COOKIE['style']))
// Si le formulaire n'a pas été soumis, on vérifie si le cookie style existe et si tel est le cas on écrit la ligne d'appel de cette feuille de style
{
echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/".$_POST['style']."\" />\n";
}
else
// Si le cookie n'existe pas et que le formulaire n'a pas été soumis, on écrit la ligne d'appel à une feuille de style par défaut, ici un_style.css par exemple
{
echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/screen.css\" />\n";
}
?>

Le formulaire, toujours sur la page aide.php :

<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
 <fieldset>
 <select name="style">
   <option value="screen_800.css" selected="selected">800x600</option>
   <option value="screen_980.css">1024x768    </option>
 </select>
 <input type="submit" name="change_style" value="Changer la résolution" />
 </fieldset>
</form>

La première fois que je viens sur la page aide.php, le script php écrit correctement la ligne link et je n'ai donc aucun souci.

En revanche, quand j'essaie de changer de feuille de style, j'ai l'erreur suivante qui s'affiche :

Warning: Cannot modify header information - headers already sent by (output started at /home/.sites/12/site127/web/www/aide.php:6) in /home/.sites/12/site127/web/www/aide.php on line 16

Mais le changement de css passe bien.

EN LOCAL, j'ai un autre problème : la css change bien, je n'ai pas de message d'erreur. Je vais visiter le site avec la résolution choisie et c'est en revenant sur la page aide.php que j'ai un problème : la page s'affiche sans style.

Je comprends pas :whistling:

Quelqu'un peut m'aider pour ce 2ème souci of the day ? :D Merci :)

Modifié par Azon
Lien vers le commentaire
Partager sur d’autres sites

Salut Azon,

Il faut remplacer ce code:

if(file_exists("style/".$_POST['style'].""))
// Si le fichier *.css existe on écrit la ligne d'appel de cette feuille de style
{
echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/".$_POST['style']."\" />\n";
setcookie('style', $_POST['style'], time()+(365*24*3600));
// On fait un cookie d'une année de durée pour garder en mémoire le style choisi et le récupérer à la prochaine visite
}

par

if(file_exists("style/".$_POST['style'].""))
{
setcookie('style', $_POST['style'], time()+(365*24*3600));
echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/".$_POST['style']."\" />\n";
}

pour éviter l'affichage de quoi que ce soit avant le setcookie()

Dan ;)

Lien vers le commentaire
Partager sur d’autres sites

Je viens de faire les modifs mais ça ne change pas le pb

J'ai toujours le message d'erreur et le changement de CSS passe bien ... mais avec le message d'erreur :

Warning: Cannot modify header information - headers already sent by (output started at /home/.sites/12/site127/web/www/aide.php:6) in /home/.sites/12/site127/web/www/aide.php on line 15
Lien vers le commentaire
Partager sur d’autres sites

Pour ce qui est de l'affichage ou non des erreur, ça depend du PHP.ini...

Sinon, a ce qu'on peut lire, tu definis un header mais tu en envoi déjà un, est-ce que ces deux pages sont incluses dans d'autres?

Lien vers le commentaire
Partager sur d’autres sites

C'est bizar, c'est la deuxieme fois que ce problème arrive, je n'ai pourtant aucun problème :S

Bon, il semble tout de même qu'il y ait une erreur dans mon script mais ce qui est étrange c'est que ça marche pour moi ...

Bon, je corrige comme ce que dis Dan puisqu'apriori ca fonctionne ainsi mais d'apres azon ca change rien et là c'est plus étrange ...

-edit-

Voilà j'ai fait la correction, aucun changement, ça fonctionne pareil (bien) chez moi en local et en ligne

http://www.elmoustikoblog.net/tutoriels/bac_sable/

Lien vers le commentaire
Partager sur d’autres sites

IL est probable que tu envoies des informations au navigateur avant ces codes. Par exemple, le début de la page, le logo, le menu, etc.

Il ne faut rien envoyer du tout.

Toute commande 'echo' fera échouer le script, toute ligne vide non comprise entre <? et ?> générera une erreur, etc.

Avant ton message d'erreur, qu'as tu à l'écran ?

Pour le savoir, tu peux, juste après le premier :

<?php

faire

die("<-----");

Tu regardes le code source. Si tu as quelque chose avant le <---- (même une ligne blanche !) c'est que quelque chose est envoyé au navigateur. Dans ce cas, ca ne peut marcher.

Anonymus.

Lien vers le commentaire
Partager sur d’autres sites

J'ai fait ce que tu m'as dit Anonymus et je n'ai aucune ligne avant le <----

Je vous mets le code entier de ma page aide.php, peut-être que je me suis plantée en insérant le code php tout simplement :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HistWar - Histoire et Wargame - Le jeu de stratégie napoléonien    {Aide à la navigation}   </title>
<meta name="description" lang="fr" content="HistWar est un jeu de stratégie et de tactique retraçant les batailles de l'époque napoléonienne. Revisitez l'histoire aux commandes d'une armée, à l'instar de Napoléon pendant la période 1804 - 1815" />
<meta name="keywords" lang="fr" content="wargame, napoléon, napoleon, austerlitz, premier empire, jeu vidéo, jeu de stratégie, jeu de tactique, 1804, 2 décembre" />
<?php
if(isset($_POST['change_style']))
// On vérifie que le formulaire a été soumis
{
if(file_exists("style/".$_POST['style'].""))
// Si le fichier *.css existe on écrit la ligne d'appel de cette feuille de style
{
  setcookie('style', $_POST['style'], time()+(365*24*3600));
        echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/".$_POST['style']."\" />\n";
 // On fait un cookie d'une année de durée pour garder en mémoire le style choisi et le récupérer à la prochaine visite
}
}
elseif(isset($_COOKIE['style']))
// Si le formulaire n'a pas été soumis, on vérifie si le cookie style existe et si tel est le cas on écrit la ligne d'appel de cette feuille de style
{
echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/".$_POST['style']."\" />\n";
}
else
// Si le cookie n'existe pas et que le formulaire n'a pas été soumis, on écrit la ligne d'appel à une feuille de style par défaut, ici un_style.css par exemple
{
echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/screen.css\" />\n";
}
?>
<link rel="stylesheet" type="text/css" href="style/print.css" media="print" title="normal" />
</head>

<body>
 <div id="page">
 <!-- Header et menu de navigation du haut -->
 <? include ("header_fr.php"); ?>
 <!-- Fin du header et de la nav haut -->
 <!-- Début Contenu -->
 <div id="contenu">
   <h1>Aide à la navigation</h1>
<p>bla bla bla</p>
<h3>Changer la résolution</h3>
<p>Le site est consultable dans deux résolutions : 1024x768 et 800x600. Par défaut, la résolution 1024x768 est choisie mais vous pouvez à tout moment la changer en utilisant le formulaire ci-dessous :</p>
<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
 <fieldset>
 <select name="style">
   <option value="screen_800.css" selected="selected">800x600</option>
   <option value="screen_980.css">1024x768    </option>
 </select>
 <input type="submit" name="change_style" value="Changer la résolution" />
 </fieldset>
</form>
<p>Choisir une résolution adéquate à votre écran vous permettra, entre autres, de faire disparaitre la barre de défilement horizontal en bas du navigateur ... qui est si pénible pour consulter des pages.</p>
 </div>
 <!-- Fin Contenu -->
 <!-- Menu de navigation vertical -->
 <? include ("nav_fr.php"); ?>
 <!-- Fin de navigation vertical -->
 <!-- Pied de page -->
 <? include ("footer_fr.php"); ?>
 <!-- Fin pied de page -->
</div>
</body>
</html>

C'est grave docteur ? :blush:

Lien vers le commentaire
Partager sur d’autres sites

Ce qui est encore plus bizarre, c'est que ça ne fonctionne pas pareil en local et en distant.

En local : plus aucune feuille de style n'est prise en compte :

<link rel="stylesheet" type="text/css" media="screen" href="style/" />

D'après les quelques tests que j'ai fait, cette ligne link est le résultat de ça :

elseif(isset($_COOKIE['style']))
// Si le formulaire n'a pas été soumis, on vérifie si le cookie style existe et si tel est le cas on écrit la ligne d'appel de cette feuille de style
{
echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/".$_POST['style']."\" />\n";
}

donc ça veut dire qu'il ne voit pas le cookie c'est ça ? ou que le cookie n'a pas été enregistré ? (Or, les cookies sont bien activés dans mon FF)

Et en distant :

cette fameuse erreur mais le changement de feuille fonctionne.

Lien vers le commentaire
Partager sur d’autres sites

J'ai fait ce que tu m'as dit Anonymus et je n'ai aucune ligne avant le <----

Je vous mets le code entier de ma page aide.php, peut-être que je me suis plantée en insérant le code php tout simplement :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HistWar - Histoire et Wargame - Le jeu de stratégie napoléonien    {Aide à la navigation}   </title>
<meta name="description" lang="fr" content="HistWar est un jeu de stratégie et de tactique retraçant les batailles de l'époque napoléonienne. Revisitez l'histoire aux commandes d'une armée, à l'instar de Napoléon pendant la période 1804 - 1815" />
<meta name="keywords" lang="fr" content="wargame, napoléon, napoleon, austerlitz, premier empire, jeu vidéo, jeu de stratégie, jeu de tactique, 1804, 2 décembre" />
<?php
if(isset($_POST['change_style']))
// On vérifie que le formulaire a été soumis
{
if(file_exists("style/".$_POST['style'].""))
// Si le fichier *.css existe on écrit la ligne d'appel de cette feuille de style
{
  setcookie('style', $_POST['style'], time()+(365*24*3600));
        echo "  <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"style/".$_POST['style']."\" />\n";
 // On fait un cookie d'une année de durée pour garder en mémoire le style choisi et le récupérer à la prochaine visite
}
[...]

C'est grave docteur ?  :blush:

<{POST_SNAPBACK}>

Si j'ai bien compris Anonymus, il faut mettre ton script tout au début de la page, pas après ton doctype !

Donc déplace le <?php [...] tout au début de la page...

Lien vers le commentaire
Partager sur d’autres sites

Oui mais si je mets avant le doctype, la ligne

<link rel="stylesheet" type="text/css" media="screen" href="style/screen.css" />

va aussi s'écrire avant le doctype et ça va pas

Lien vers le commentaire
Partager sur d’autres sites

Est ce que j'ai bien mis le script au bon endroit ?

Est ce que tu as l'erreur toi aussi quand tu veux sur la page aide.php et que tu changes de style ?

Je ne comprends pas où j'ai fait l'erreur et ça vient forcément de moi puisque ça marche chez toi :D

Je vais essayer de recommencer, sans changer le script ... je ne voulais pas avoir un dossier pour chaque CSS donc j'ai traffiqué un peu, peut-être que je me suis trompée.

Lien vers le commentaire
Partager sur d’autres sites

Si j'enlève

setcookie('style', $_POST['style'], time()+(365*24*3600));

j'ai plus d'erreur ... mais d'une page sur l'autre, je perds les préférences (normal tu vas me dire :P et tu auras raison ! :1eye: )

Lien vers le commentaire
Partager sur d’autres sites

Azon,

Tu ne peux pas envoyer de cookie après avoir écrit QUOI QUE CE SOIT !

Donc, ton début de page avec le <!DOCTYPE... n'est pas bon, il faut impérativement envoyer le cookie avant cela.

Il faut donc que tu fasses une ou plusieurs lignes de code supplémentaires pour gérer l'affichage de la ligne <link rel="stylesheet" type="text/css" au bon endroit ;)

Dan

Lien vers le commentaire
Partager sur d’autres sites

Il faudrat que je modifie le script en conséquence (d'ailleur j'ai réfléchi à une amélioration parceque là c'est un peu trop conséquent). Mais ce qui est plus étrange, c'est que je n'ai aucune erreur, alors que mon cookie est envoyé après le doctype et tout le reste, pourquoi est ce que ca marche quand meme ???

Bon, je modifie ca et je vous préviens quand c'est fait.

Heureusement que c'est un tuto caché non officiel :D

-edit-

Voilà tutoriel mis à jour, la méthode est beaucoup plus simple et permet un choix de la méthode d'appel des styles plus simple. Il est plus facile de choisir entre _AT_import et <link> maintenant, en effet, en début de script on nomme une variable $css correspondant au style à utiliser, ensuite on choisi <link> ou _AT_import et on fait le echo qui va bien ;) Dans le bac à sable ( http://www.elmoustikoblog.net/tutoriels/bac_sable/ ) j'ai choisi _AT_import, je préfère cette méthode.

Voilà a vous de me dire si ca fonctionne correctement.0

Lien vers le commentaire
Partager sur d’autres sites

Oui oui :) ... j'ai fait un copier / coller bête et méchant en modifiant juste le passage qui me permet de mettre toutes mes css dans un unique dossier ;)

<?php
if(isset($_POST['change_style']))
// On vérifie que le formulaire a été soumis
{
if(file_exists("style/".$_POST['style'].""))
{
 // On fait un cookie d'une année de durée pour garder en mémoire le style choisi et le récupérer à la prochaine visite
 setcookie('style', $_POST['style'], time()+(365*24*3600));
 // Si le fichier *.css existe on définit une variable $css correspondant au style choisi
 $css = $_POST['style'];
}
}
elseif(isset($_COOKIE['style']))
// Si le formulaire n'a pas été soumis, on vérifie si le cookie style existe et si tel est le cas on définit une variable $css correspondant à ce style
{
$css = $_COOKIE['style'];
}
else
// Si le cookie n'existe pas et que le formulaire n'a pas été soumis, on définit une variable $css correspondant au style par défaut, ici un_style.css par exemple
{
$css = "screen.css";
}
?>

Merci encore ;)

Lien vers le commentaire
Partager sur d’autres sites

Pourquoi dans certains cas, ca marche, et pas dans d'autres ?

Simple. Dans certains cas, les données sont mises en 'cache' sur le serveur, jusqu'à la fin du script, où les données sont toutes envoyées en meme temps, dans le bon ordre (donc les cookies en premier), au navigateur. On a l'impression que les lignes sont envoyées au fur et à mesure, alors qu'elles sont stockées, pour éviter notamment ce genre d'erreurs.

Certains moteurs de template utilisent ce système de mise en cache, certains programmes open source également, puisqu'il permet une meilleure prise en compte des messages d'erreurs notamment.

Anonymus.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...