Sélecteur CSS simple - Proposer différents styles

Mis à jour le mercredi 30 octobre 2013
  • 2 heures
  • Facile

Dans ce tutoriel, je vais vous montrer comment utiliser plusieurs feuilles de style CSS et proposer à vos visiteurs d'en choisir une... Ainsi, chaque visiteur pourra adopter votre site en bleu / blanc / rouge, en noir / blanc, etc.
Attention : ce tutoriel vous explique comment faire quand vous avez une feuille de style CSS pour votre site... À vous de l'adapter si vous en avez plusieurs.

Pré-requis :

  • cours de HTML (formulaire, notamment) ;

  • cours de PHP (formulaire et structures simples) ;

  • utilisation des cookies (cf. cours de M@teo : ici).

Dans les deux premières parties, nous verrons comment faire simplement ce choix d'une feuille de style CSS.
Dans la troisième partie, je ferai une petite analyse de mon programme : je m'efforcerai de vous expliquer à nouveau comment fonctionne cette procédure.

Programme des réjouissances

Premier moment de réflexion

Il nous faut donc... :euh:

  • deux feuilles de style CSS. Je supposerai que vous les avez déjà créées. Pour ce tutoriel, je les appellerai design_orange.css et design_bleu.css.

  • un formulaire pour que l'utilisateur puisse choisir son design.

  • un petit script pour gérer la réponse du formulaire.

  • un système pour garder en mémoire le choix de l'utilisateur : le cookie semble être ce qu'il y a de mieux.

N'ayez pas peur, chaque script fait moins de 20 lignes. o_O

Les différentes parties du programme

Les feuilles de style CSS

Le principe est donc simple : vous gardez la même page HTML et vous possédez deux feuilles de style CSS différentes. C'est-à-dire que vous avez votre partie HTML (je donne un exemple très basique pour ceux qui ne sauraient plus ce qu'est du HTML :p ) :

<div id="debut">
 
     <h1>Mon super site</h1>
     <p>Grâce à <span class="nom">M@teo</span> et son site <a href="http://www.siteduzero.com">Le Site du Zér0</a>, j'ai enfin pu créer mon premier site !
     </p>
 
</div>

Nous avons aussi nos deux feuilles de style CSS (je vous en donne deux extraits issus de fichiers différents) :

/*design_bleu.css*/
 
#debut
{
     position: absolute;
     left: 5px;
}
h1
{
     color: black;
}
/*design_orange.css*/
 
#debut
{
     position: absolute;
     right: 25px;
}
h1
{
     color: red;
}

Simple, non ? :p
On a bien une même page avec différents codes de style... :)

Le formulaire

Occupons-nous maintenant du formulaire pour que l'utilisateur puisse choisir son style. Nous allons d'abord voir comment le formulaire fonctionne en renvoyant toujours sur la même page, puis ensuite en renvoyant sur la page courante.

Que nous faut-il, déjà ?

Allez... réfléchissez un peu (oui, je suis sadique !). :diable:

Première solution

Le formulaire doit proposer le choix des designs et envoyer le résultat. Après, on récupèrera ce résultat et on en fera quelque chose.
J'espère que vous n'avez pas imaginé des choses trop compliquées ! :p Allez, regardons comment on doit faire et commentons.

<form method="post" action="site.php?choix=home">
<p>
     <label>Choix du design :<br/>
          <select name="choixdesign" onchange="this.form.submit();"><!--On envoie dès que la personne sélectionne... pas de bouton-->
               <option value="design_orange.css" <?PHP ChoixDuSelected($design,"design_orange.css"); ?> >Orange et gris</option>
               <option value="design_bleu.css" <?PHP ChoixDuSelected($design,"design_officiel.css"); ?> >Bleu et noir</option>
          </select>
     </label>
</p>
</form>
<?PHP
function ChoixDuSelected($element1,$element2)
        {
        if($element1==$element2)
                {
                echo 'selected="selected"' ;
                }
        }
?>

