Thème Divi : créer des modèles (layouts) spécifiques pour des catégories

Thème Divi : créer des modèles (layouts) spécifiques pour des catégories

Avec le thème Divi, objet des articles de cette série , les pages de catégorie n’intègrent pas automatiquement les titres et descriptions de catégorie. J’ai exposé précédemment comment les intégrer automatiquement avec un modèle ‘category.php’. Mais il y a une autre solution, nettement plus pratique puisqu’elle intègre le générateur DIVI.

Cette solution vient de l’article « Personnaliser facilement votre page « Catégorie »« . Je l’ai appliquée comme telle. La seule différence de mon fichier category.php » est qu’il intègre aussi les modifications vues dans l’article Pages catégorie du thème Divi : ajouter titre et description.

<?php get_header(); ?>

<?php
// source https://www.tips02.fr/backstage/personnaliser-facilement-votre-page-categorie-customize-easily-you-category-page/

$cat = get_category( get_query_var( 'cat' ) );
$cat_slug = $cat->slug;
$the_cat_id = $cat->cat_ID;

$locale =  substr( get_locale(), 0, 2 );

switch ($locale) {
	case 'en':
		$my_cat = 'category';
		break;
	case 'it': case 'es':
		$my_cat = 'categoria';
		break;
	case 'de':
		$my_cat = 'kategorie';
		break;
	default:
		$my_cat = 'categorie';
}

