Feuilles de style variables

Résolu/Fermé
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006 - 21 oct. 2006 à 13:58
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 - 26 oct. 2006 à 18:10
Bonjour, je voudrais faire en sorte que les utilisateurs de mon site aient le choix entre deux interfaces graphiques. Pour cela, je dois certes avoir deux feuilles de styles différentes. Mais comment faire pour qu'en un clic, la feuille de style attachée à la page en cours change ? Je suppose que c'est très facile en php, mais je ne m'y connais pas assez bien... merci d'avance !

EDIT 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)
A voir également:

26 réponses

Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
21 oct. 2006 à 14:58
Bonjour.

C'est très facile en php.
Il y a peut être unmoyen de rajouter automatiquement "?style=xxx" automatiquement aux liens mais je en le connais pas.

Par contre, ca peut se faire avec les sessions.

Quand on choisit un design, il suffit de créer une variable de session qui contiendra le nom de la feuille de style.

Sur chaque page, tu inclus un lien vers les différent desgin :
<a href="?design=1">Design 1</a><a href="?design=2">Design 2</a>
etc...

A la place des chiffres met les noms de tes fichiers sans l'extension .css

Ensuite, sur chaque page, tu regardes si il y a une variable apellée design et si oui tu crées une variable de session avec la valeur correspondante.
Ce qui donnera :
<?php
//a mettre AVANT tout code html !!
session_start
//si on a choisi le design 1
if $_GET['design']==1
{
 $_SESSION['design']=1;
}
//si c'est le 2
elseif $_GET['design']==2
{
 $_SESSION['design']=2;
}
//on fait ca pour chaque design

//si aucun design n'est choisi,
//on crée une variable de session avec la valeur par défaut.
//il ne faudra pas oublier de vérifier l'existence de cette variable.
else {
$_session['design']=defaut;
}

Ensuite, dans le code html, tu fais ceci :
<link rel="stylesheet" media="all" href="/css/<?php echo $_SESSION['design'];?>.css" />


a plus
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
21 oct. 2006 à 18:18
Ca a l'air magique, et c'est exactement ce qu'il me faut... Sauf que le code n'est pas bien digéré, apparemment : après avoir procédé aux modifications, je me retrouve avec l'erreur :

Parse error: parse error, unexpected T_IF in /homepages/5/d161669477/htdocs/inc-public.php3(53) : eval()'d code on line 3

...il doit y avoir une solution simple... Merci beaucoup en tout cas :-)

EDIT j'ai placé le code <php> avant la balise <html> de la page
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
21 oct. 2006 à 19:47
unexpected T_IF
Ca veut dire qu'il y a une condition qui n'y a rien a y faire.
Tu as sans doute mal placé une accolade.

Donnes nous ton code, c'est beaucoup plus facile.

a plus
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
21 oct. 2006 à 20:28
Ben j'ai remis exactement ton code magique :

<?php
session_start
if $_GET['design']==1
{
$_SESSION['design']=1;
}
elseif $_GET['design']==2
{
$_SESSION['design']=2;
}
else {
$_session['design']=defaut;
}

et après ça enchaîne sur <html><head> etc...

J'ai essayé avec une balise php> pour fermer mais ça ne marche pas ?..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
21 oct. 2006 à 20:43
Ah !
Je vois !!

C'est parce que j'ai oublié les parenthèse.
Il faut utiliser session_start();

Voila

Pour retenir, quand on utilise une fonction, il y a toujours des parenthèses.

désolé pour cette erreur.

a plus
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
22 oct. 2006 à 16:09
Oui mais non... Avec le code

<?php
session_start();
if $_GET['design']==1
{
$_SESSION['design']=1;
}
elseif $_GET['design']==2
{
$_SESSION['design']=2;
}
else {
$_session['design']=defaut;
}

Avant ma première balise <html>, en haut de page, j'ai toujours une erreur

Parse error: parse error, unexpected T_VARIABLE, expecting '(' in /homepages/5/d161669477/htdocs/inc-public.php3(53) : eval()'d code on line 3

...il doit encore y avoir une faute de syntaxe. Sinon, je suis sûr que ça devrait marcher impec.
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
22 oct. 2006 à 18:41
C'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.
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
22 oct. 2006 à 20:40
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 ?...
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
23 oct. 2006 à 11:36
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...
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
23 oct. 2006 à 11:41
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
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
23 oct. 2006 à 20:41
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 ?...
oui.
Si tu veux plusieurs variables get, il faut mettre une esperluette &
<a href="?design=flash&amp;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
0
xbb Messages postés 49 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 10 mai 2007 1
24 oct. 2006 à 12:55
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)
0
xbb Messages postés 49 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 10 mai 2007 1
24 oct. 2006 à 13:10
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!!
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
24 oct. 2006 à 13:45
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';} ?>
0
xbb Messages postés 49 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 10 mai 2007 1
24 oct. 2006 à 13:49
A moi de te poser une question :
Quelle technique utilises-tu pour arrondir les coins dans ton footer?
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
24 oct. 2006 à 13:54
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 ?;)
0
xbb Messages postés 49 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 10 mai 2007 1
24 oct. 2006 à 14:06
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)
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
24 oct. 2006 à 14:19
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 ?)
0
xbb Messages postés 49 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 10 mai 2007 1
24 oct. 2006 à 15:15
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)
0
katadrapata Messages postés 13 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
24 oct. 2006 à 16:33
Incroyable... Je ne pensais pas qu'on pouvait aller aussi loin avec les css
0