Comme vous avez pu le remarquer, je n'ai pas mis de bouton mais un onchange="this.form.submit();", qui permet d'envoyer le résultat dès qu'une option a été sélectionnée. C'est très pratique pour ce petit formulaire car, ainsi, il est plus discret. :-°
Tout simplement, l'utilisateur choisit son design et on envoie par le formulaire le choix qui a été fait... Remarquez que j'ai mis dans value les noms des feuilles de style. Ça fonctionne très bien, je n'ai jamais eu de problème avec. :)

On a créé une petite fonction en PHP, nommée ChoixDuSelected, qui permet d'ajouter un attribut à notre liste d'options. Ainsi, le design courant sera le choix par défaut de la liste d'options. Le fonctionnement est simple : on compare la valeur de la variable contenant notre choix (remarquez que CETTE variable sera utilisée plus tard) à la valeur de l'attribut value du formulaire. Si ces deux éléments sont égaux, alors il s'agit du design choisi.
En effet, avec notre élément en JavaScript, le formulaire n'est validé que lorsqu'on choisit une option différente de celle affichée lorsque la liste n'est pas déroulée (le choix par défaut). Imaginez qu'il n'y ait que deux choix dans la liste, et que vous aviez choisi la deuxième. Sans l'attribut placé, vous êtes sur le premier choix par défaut. Pour changer de design, il vous faut donc en sélectionner un autre. Or, il faut changer : le premier est sélectionné par défaut et vous êtes sur le deuxième... Résultat : vous êtes coincé et ne pouvez pas changer de design.
En conclusion : vous devez utiliser cette fonction.

Deuxième solution

Comme me l'a demandé un zéro, il faudrait que le formulaire renvoie sur la page courante (c'est-à-dire celle que l'on visionne quand on veut changer de style). En fait, la réponse n'est pas si simple, car cela dépend de la façon dont vous récupérez vos pages. Je vais vous indiquer comment je fais, et je vous donnerai ma solution.

Pour commencer, il faut se souvenir comment envoyer des variables dans les adresses, c'est-à-dire avec $_GET['page']. Vous pouvez revoir ça sur les cours PHP de M@teo21.
Mon code est simple. Je n'ai qu'une page (site.php) et avec l'envoi de variables et des include, j'y inclus mes morceaux de pages. Cela signifie que le formulaire ne doit pas renvoyer sur site.php, mais sur http://www.monsite.com/site.php?page1=27&page2=07.
Voici alors la solution que j'ai adoptée pour écrire la première ligne du formulaire, c'est-à-dire à la place de <form method="post" action="site.php?choix=home"> :

<?PHP
if( isset($_GET['page1']) )
     {
     $page1=$_GET['page1'];
     }
 
if( isset($_GET['page2']) )
     {
     $page2=$_GET['page2'];
     }
 
echo '<form method="post" action="site.php?';
        if( $page1 != "" )
                {
                echo '&page1='.$choix;
                }
        if( $page2 != "" )
                {
                echo '&page2='.$choix2;
                }
echo '">';
?>

Le code est très simple, je vous laisse donc essayer de le comprendre. Au début, on récupère les variables de la barre d'adresse dans des variables simples, SI elles existent. On ne fait ensuite que récupérer l'adresse courante et la mettre dans le formulaire du design pour que ce formulaire renvoie sur la page où on se trouve actuellement. Mais n'oubliez pas alors que le traitement du formulaire doit toujours être présent.

Ce système fonctionne lorsque vous changez de page en utilisant les variables dans l'adresse. Personnellement, cela marche parfaitement sur le site dont je vous donnerai l'adresse plus tard. Bien sûr, pour que cela fonctionne, mettez bien toutes les possibilités. Si vous en oubliez une, il y aura des pages où cela ne marchera pas.

Récupérer les données du formulaire

Que doit faire notre script en PHP ?