$html = '';

	$args=array(
		'post_type' 		=> 'et_pb_layout',
		'post_name__in' 	=> array($my_cat . '-' . $cat_slug, $my_cat),
		'posts_per_page' 	=> 1,
		'orderby'			=> 'name',
		'order'				=> 'DESC',
	);
	$query = new WP_Query($args);
	if ($query->have_posts()) :
		//As I want to be sure that no category have been set (to avoid errors), I assure myself to "remove" it :).
		$html = str_replace('include_categories', 'unknown', $query->posts[0]->post_content);
		// Then I define it easily with the current category id :)...
		$html = str_replace('
Extension WordPress : méthodes pour le débogage

Extension WordPress : méthodes pour le débogage

Lorsqu’on crée une extension (ou un thème) WordPress, il est indispensable de prévoir des moyens de déboguer efficacement. Nous allons voir ici quelques méthodes applicables, telles que l’affichage du contenu de variables dans une page du tableau de bord WordPress, l’utilisation de debug.log de WordPress ou l’utilisation d’extensions WordPress telles que Debug Bar et Query Monitor.

Créer une extension WordPress – Partie 1

Créer une extension WordPress – Partie 1

A force de travailler sur WordPress, j’ai appris pas mal de choses. Pour continuer à m’améliorer, il est essentiel (pour moi au moins) de formaliser l’état de mes connaissances. J’entame donc une nouvelle série d’articles sur la création d’extensions (plugin) pour WordPress.

Dans ce premier article de la série , j’explique comment créer l’extension de base, la version « 0.1 » que j’améliorerai ensuite. Cette extension de base doit contenir les fichiers de base, les répertoires nécessaires, les éléments d’internationalisation, …

Manipuler des fichiers en PHP

Manipuler des fichiers en PHP

J'ai besoin de lire le contenu de fichiers créés par une application tierce. Il faut : lister les fichiers avec extension 'log' dans un répertoire ; pour chaque fichier, lire chaque ligne ; pour chaque ligne, transformer son contenu texte en un array de données ;...

; et_divi_post_format_content(); if ( ! in_array( $post_format, array( 'link', 'audio', 'quote' ) ) ) { if ( 'video' === $post_format && false !== ( $first_video = et_get_first_video() ) ) : printf( '<div class="et_main_video_container"> %1$s </div>', $first_video ); elseif ( ! in_array( $post_format, array( 'gallery' ) ) && 'on' === et_get_option( 'divi_thumbnails_index', 'on' ) && '' !== $thumb ) : ?> <a href="<?php the_permalink(); ?>"> <?php print_thumbnail( $thumb, $thumbnail["use_timthumb"], $titletext, $width, $height ); ?> </a> <?php elseif ( 'gallery' === $post_format ) : et_pb_gallery_images(); endif; } ?> <?php if ( ! in_array( $post_format, array( 'link', 'audio', 'quote' ) ) ) : ?> <?php if ( ! in_array( $post_format, array( 'link', 'audio' ) ) ) : ?> <h2 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endif; ?> <?php et_divi_post_meta(); if ( 'on' !== et_get_option( 'divi_blog_style', 'false' ) || ( is_search() && ( 'on' === get_post_meta( get_the_ID(), '_et_pb_use_builder', true ) ) ) ) { truncate_post( 270 ); } else { the_content(); } ?> <?php endif; ?> </article> <!-- .et_pb_post --> <?php endwhile; if ( function_exists( 'wp_pagenavi' ) ) wp_pagenavi(); else get_template_part( 'includes/navigation', 'index' ); else : get_template_part( 'includes/no-results', 'index' ); endif; endif; /* Categorie */ ?> <?php if ( $html == '' ) : ?> </div> <!-- #left-area --> <?php get_sidebar(); ?> </div> <!-- #content-area --> </div> <!-- .container --> <?php endif; ?> </div> <!-- #main-content --> <?php get_footer(); ?>

Le principe de fonctionnement

Maintenant je dispose de trois possibilités pour l’affichage et le contenu des pages de catégorie :

  1. option 1 : définir une esthétique et un contenu spécifique, pour un groupe de catégories ;
  2.  option 2 : définir une esthétique et un contenu spécifique à une catégorie donnée ;
  3. option 3 : affichage par défaut de WordPress, (avec ajout du titre de la catégorie et sa description si l’on a fait comme dans l’ article Pages catégorie du thème Divi : ajouter titre et description) .

Affichage défini pour un groupe de catégories

Cet affichage se fera si j’ai créé un modèle Divi intitulé « catégorie » (voir plus bas le chapitre « création de modèles de catégorie), et que la catégorie est cochée dans le paramètre « Inclure les catégories: » du module de blog inséré dans le modèle.

On n’a pas d’obligation de créer un tel modèle, on peut décider de définir des modèles spécifiques pour chaque catégorie ou décider de créer des modèles spécifiques pour certaines catégories et laisser l’affichage par défaut pour les autres.

Affichage spécifique à une catégorie donnée

Cet affichage se fera si j’ai créé un modèle Divi intitulé « catégorie identifiant de la catégorie » et que la catégorie a un identifiant « identifiant-de-la-categorie » (voir plus bas le chapitre « création de modèles de catégorie).

Affichage par défaut

Ce sera l’affichage défini par category.php et style.css du thème enfant. Il s’appliquera à toute catégorie qui ne dispose par d’un modèle spécifique (option 2) ou qui n’est pas explicitement définie dans le paramètre « Inclure les catégories: » du modèle générique (option 1). Par exemple, la page de catégorie suivante n’est définie ni par le modèle générique, ni par un modèle spécifique, elle s’affiche ainsi pour un internaute :

Affichage standard d'une page de catégorie

Affichage standard d’une page de catégorie

Création de modèles de catégorie

Création d’un modèle pour un groupe de catégories (l’option 1)

Il n’est pas obligatoire de créer ce modèle pour que l’option 2 puisse fonctionner.

Dans la bibliothèque Divi, je crée un modèle intitulé « catégorie » et j’y place au moins un module de blog. Dans les paramètres du module de blog, l’option « Inclure les catégories: » doit cocher les catégories pour lesquelles je veux que cette disposition s’applique.

Par exemple, mon modèle « catégorie » contient les modules suivants (j’explique le fonctionnement (optionnel) du module « code » plus bas dans ce long article) :

Contenu du modèle Divi pour un groupe de catégories

Contenu du modèle Divi pour un groupe de catégories

 

Dans le module Blog, j’ai défini le style en mode « grille » et les catégories suivantes sont cochées :

Liste des catégories à afficher avec le modèle pour un groupe de catégories

Si un internaute affiche la page de catégorie « réussir le changement » , il verra :

Affichage selon le modèle d'un groupe de catégories

Affichage selon le modèle d’un groupe de catégories

 

Dans le module blog, faites attention au nombre de post défini dans l’option « Nombre de postes: » (sic) : le nombre doit être inférieur ou égal à ce qui est défini dans le menu Divi >> Options du thème, onglet « général ». Dans le cas contraire la pagination de la page de catégorie ne fonctionnera pas.

 

Création d’un modèle pour une catégorie spécifique (l’option 2)

Dans ce cas, un modèle de la bibliothèque Divi a pour nom « catégorie X Y Z », dans lequel X Y Z correspond à l’identifiant de la catégorie. Par exemple si j’ai une catégorie dont l’identifiant est premier-deuxieme-troisieme, le modèle a pour titre « catégorie premier deuxième troisième ». J’ai placé « catégorie » au début du titre puis j’ai écrit l’identifiant en remplaçant les – par des espaces et en mettant des accents (si je veux, pour plus de lisibilité).

Dans le modèle spécifique « catégorie manager équipe » qui s’appliquera à l’affichage d’une catégorie dont l’identifiant est « manager-equipe », j’ai défini le modèle, avec une barre latérale :

Contenu du modèle Divi de catégorie spécifique

Contenu du modèle Divi de catégorie spécifique « catégorie manager équipe « 

Dans le paramétrage du module de blog, je n’ai coché aucune catégorie car ça ne sert à rien. Dans le style, j’ai défini le mode « plein écran » (liste).

La page de la catégorie « Manager son équipe » s’affiche selon le modèle « catégorie manager équipe » :

Affichage selon le modèle de catégorie spécifique "catégorie manager équipe "

Affichage selon le modèle de catégorie spécifique « catégorie manager équipe « 

Insérer automatiquement un titre et une description dans un modèle Divi

Je tiens absolument à ce que le titre de la catégorie s’affiche en haut de la page de catégorie, même lorsqu’un modèle est utilisé. Et dans certains cas, je souhaite que la description soit également présente.

J’ai créé un shortcode pour ça (cf article Thème Divi : intégrer un shortcode à un modèle). Voici son fonctionnement dans les modèles de page de catégorie que j’ai créé :

Si je place [[cat_display title= »yes » centrer= »no » description= »yes »]] dans le module « code » du modèle « catégorie » défini plus haut, j’obtiens une nouvelle mise en page. Maintenant la page de la catégorie « PME : adopter une stratégie durable » contient un titre et une description puis applique les règles du modèle d’un groupe de catégories :

Affichage selon le modèle d'un groupe de catégories, avec titre et description automatique

Affichage selon le modèle d’un groupe de catégories, avec titre et description automatique

 

Sur un autre site, il y a un modèle de catégorie qui contient un « Blurb ».

Un modèle avec le module "Code" juste avant le module 'Blurb"

Un modèle avec le module « Code » juste avant le module ‘Blurb »

Ce modèle s’applique à la catégorie dont l’identifiant est « devenir-une-star-de-son-business-categorie ».

Le titre défini dans le module « Code » juste avant le module « Blurb » s’intègre automatiquement dans le « Blurb » (je ne sais pas pourquoi…, mais c’est bien !). Comme les Blurb sont le plus souvent centrés, j’ai défini l’option centrer dans le shortcode. Ainsi pour cette catégorie spécifique, le titre (« devenir une star de son business »)   va automatiquement s’afficher dans le « Blurb » et sera centré comme le contenu du Blurb :

Divi : affichage selon un modèle spécifique, avec titre intégré à un "blurb"

Affichage selon un modèle spécifique, avec titre intégré à un « blurb »

Et maintenant

Je pense que j’en ai terminé avec les ajustements liés aux pages de catégorie dans cette série !

Thème Divi : intégrer un shortcode à un modèle

Thème Divi : intégrer un shortcode à un modèle

Avec Divi, il est possible d’utiliser le module « Code » pour insérer des shortcodes dans un modèle. Ici, j’ai créé un shortcode pour pouvoir afficher automatiquement le titre et la description d’une catégorie.

Créer un thème enfant

On ne fait évidemment aucune modification du thème Divi puisqu’elle serait effacée en cas de mise à jour. On crée donc un thème enfant, comme indiqué dans « Créer un thème enfant pour Divi (WordPress) ».

Ce que je veux obtenir

Je veux pouvoir afficher automatiquement le titre d’une catégorie et sa description dans des modèles de catégorie.

Je veux que [[cat_display title= »yes » centrer= »yes » description= »yes »]] définisse que :

  • oui, il faut aller chercher le nom de la catégorie et l’afficher ;
  • oui, il faut centrer le titre sur la page
  • oui, il faut aller chercher la description de la catégorie et l’afficher.

Le code

Dans functions.php du thème enfant, j’ai ajouté le code suivant :

/***** My shortcode with parameters for category title and description ***********/
// 	[cat_display title="yes" centrer="yes" description="yes"] will display both category and description
// source https://developer.wordpress.org/plugins/shortcodes/shortcodes-with-parameters/

function cdc_cat_title_desc_shortcode( $atts = [], $content = null ) {
    // normalize attribute keys, lowercase
    $atts = array_change_key_case((array)$atts, CASE_LOWER);
 
    // override default attributes with user attributes
    $wporg_atts = shortcode_atts( [
        'title' 		=> 'yes',
	'centrer'		=> 'yes',
	'description' 	=> 'yes',
    ], $atts );
 
	// start output
    $o = '';
 
    // start box
    $o .= '<header class="archive-header">';
 
    // title
	if ( "yes" == $wporg_atts['title'] ) {
			
			if ( "yes" == $wporg_atts['centrer'] ) {
				$o .= '<h1 class="entry-title main_title" style="text-align:center;">' . single_cat_title( '', false ) . "</h1>";
			} else {
				$o .= '<h1 class="entry-title main_title">' . single_cat_title( '', false ) . "</h1>";
			}
	} else {
		$o .="";
	}

	if ( "yes" == $wporg_atts['description'] ) {
		    $o .= '<div class="archive-meta">' . category_description() . "</div>";
	} else {
		$o .="";
	}
 
    // end box
    $o .= '</header>';
 
    // return output
    return $o;
	

}
 
add_shortcode('cat_display', 'cdc_cat_title_desc_shortcode');

La dernière ligne,add_shortcode(‘cat_display’, ‘cdc_cat_title_desc_shortcode’); , définit que lorsque le shortcode [[cat_display]] est repéré, il faut exécuter la fonction cdc_cat_title_desc_shortcode.

Dans cette fonction,

  • Je précise que je me suis inspirée de cette page pour créer la fonction : Shortcodes with Parameters ;
  • $atts = array_change_key_case((array)$atts, CASE_LOWER);  évite les anomalies liées à des « yes » contenant des majuscules ;
  • Les lignes $wporg_atts = shortcode_atts( [   … ], $atts );  indiquent les différents paramètres applicables et leurs valeurs par défaut (yes) ;
  • $o contient le html qui devra être inséré dans le modèle. Ici il prendra une valeur différente selon la valeur des paramètres.

Maintenant, je peux utiliser ce shortcode comme je le souhaite, et en particulier dans un module « code » de Divi.

L’utilisation de ce shortcode

J’explique comment l’utiliser dans l’article sur les modèles Divi pour l’affichage de pages de catégorie : Thème Divi : créer des modèles (layouts) spécifiques pour des catégories.

 

 

 

Que faire si un modèle (ou un module) Divi ne se charge pas ?

Que faire si un modèle (ou un module) Divi ne se charge pas ?

Il arrive que le modèle ou qu’un module Divi ne se charge pas. On est alors bloqué sur une page avec un symbole indiquant qu’elle se charge. Dans ce cas :

Aller dans le menu « tableau de bord » de WordPress puis cliquer tout en haut sur le menu « supprimer le cache »

WordPress : supprimer le cache

WordPress : supprimer le cache

Si même ça ne fonctionne pas, aller dans Apparence >> Thèmes, activer le thème parent (Divi), vérifier que le modèle se charge puis retourner dans Apparence >> Thèmes, activer le thème enfant de nouveau.

Et maintenant, les modèles ou modules se chargent de nouveau.

Si ça ne suffit pas, suivre les instructions de l’article « How to fix Divi Builder modules not opening/loading or Timeout Issue« .

Un éclairage LED mixte

Un éclairage LED mixte

Dans l’article prototype d’éclairage LED mixte j’ai expliqué la construction à titre d’essai d’une lampe mêlant un ruban LED pour diffuser un éclairage doux et deux spots à LED également pour éclairer sur une surface restreinte et servir de liseuses. Ici je présente le montage de la version définitive.

Ma liste de courses

J’ai réutilisé tout ce que j’avais acheté pour réaliser le prototype. En plus, j’ai acheté :

  • une planche de pin de 200 x 40 mm, épaisseur 18 mm (7.95 € chez Leroy Merlin) ;
  • 6 charnières à visser 77×33 mm (ici chez Leroy Merlin, à 6.80€ le lot) ;
  • des vis à double filets, diamètre 6mm, longueur 60 mm (ici chez Castorama, à 3.75 € le sachet de 10) et écrous et rondelles de diamètre 6 correspondantes.

En plus j’ai utilisé un tube plastique que j’avais (récupération d’une ancienne lampe à led qui était tombée en panne), deux coudes males 15×21, des vis diverses et un peu de tissu, ainsi que des chevilles de diamètre 8 pour fixer la lampe.

L’adaptation du circuit électrique de la pièce

Dans la pièce (une chambre) où va cette lampe, il y avait une arrivée électrique au mur actionnée par deux interrupteurs va et vient. Pour que le nouvel éclairage fonctionne, il fallait que l’arrivée électrique contienne :

  • un + (déjà présent) ;
  • un – actionné par le va-et-vient (déjà présent) ;
  • un – « général », alimenté en permanence, à installer.

Voici le schéma électrique de la nouvelle installation :

Schéma électrique de l'alimentation murale

Schéma électrique de l’alimentation murale, avec va et vient

Et l’essai réalisé avec deux ampoules, connectées toutes deux au +, avec l’une connecté au – général et l’autre au – des va et vients indique que tout va bien :

Essai de l'alimentation murale

Le schéma électrique de la lampe

La lampe contient :

  • un ruban led, alimenté par un transformateur, lui même alimenté par le – relié au va et vient et le +.
  • deux spots, chacun actionné par un interrupteur spécifique, les deux interrupteurs étant reliés au + et au – général.

Voici le schéma électrique, et des photos des différents branchements :

Schéma électrique du coffret d'éclairage

Schéma électrique du coffret d’éclairage

 

câblage du transformateur

câblage du transformateur (remarquer quel fil est noir et blanc)

Câblage des interrupteurs des spots

Câblage des interrupteurs des spots

Le câblage terminé

Le câblage terminé, il ne reste plus qu’à fixer les câbles aux planches

Branchement du ruban led

Branchement du ruban led

Le montage du coffret d’éclairage

Schéma de montage du coffret

Schéma de montage du coffret

 

Les planches (4) et (5) sont solidaires et sont fixées à la planche (3) par des charnières. Ainsi le coffret s’ouvre pour pouvoir être fixé au mur et relié aux arrivées électriques.

Les deux joues (6) sont vissées dans les pièces (1), (2) et (3). La pièce (2) est vissée sur (1).

Dans ma planche de pin de 2 m par 40 cm, j’ai réalisé les découpes suivantes :

  • découpe à 1564 mm de long de la tablette ;
  • Dans la planche de 1564 x 400, j’ai découpé les pièces (1) à (5) ;
  • Dans ce qui restait, j’ai découpé les deux joues (6).

Les dimensions des 7 planches découpées sont :

  • (1) 1564 x 48 mm (ce qui reste des 400 mm après avoir découpé (2) à (5)
  • (2) 1564 x  40 mm (on doit avoir (2)+(5) = 104, je laisse un jeu de 1 mm)
  • (3) 1564 x 105 mm
  • (4) 1564 x 142 mm (on doit avoir (4) + 2 épaisseurs – 18 mm) = 178 mm)
  • (5) 1564 x 65 mm
  • (6) 2 morceaux de 178 x 105 mm

Dans les faits, si vous regardez bien mes photos, vous verrez que mes découpes n’étaient pas très justes, et des perçages défigurent un peu,  c’est pourquoi j’ai habillé la lampe d’un tissu qui cache les défauts…

La fixation au mur

J’ai percé le mur en diamètre 8 mm pour y insérer des chevilles. J’ai ensuite placé les vis à double filet dans ces chevilles (en mettant temporairement deux écrous serrés l’un contre l’autre pour pouvoir utiliser une clé) de telle sorte que le filet « bois » soit dans la cheville et le filet « métal » sorte du mur.

La planche (1) contient 4 trous de diamètre 7 mm dans lequel les vis de diamètre 6 fixées au mur peuvent s’insérer. Il suffit ensuite de placer une rondelle et un écrou de 6 mm sur chaque vis pour fixer le coffre d’éclairage.

Ensuite, il suffit de connecter les 3 fils d’alimentation du mur dans les dominos prévus.

L'éclairage fini

 Et maintenant ?

Je suis contente d’avoir réalisé ce coffret, même si mes découpes sont imparfaites. J’ai appris de l’électricité, je sais maintenant utiliser un ruban led et j’ai fait un éclairage très fonctionnel pour un coût modéré.

Menus WordPress : comment faire un lien vers un site externe correctement ?

Menus WordPress : comment faire un lien vers un site externe correctement ?

On peut définir des liens personnalisés dans les menus WordPress. Mais le visiteur qui clique sur l’élement de menu se trouve brutalement dans un autre site, sans en avoir été informé. Nous allons donc voir comment faire pour que le lien s’ouvre dans un autre onglet et que l’utilisateur en soit averti (attributs de titre) ?

Sauter d'un site à l'autre via le menu WordPress

WebDonut / Pixabay

Afin d’éviter que l’internaute se retrouve subitement dans un autre site, je me propose de régler les liens vers des url externes de telle sorte que :

  1. l’internaute ouvre un autre onglet lorsqu’il clique sur le menu (le site sur lequel il était reste ouvert dans l’onglet initial).
  2. L’internaute voit apparaître une information lui indiquant que le lien va s’ouvrir dans un autre onglet.

Les options de menu WordPress par défaut

Par défaut, voici ce que l’on voit lorsque l’on est administrateur dans un élément de menu WordPress :

L'affichage par défaut pour les réglages de menu WordPress

Et l’internaute qui place sa souris sur un lien externe (ici « Ma chaîne Vidéos ») n’a aucune idée qu’il va être envoyé dans un site externe.

L'internaute qui place sa souris sur cet élément de menu ne sait pas qu'il sera dirigé vers un site externe

Activer d’autres options

Dans la page de réglage des menus de WordPress (Apparence >> Menus), il y a un tout petit bouton « options de l’écran » tout en haut à droite. Si on clique dessus, on voit apparaître différentes options :

Réglages de menu WordPress : les options d'affichage

Je clique sur les cases à cocher « cible du lien » et « Description »

Maintenant, je peux cocher « ouvrir le lien dans un nouvel onglet » et « attribut de titre » (qui s’affichera lorsque l’internaute place sa souris sur le lien).

Réglages de menu WordPress avec d'autres options d'affichage

Après sauvegarde du menu, l’internaute voit apparaître un « popup » qui l’informe qu’il sera envoyé vers un nouvel onglet et s’il clique sur le lien, un nouvel onglet s’ouvre dans son navigateur.

Menu avec popup vu par l'internaute

Une icone pour être encore plus explicite

Ce serait encore plus clair si le lien du menu affichait en permanence l’information que le lien est externe. On peut le faire en ajoutant une icone au titre de l’élément de menu :

Réglages de menu WordPress : un titre de menu avec une icone Dashicons

j’ai ajouté « <span class= »dashicons dashicons-external »></span>  » au titre.

Et maintenant l’internaute voit :

Menu avec icone et popup vu par l'internaute

Ajuster le style de l’icone et du popup

J’ai donné une classe CSS à l’élément de menu « lien-ext » (on peut le faire si on a coché « classe CSS » dans les options d’affichage de la page de réglage du menu.

Réglages de menu WordPress : un titre de menu avec classe CSS spécifique

Réglages de menu WordPress : un titre de menu avec classe CSS spécifique

On peut modifier le fichier style.css (de notre thème enfant) et définir un style différent pour l’icone du menu et le popup :

/* --- Menus avec classe CSS "lien-ext" : icone et popup --- */
.lien-ext .dashicons.dashicons-external {
	vertical-align: bottom !important;
}

.lien-ext a[title]:hover::after {
	content: attr(title);
	position: absolute;
	left: 0;
	top: -40%;
	white-space: nowrap;
	padding: 0.5rem;
	border: none;
	background-color: white;
	font-style: italic;
	font-weight: 400;
	font-size: 90%;
	text-align: right;
}

Maintenant l’internaute voit l’icone bien alignée par rapport au titre du menu et lorsqu’il pose sa souris sur le titre, il voit (deux…) popup l’informant qu’il sera envoyé dans un autre onglet.

Menu avec popup et style CSS modifié

Et maintenant ?

A vous de jouer !