Feuilles de style variables
RésoluEDIT je précise qu'il s'agit d'un site sous SPIP, il y a donc déjà des appels php (les adresses contiennent des envois ?id_article=x, par exemple)
26 réponses
Des échanges portent sur la possibilité de proposer deux interfaces graphiques et de basculer rapidement entre feuilles de style via une clé design, en s'appuyant sur PHP et les sessions. La solution retenue consiste à démarrer une session, tester $_GET['design'] et affecter $_SESSION['design'] correspondant, puis à préserver la valeur tant que l'utilisateur navigue sans réinitialiser par défaut. Pour éviter d'écraser le choix en cours, on peut définir le style par défaut uniquement si aucune session n'existait pas, garantissant une expérience cohérente sans perte de préférence. D'autres évoquent des cookies pour mémoriser le choix sur le poste même après fermeture du navigateur, bien que l'usage des cookies nécessite des précautions et la compréhension des limites.
-
ModérateurBonsoir.
Pour faire un cookie, c'est la fonction setcookie.
Ensuite, si je me souviens bien, elle prend trois paramètres :
setcookie(nomducookie,valeur,temps d'expiration)
Mais c'est moins sécurisé que les sessions, car la variable est stockée dans l'ordinateur de l'utilisateur et pas sur le serveur.
Sinon, une astuce pour trouver les fonctions :
il suffit de taper php.net/nom de la fonction
Par exemple :
https://www.php.net/setcookie
a plus -
Si l'utilisateur se déconnecte et reconnecte, tant pis pour lui, je parlais plutôt de la fermeture du navigateur...
Ca me gènerait un peu d'avoir recours aux cookies, mais pourquoi pas. SPIP génère un cookie, mais je ne sais pas l'utiliser pour stocker une variable, et si je génère un autre cookie, le script ne sert plus à rien, j'imagine. Je ne sais pas comment stocker une variable dans un cookie:)
EDIT session write_close() ici : https://cyberzoide.developpez.com/php4/faqsession/ -
Je ne connais pas la session write close.
La durée d'une session ne prend pas en compte le changement d'ip. Donc si on se déconnecte - reconnecte, la session précédente n'existera plus.
Je te conseille plutôt de faire un pett cookie, là tu es sûr que le style sera mémorisé à vie sur le pc de l'utilisateur (si l'utilisateur n'efface pas ses cookies évidemment) -
Dites, je voudrais que le changement de design soit pris en compte pour, mettons, une ou deux heures, voire une journée, plutôt qu'à chaque connexion (en fermant le navigateur). J'ai trouvé deux solutions, mais je n'arrive pas à les utiliser :
- modifier la durée de la session dans php.ini -> où se trouve php.ini ??
- utiliser la fonction session_write_close() -> il suffit d'ajouter cette fonction au code ?? -
Huhu j'avais deja fourni ce lien ;)
Pour répondre à ce que tu as dit plus haut : ce qui me gène c'est que quoi qu'il arrive, tu redéfinis la variable de session, et ce même si le style n'a pas été demandé à changer. J'admets que ca demande tres peu de ressources de réassigner une seule variable, mais étant donné que cela se fera à n'importe quel changement de page, et en se plaçant dans le contexte d'un site tres visité, eh bien il y a un surplus d'utilisation de bande passante non négligeable.
C'est pour ça que j'avais préféré tester dès le début l'existance des variables (la get et la session), et en fonction, on exécute on non le code qui suit. Mais UNIQUEMENT dans certaines conditions.
Au final le code sera plus léger car ne s'exécutera pas à chaque page (je doute que les users décident de changer le style à chaque page).
Maintenant, chacun ses préférences hein :) -
ModérateurJe pense qu"il vaut mieux faire le test de présence de la variable dès le début
C'est aussi ce que je voulais dire, mais bon, j'allais pas refaire tout le code pour ca.
Voici ce que je trouve le plus adapté :<?php //démmarage de la session session_start(); // Si on a demandé un changement de style : if isset($_SESSION['design']) { $design=htmlspecialchars($_SESSION['design']); } elseif isset($_GET['design']) { $design=htmlspecialchars($_GET['design']) if ($design=='design1') { $design='design1'; } elseif ($design=='design2') { $design='design2'; } //toujours faire une condition par défaut else { //design par défaut ou message d'erreur ? } else { //on crée la variable par défaut de design $design='defaut'; } //puis : $_SESSION['desgin']=$design;?>Quelques commentaires sur ce code :
La condition par défaut qui ne devrait pas servir (else), je pense qu'il vaut mieux la mettre.
Ca peut servir au cas ou la variable design ne convient pas a celle enoncée, par exemple a cause d'une erreur de frappe ou si l'utilisateur a essayé d'executer du code (voir plus bas).
Ca parait stupide et on en aura surement pas besoin, mais on ne sait jamais.
Après, a toi de choisir si on met un message d'erreur ou le design par défaut.
Pour htmlspecialchars, c'est une fonction qui permet de replacer la caractères '<', '>', '&' et '"' (les guillemets) par leurs entitiés html.
Comme ca, si quelqu'un a de 'mauvaises intentions', le code qu'il a entré ne s'executera pas pas.
Ensuite, tu affiches ton code html, puis le style css :<link rel="stylesheet" type="text/css" href="<?php echo $_SESSION['design'];?>" />
Incroyable... Je ne pensais pas qu'on pouvait aller aussi loin avec les css
C'est des propriétés supportés uniquement par les navigateurs avec le moteur Gecko (firefox camino...) et qui sera peut-être incluse dans la version 3 des css.
on peut aller beaucoup plus loin.
Regarde :
http://www.cssplay.co.uk/
a plus -
Incroyable... Je ne pensais pas qu'on pouvait aller aussi loin avec les css
-
Un lien en français :
http://www.journaldunet.com/developpeur/tutoriel/css/051206-css-boite-bordure-arrondi.shtml
(code tres basique mais facilement adaptable)
Des sources plus complexes mais apportant des solutions plus sympa :
http://www.cssplay.co.uk/boxes/snazzy.html
http://www.cssplay.co.uk/boxes/snazzy2.html
(afficher le code source des pages pour voir comment c'est fait) -
Bonne idée pour les gif. Par contre je ne connais pas la technique "margin", et je ne vois pas du tout comment ça peut marcher (margin/padding = retrait ajout de pixels en bordure de cellule, pas dans les coins en arrondi ?)
-
Ok je fais pareil.
Un conseil : pour ne pas t'embêter à changer ces images quand le style change (et donc la couleur de fond), crée des gifs!!! Tu peux rendre des parties des gifs transparentes.
Sinon je sais qu'il existe une technique bien plus nette qui consiste à changer le margin (je ne suis plus vraiment sûr que c'est le margin, c'est peut-être le pading ou autre chose) pixel par pixel, mais je la trouve lourde.
Cependant elle respecte la séparation code html - présentation, et a l'avantage d'être toujours propre, quelque soit le navigateur (avec ta technique, parfois les images sont décalées selon le navigateur et ca fait sale) -
C'est une image rectangulaire dans une cellule de tableau ; les coins sont arrondis sur l'image avec la même couleur que le fond... Pourquoi ?;)
-
A moi de te poser une question :
Quelle technique utilises-tu pour arrondir les coins dans ton footer? -
Merci beaucoup pour votre aide !!
Je n'ai aps eu le temps de poster hier soir, après 20 h de codage forcené... mais ça marche très bien ! Je n'ai pas eu besoin de la fonction isset pour l'instant, mais ce sera sans doute plus propre.
Voilà, je démarre en php, il ne me reste plus qu'à acheter des bouquins:)) Le résultat est visible ici http://www.lentrelacs.org (le design n'est pas terrible, mais pour le texte, le changement d'interface est très pratique).
Bravo à la communauté CCM !
EDIT le code final de la fonction est assez barbare...
<?php session_start(); if ($_GET['design']=='1') {$_SESSION['design']='1';}
elseif ($_GET['design']=='2') {$_SESSION['design']='2';}
elseif ($_SESSION['design']=='2') {$_SESSION['design']='2';}
else {$_SESSION['design']='1';} ?> -
Et pour ne pas te perdre, je sépare mes posts
Alternative à la série de if suivante :if ( isset ( $_GET['design'] )){ if ($_GET['design']=='design1') { $_SESSION['design']='design1'; } elseif ($_GET['design']=='design2') { $_SESSION['design']='design2'; } }
Tu peux la remplacer par :if ( isset ( $_GET['design'] )) { switch ($_GET['design']) { case "design1" : $_SESSION['design']='design1'; break; case "design2" : $_SESSION['design']='design2'; break; } }
N'hésite pas à demander des précisions, et bon courage!! -
Je pense qu"il vaut mieux faire le test de présence de la variable dès le début :
<?php // Démarrage de la session session_start(); // Si le user a demandé un changement de style : if ( isset ( $_GET['design'] )){ if ($_GET['design']=='design1') { $_SESSION['design']='design1'; } elseif ($_GET['design']=='design2') { $_SESSION['design']='design2'; } } // Si le user n'a pas dmeandé de changement de style : else { // On place le style par défaut si aucun autre style n'avait été défini avant if (!isset ( $_SESSION['design'] ) { $_SESSION['design']='defaut'; } } ?>
Comme ca on teste si le user a cliqué sur un changement de style en premier.
Si ca n'est pas le cas, on vérifie que $_SESSION['design'] n'existe pas avant de lui donner le style par défaut (car sinon le style en cours est irrémédiablement remplacé par défaut) -
ModérateurEst-ce qu'il pourrait par exemple y avoir un conflit entre php3 (spip) et php ? Peut-il y avoir plusieurs variables ?xxx=xxx dans une adresse ?...
oui.
Si tu veux plusieurs variables get, il faut mettre une esperluette &
<a href="?design=flash&rubrique=4">cliquez ici</a>
Mais le problème, c'est que tu ne sais pas si l'url contient déja une variable get ou pas.
donc je ne sais pas si ca marche si une adresse est du genre :
index.php&design=15
Je vais essayer.
Sinon, tu peux essayer en regardant si il y a déja une variable get.
Si on écrit :
$les_variables_get=$_GET[];
la variable $les_variables_get devient égale au contenu de toutes les variables get.
Il ne faut pas mettre de guillemets aux crochets de GET.
Donc je pense qu'en faisant :if isset($_GET[]) { echo '<a href="&rubrique=1">Rubique 1</a>'; } else { echo '<a href="?rubrique=1">Rubique 1</a>'; }
Ca pourrait marcher.
Mais si tu as des variables get sur chaque page (qui correspondent a la rubrique), il suffit d'écrire <a href="&design=flash">Design flash</a>
Mais surtout le problème c'est que la dernière condition
else {
$_session['design']=defaut;
}
efface systématiquement la valeur de "design" quand on circule dans les pages et qu'il n'y a plus rien à récupérer en GET. Il faudrait en faire une condition du type
elseif ($_GET['design']=='rien du tout')
{
$_SESSION['design']='design1';
}
la fonction isset vérifie si une variable existe.
Donc en faisant :
elseif (!isset($_GEt['desgin']))
{
$_SESSION['design'] = 'defaut';
}
Ca devrait marcher.
Si tu veux vérifier qu'il n'y a ni variable de session 'design', ni de variable get du même nom, tu peux faire :
if ((!isset($_GET['design']) and (!isset($_SESSION['design']))
a plus -
j'ai trouvé ne solution alors je me réponds tout seul ;)
j'ai ajouté une condition
elseif ($_SESSION['design']=='2') {$_SESSION['design']='2';}
du coup la variable n'est pas réinitialisée... je continue -
J'y suis. Ca marche presque !
Je n'ai pas encore résolu le problème des liens (il faut que j'aie un lien du type <a href="x.php3?id_rubrique=x?design=x"> or ça n'est pas digéré, pour l'instant j'utilise juste <a href="x.php3?design=x">, ça fait sauter le contenu de la rubrique, mais au moins ça prend en compte la variable. Il doit y avoir un problème de syntaxe.
Mais surtout le problème c'est que la dernière condition
else {
$_session['design']=defaut;
}
efface systématiquement la valeur de "design" quand on circule dans les pages et qu'il n'y a plus rien à récupérer en GET. Il faudrait en faire une condition du type
elseif ($_GET['design']=='rien du tout')
{
$_SESSION['design']='design1';
}
Or je ne sais pas faire, tu as une idée ? Merci beaucoup pour ton aide et ton temps passé à me répondre ! Ca n'a pas de prix... -
Merci beaucoup pour ton aide ! :))
La fonction passe très bien, on avance. Ca m'a donné l'occasion de creuser la déclaration de fonction et les variables en php...
En revanche les liens ne marchent pas : une adresse comme
partage_rub.php3?id_rubrique=3
devient
partage_rub.php3?design=style2
quand on clique sur le style 2, du coup ça fait sauter tous les contenus des rubriques ; et puis surtout, le changement de design n'est pas pris en compte.
Est-ce qu'il pourrait par exemple y avoir un conflit entre php3 (spip) et php ? Peut-il y avoir plusieurs variables ?xxx=xxx dans une adresse ?... -
ModérateurC'est pas mon jour aujourd'hui :
<?php session_start(); if ($_GET['design']=='design1') { $_SESSION['design']='design1'; } elseif ($_GET['design']=='design2') { $_SESSION['design']='design2'; } else { $_SESSION['design']='defaut'; } ?>J'ai oublié les parenthèses.
J'éspère que ca va marcher cette fois ci.
a plus
EDIT : Ah oui !
et comme tes noms de design ne seront surement pas des chiffres, n'oublie pas de mettre des apostrophes autour du nom :
$_session['design']='1';
Je t'ai mis le bon code partout, tu n'as qu'a copier coller.
- 1
- 2