Il doit récupérer le résultat de notre formulaire et enregistrer dans une variable le choix effectué par l'utilisateur. Mais n'oubliez pas qu'un visiteur qui n'a rien choisi (première visite, par exemple) doit tout de même avoir un style... :p Il faut donc un design par défaut.

Problème : lorsque l'utilisateur aura choisi son design, il va falloir garder en mémoire son choix, sans quoi au premier changement de page, on reviendra au design par défaut. :euh:
Je vous propose donc l'utilisation d'un cookie. C'est à cause de ce cookie qu'il faut placer le code en début de page !

<?PHP
$differents_designs=array("design_orange.css","design_bleu.css");

if( isset( $_COOKIE['design'] ) )
        {
        $design=$_COOKIE['design'];
	
	if( !(in_array($design,$differents_designs)) )//si le cookie indique un design inexistant
		{    
                $design="design_orange.css";
                }
        }
else
        {
        $design="design_orange.css";
        }
        
if( isset ( $_POST['choixdesign'] ) )
        {
        //On enregistre dans une variable pour le choix du design
        $design=$_POST['choixdesign'];
        
                if( !(in_array($design,$differents_designs)) )
		     {    
                     $design="design_orange.css";
                     }

        //On met dans un cookie d'une durée de vie d'un an
        $timestamp_expire=time()+365*24*60;
        setcookie('design',$design,$timestamp_expire);
 
        }
?>

Et voilà. :)

Que se passe-t-il dans ce code ?

Premièrement

On regarde s'il existe un cookie de notre site contenant les données liées au design. On rappelle que la fonction isset(X) correspond à « X existe »... Mais ça, vous devez le savoir si vous avez suivi les cours de PHP. ;)

Si ce cookie existe : on enregistre la donnée dans la variable $design. On vérifie que ce design existe (on aura créé un tableau contenant les différents designs comme vous le voyez) ; s'il n'existe pas, c'est soit une erreur de votre part, soit une tentative de piratage... :euh: On utilise alors le design par défaut. Si le design est dans le tableau, alors tout va bien et on continue. :D

Si ce cookie n'existe pas : on enregistre dans la variable $design le choix par défaut... Attention : le choix par défaut se fait ici.

Ainsi, lorsque l'utilisateur navigue de page en page, le cookie contiendra l'information liée au design.

Deuxièmement

L'utilisateur peut décider de changer de design. On regarde si des informations provenant du formulaire sont présentes.
if( isset ( $_POST['choixdesign'] ) )

Si des informations arrivent : on enregistre dans la variable $design le choix qui a été fait... On rappelle qu'il s'agira ici de design_orange.css ou de design_bleu.css. De plus, pour garder ce choix en mémoire, on l'enregistre dans un cookie. L'idée est simple (surtout si vous avez suivi les cours de PHP sur les cookies :p ) : on indique un temps d'expiration et on enregistre dans le cookie le choix du design. C'est ce cookie qui sera lu dans la première partie du code PHP.

Et avec tout ça ?

Avec tout ça, il nous faut donc terminer en expliquant au navigateur quel est le style choisi...
Voyons comment nous allons nous en occuper. Regardons d'abord un code normal pour l'appel de la feuille de style CSS :

<head>
     <title>Bienvenue sur le site de la danse des canards</title>
     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
     <link rel="stylesheet" media="screen" type="text/css" title="Design" href="design_orange.css" />
</head>

Il nous faut donc modifier le code href="design_orange.css" et mettre celui qui nous intéresse... Rien de plus simple, puisque nous avons enregistré dans la variable $design le nom du fichier CSS qui nous intéresse et que ce code a été placé en amont de ce code HTML (regardez, j'ai laissé l'ouverture de la balise HTML) !
Il nous faut donc changer la partie concernée en :

<link rel="stylesheet" media="screen" type="text/css" title="Design" href=<?PHP echo "\"$design\""; ?> />

Et voilà ! L'appel de votre feuille de style CSS se fera donc par ce simple echo dans la balise <link>. :p

Simple, isn't it ? :lol:

Une petite analyse des résultats

Si un nouvel utilisateur arrive...

Il n'a pas de cookie contenant des informations sur le choix du design, il tombe donc sur le design par défaut (ici, design_orange.css).
Puisqu'il n'a pas non plus soumis le formulaire, la deuxième partie du script PHP ne fera rien.

Cet utilisateur change de design...

Dans le petit formulaire créé, l'utilisateur va changer de design en sélectionnant le noir et bleu. Une fois que ce choix est fait (on rappelle qu'il n'y a pas de bouton et que seule la sélection valide le formulaire), le formulaire renvoie donc au code PHP.

Mais... que va-t-il se passer ? :euh:

N'ayant auparavant jamais demandé de changement de design, il n'a pas de cookie enregistré : la première partie du code PHP ne fera donc rien. La deuxième partie va par contre prendre en compte son choix et l'enregistrer dans un cookie. Et donc faire appel à l'autre design dans la balise <link>.

L'utilisateur navigue sur le site...

À chaque changement de page, on peut lire le cookie créé lors du changement de design et appliquer le design qui a été choisi à la dernière visite. En fait, à chaque changement de page (sans utiliser le formulaire), on lit l'information du cookie et on la réutilise.

L'utilisateur rechange de design...

La différence avec tout à l'heure ? Il n'y avait pas de cookie... o_O
Ici, comme pour une navigation simple, on enregistre dans la variable $design l'information contenue dans le cookie...
Mais vu qu'on fait appel au formulaire, la demande de changement de design va écraser la donnée déjà présente dans le cookie.

Bourrin, vous dites ?
Non, pas du tout. ^^

Deux solutions.

  • Il n'aura alors pas le choix, et devra utiliser le design par défaut. Mais vous pouvez toujours glisser dans le formulaire une petite commande pour vérifier l'utilisation de cookies : si l'utilisateur demande à changer de design, vous enregistrez son choix dans la variable, vous vérifiez qu'il accepte les cookies. Si oui, vous faites ce que je vous ai proposé plus haut. Si non, vous placez un message (une simple ligne quelque part sur le site, un pop-up, etc.) pour lui indiquer qu'il doit accepter les cookies pour qu'à son prochain changement de page, il ne revienne pas sur le design par défaut... :-°

  • Utiliser un système de sessions (cf. le cours de M@teo ici). Un défaut : lorsque l'utilisateur reviendra plus tard sur le site, il tombera sur le choix par défaut.

Mais bon, une bonne partie des utilisateurs emploie les cookies.

Eh voilà... Maintenant, vos visiteurs pourront se ravir du choix qui leur est laissé. :p

Bien sûr, vous pouvez créer un troisième style, un quatrième, etc. :p C'est exactement le même principe.

Si vous avez des questions, vous pouvez me joindre par MP ou demander de l'aide sur le forum. J'espère ne pas avoir fait d'erreurs, mais j'utilise moi-même ce système sur le site que j'ai programmé (grâce aux cours du SdZ :magicien: ).

En espérant que ça vous plaise,
Bien à vous,
Glius. :)

Je tiens à remercier ptipilou, zCorrecteur, pour tout son travail sur ce tutoriel : sa correction claire, ses conseils très utiles et sa bonne humeur ! :D

  • Thématiques du cours : PHP Web

déroulement d'un cours

  • 1

    Dès aujourd'hui, vous avez accès au contenu pédagogique et aux exercices du cours.

  • 2

    Vous progressez dans le cours semaine par semaine. Une partie du cours correspond à une semaine de travail de votre part.

  • !

    Les exercices doivent être réalisés en une semaine. La date limite vous sera annoncée au démarrage de chaque nouvelle partie. Les exercices sont indispensables pour obtenir votre certification.

  • 3

    À l'issue du cours, vous recevrez vos résultats par e-mail. Votre certificat de réussite vous sera également transmis si vous êtes membre Premium et que vous avez au moins 70% de bonnes réponses.

L'auteur

Exemple de certificat de réussite
Exemple de certificat de réussite