Je demandais hier sur #spip si quelqu’un connaissait un standard pour signaler l’URL canonique d’une page Web. S’koi ? Si on est en train de lire une page sur un site, on peut l’avoir abordée par plusieurs adresses :
Tout ça, ce sont des URLs valables, qui affichent bien le même article. Mais si je veux mettre des gens (ou des robots) d’accord sur ce qu’est la « vraie » adresse de cet article, il faut que je l’annonce, d’une manière ou d’une autre.
Cette problématique concerne au premier chef les moteurs de recherche et d’indexation (mais pas seulement). Or il se trouve que pas plus tard que la semaine dernière les trois poids lourds Google, Yahoo et Live (Microsoft) annonçaient que leurs algorithmes allaient accepter qu’on leur parle de l’URL canonique d’une page.
C’est bien fait, et c’est simple à mettre en œuvre. En gros, pour toute page HTML qui peut avoir plusieurs adresses, on va indiquer laquelle est la principale, en insérant dans son <head>...</head> une balise :
Les algorithmes qui le souhaitent sauront donc que la page http://www.monsite.tld/article12 qui mentionne ce lien doit en fait être considérée comme étant à l’adresse canonique http://www.monsite.tld/URL-canonique. Et feront leurs calculs (PageRank...) et affichages (résultats de recherche...) en tenant compte de cette information.
* * *
Autre exemple d’usage (qui était celui qui avait suscité ma question) : lorsqu’on veut participer aux sites de partage de bookmarks type delicious.com, il importe que les différents partageurs se mettent d’accord sur une adresse unique, de manière à pouvoir discuter de la même chose, même s’ils l’ont vue dans un contexte différent. Le plugin SPIP Social Tags en tient compte.
Dans le squelette SPIP article.html, il suffit d’indiquer dans la partie <head>..</head> le code suivant [1] :
Pour que Google considère qu’un (vieux) lien vers http://monsite.tld/a1.html pointe en fait vers http://www.monsite.tld/Titre-article (URL canonique de l’article si on a activé les URLs « propres »). Ou que SocialTags indique le nouvel URL dans delicious quand on clique sur l’icone, même si le navigateur indique http://www.monsite.tld/Titre-article?PHPSESSID=12345.
Tests de nom de classe CSS
Code :
Résultat :
test.123
test#123
test@123
test<123
test`123
test 123
_test123
-test123
123test
Utiliser PHP_codeSniffer : les bases
Usage : quelques exemples de commandes
Tester un fichier php seul :
phpcs dossier/fichier_truc.php
Tester un dossier complet : par ex à la racine d’un répertoire de plugin
(/ !\ attention ! lancer phpcs sur un gros dossier avec beaucoup de fichiers (php / css / js) sans faire de restrictions via la configuration peut entraîner une GROSSE charge pour votre processeur !)
phpcs dossier/
devrait retourner tout un tas d’erreurs à corriger, pour à peu près tous les types de fichiers (js, css, php)
Restreindre la portée du scan aux fichiers PHP, exclure des dossiers :
En ajoutant le fichier `phpcs.xml` à la racine du répertoire avec le contenu proposé dans momh.fr, on doit restreindre la détection des erreurs aux fichiers .html et .php
Le contenu du fichier :
Tester uniquement avec les coding-standard de SPIP :
phpcs —standard=SPIP41 dossier/fichier_truc.php
Ne pas afficher les warnings (uniquement les erreurs) :
phpcs -n dossier/fichier_truc.php
Colorer la sortie :
phpcs —colors dossier/fichier_truc.php
Compléments de configuration : l’option —config-set
Utilisation de l’option —config-set :
par exemple si vous n’utilisez phpcs/phpcbf que pour les standards SPIP, pour éviter d’ajouter l’option `—standard=SPIP41` à chaque appel de la commande, vous pouvez passer ce paramètre en option par défaut avec :
phpcs —config-set default_standard SPIP41
NB : cela donne une configuration écrite dans le fichier ...Composer<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>squizlabs<span style="color: #000000; font-weight: bold;">/</span>php_codesniffer<span style="color: #000000; font-weight: bold;">/</span>CodeSniffer.conf qu’il est possible de bricoler directement aussi
La syntaxe de cette option est de la forme :
l’introduction dans le récit de procédés interactifs,
une navigation et un récit non linéaire (implication de l’utilisateur + liberté de parcours)
une écriture spécifique
un point de vue d’auteurs
Son attractivité va donc être particulièrement dépendante de la "manière de raconter les choses", laquelle est la résultante de 3 "éléments" du webdoc qu’il va falloir envisager explicitement lors de sa conception :
la scénarisation : propos général, intentions, qu’est-ce qu’on veut dire, qu’est-ce qu’on veut démontrer (pour la globalité du webdoc et à l’intérieur de chaque partie).
la navigation : ce que l’internaute choisit de faire comme parcours, ce qu’il décide de cliquer, l’ensemble des possibilités de liens hypertextes offerts dans les pages. C’est la manière de se déplacer au sein du webdoc.
la narration : la manière de raconter/présenter les choses. À l’intérieur des possibilités offertes par la navigation, en fonction des intentions de la scénarisation on doit dégager un ou plusieurs parcours différents = successions de pages proposées, qui vont raconter une histoire. La narration c’est l’utilisation d’une ou plusieurs manières de naviguer pour raconter des choses particulières, pour guider les visiteurs.
Cet article propose d’explorer les modes de navigation utilisés à l’heure actuelle pour permettre "d’ouvrir" la réflexion lors de la conception de la (les) narration(s) d’un webdoc.
2. Modes de navigation : les grands types
Chaque webdoc ou partie de webdoc propose une ou plusieurs façon de parcourir ses contenus : on parlera de "mode de navigation". Il s’agit de la manière dont sont proposés, organisés les liens et tous les éléments qui permettent de consulter les contenus.
En fonction de l’importance et de la diversité de ses contenus, un webdoc peut proposer un ou plusieurs modes de navigation : soit exclusif (par exemple pour une partie) soit en parallèle.
Une typologie rapide et illustrée d’exemples des modes de navigation les plus répandus est proposée ci-dessous. Pour chaque type est proposé un exemple "court" et un exemple "long".
Chapitrage
Parcours du webdoc selon des "chapitres" cad des parties nettement séparées entre elles. Chaque chapitre peut lui même être subdivisé en sous-parties. En général l’organisation interne des chapitres (présentation des capsules, types de pages disponibles, menus de navigation...) est identique. Habituellement un menu des chapitres est à disposition dans toutes les pages
Exemples :
Panafest https://www.panafest.org.za ("multi chapitrage" = des chapitrages en parallèles en fonction des thématiques)
Cartographie
Navigation sur une (plusieurs) carte(s), les contenus sont accessibles via leur marqueur sur la carte. Peut offrir l’accès aux contenus en fonction de la géolocalisation de l’internaute.
Exemples :
Immersion
Le parcours du webdoc se fait en mettant l’internaute "dans la peau" d’un(e) personnage afin de donner son point de vue (au sens propre du terme). L’immersion se fait de plus plus en mode panoramique 360°. Parfois associé avec un aspect ludique ("game-doc" : concept de "l’histoire dont vous êtes le héros")
Exemples :
Data visualisation
Ce type de navigation est basé sur la présentation sous diverses formes d’ensembles de données (statistiques, cartographiques, analytiques...) pour permettre leur visualisation de façon pédagogique et/ou percutante.
Exemples :
Articles long format ("stories")
Très utilisé par les webdocs journalistiques, la navigation se fait de façon linéaire en déroulant ("scrollant") une page qui présente des faits, médias ou événements successifs. En fonction de la quantité d’informations, le webdoc peut être constitué d’une ou plusieurs page(s)/story(ies) successives.
Exemples :
Timeline / Frise chronologique
La navigation est basée sur la chronologie d’une période sur laquelle sont placés les diffférentes capsules/contenus. En général une "timeline" (frise chronologique) permet de visualiser l’ensemble de la période d’étude.
Exemples :
War in Raqqa : rhetoric versus reality : https://raqqa.amnesty.org
synthèse d’Amnesty International à propos des pertes civiles lors de la prise de Raqqa par les forces de la coalition (navigateur Chrome/Chromium nécessaire pour l’immersif) stories + carto + immersif 360°
Fos étang de Berre 200 ans d’histoire industrielle et environnementale : https://fos200ans.fr
vulgarisation d’un projet de recherche chapitrage + carto
Le cloître & la prison Les espaces de l’enfermement : http://cloitreprison.fr
éclairer l’histoire des espaces d’enfermement et sur leurs multiples transformations en France chapitrage + chronologie
EPSYKOI : la santée mentale et les jeunes : https://epsykoi.com
Un webdocumentaire d’information et de prévention en santé mentale et une réalisation collective entre usagers de la psychiatrie, psychologues et vidéastes.
Hommage à Frédéric Bazille : https://musee.info/Hommage-a-Frederic-Bazille
le Musée Fabre de Montpellier rend un hommage au peintre Frédéric Bazille chapitrage + stories + immersif 360° + carto
Herbier 2.0 : http://www.webdoc-herbier.com/
40 chroniques à l’occasion de la rénovation de l’Herbier du Muséum national d’Histoire naturelle timeline
Panafest : https://www.panafest.org.za
grands festivals panafricains des années 1960 et 1970. chapitrage multiple (selon les thématiques) + immersif
Welcome to the anthropocène : https://anthropocene.info/index.php
portail éducatif à propos de l’anthropocène data-visualisation+ chapitrage
A data sur la politique : https://lesjours.fr/obsessions/data-politique
une "data-enquête" sur les députés et le fonctionnement de l’assemblée (2017-22) data-visualisation + chapitrage
Minett stories : https://minett-stories.lu/fr/
les histoires et les identités de la région industrielle du Minett (Luxembourg), ainsi que des personnes qui y ont vécu et travaillé. stories
Casques sur le front : https://r0c3e20650.racontr.com/
Les casques_blancs syriens portent secours aux populations qui subissent les bombardements story + chapitrage
Adapter la CSS en fonction du terminal : les Media Queries
Présentation Media Queries
Diaporama medias queries : adapter les propriétés CSS aux paramètres du terminal utilisé
Brancher un dossier existant sur un repo Git nouvellement créé
pour les SPIPeurs : cette situation est typiquement celle que vous rencontrez lorsque vous sortez un nouvel embryon de plugin de la Fabrique et que vous souhaitez le passer sur votre serveur Gitlab :
Vous devez réaliser une application web monopage permettant la création et l’utilisation d’une liste de courses. Cette page devra avoir un header, une barrenav, un content, (aside si besoin) et un footer. Vous pouvez utiliser un framework css. Attention, cette page devra être responsive.
Fonctionnalités attendues :
Etape 1 : affichage
Le tableau d’affichage doit comporter :
l’affichage de la quantité et du nom du produit
Un bouton pour cocher une ligne (fait)
Un bouton pour supprimer une ligne
Afficher le nombre total de produits
Afficher le nombre total de produits non cochés
Etape 2 : insertion
Créer un formulaire pour ajouter une ligne : Nom du produit et Quantité
Vérifier que le nom du produit ait plus de 3 caractères
Vérifier que la quantité soit un entier
Etape 3 : modification
Ajouter deux boutons pour modifier la quantité (bouton + / -).
Etape 4 : trier
Ajouter deux boutons de tri du tableau (Attention : ces boutons doivent modifier la requête mysql de sélection) : par Nom et par Quantité
Etape 5 : ajax
Transformer toutes les actions en bdd en AJAX
Bonus 1 : autocomplétion
Ajouter l’autocomplétion sur le nom du produit dans le formulaire de création.
Pour cela, vous devez utiliser une bdd.
Bonus 2 : mode hors ligne
Vous devez pouvoir utiliser sur votre téléphone votre liste de course sans connexion internet. Il faut que le bouton : cocher fonctionne (enregistre) pour pouvoir synchroniser à votre retour chez vous.
Bonus 3 : enregistrer ses listes
Pouvoir enregistrer ses listes (avec un nom) et pouvoir les recharger.
Bonus 4 : libre !!
Cahier des charges HTML/CSS/Javascript/jQuery
HTML :
Créer une page "Typo" qui regroupe les différents types de balises de base :
niveaux de titres
texte et mise en forme
listes
tableaux
liens
Créer une page "Accueil (Home)" : avec 1 bloc principal et 2 blocs secondaires
Créer une page "Contenus" : modèle pour l’affichage des "articles", avec un bloc latéral "Table des matières"
Créer une page "Médias" : avec affichage en blocs "vignettes" pour photos/vidéos
Créer une page "Données" : avec affichage d’un (gros) tableau de données en lignes
Créer une page "Inscription" : avec un formulaire demandant des informations de tout type et envoyé par mail
Créer une page "Whaou !" : avec un bloc unique centré et une image en background "étiré"
Créer un "Header" (barre de navigation) et un "Footer" (mentions légales, plan compact...) sur la page "Typo", l’intégrer dans toutes les pages
CSS :
Styler la page "Typo" en ciblant les balises, passer ces styles sur toutes les pages
Créer 2 ou 3 layouts pour la page "Sommaire" sur la base d’un HTML commun : disposition fixe/fluide
pour les layout de la page "Sommaire" positionner les blocs pour 3 largeurs d’écran (ordi / tablette / smartphone)
choisir un layout et le passer sur toutes les pages
Créer un affichage en liste pour la page "Médias" (sans toucher au HTML)
Récupérer deux polices sur un site de polices libres et les intégrer dans toutes les pages
Bootstrap :
Créer une page "Accueil" alternative en Bootstrap 4 avec les caractéristiques suivantes :
barre de navigation au sommet de la page (sans être "fixed"), faisant toute la largeur (= fluide), qui se compacte pour donner un "hamburger" dépliable au clic en vue téléphone
1 bloc principal et 1 bloc secondaire, rapport de largeur 2/3 1/3, qui se superposent en vue téléphone (dans l’ordre : principal > secondaire)
titre de la page + slogan en "jumbotron" (= gros bloc) centré
trouver les modifications permettant d’avoir un layout fluide pour l’ensemble de la page
dans la barre de navigation, ajouter un sous menu dépliable
faire un menu en accordéon dans le bloc secondaire
dans le jumbotron ajouter un bouton qui lance une "modal box" (= boite popin) qui affiche un formulaire d’inscription à la newsletter. Sur le bouton, ajouter un "tooltip" (= bulle d’aide) qui incite à ouvrir la modale et s’incrire
Sur ce modèle créer une page alternative pour la page "Médias" avec :
6 blocs utilisant les "Cards" chacun ayant un bandeau de titre et un lien en bouton. Leur disposition sera "harmonieuse" sur la largeur
sous le titre de page un slider (= carrousel) de 3 images avec titre et descriptif + indicateur de position
Sur ce modèle créer une page alternative pour la page "Données" avec :
l’en-tête du tableau en blanc sur fond noir
les lignes paires et impaires alternativement grisées/blanches
Javascript / jQuery :
Créer une bascule d’affichage entre liste/vignette pour la page "Médias"
Faire défiler l’image background de la page "Whaou" pour faire un effet de slider
Gérer le "retour" de la page "Inscription" en interceptant la validation : afficher la synthèse des infos et créer des interactions différentes en fonction des réponses
Générer la table des matières automatiquement (y compris les ancres) dans la page "Contenus"
Créer un script qui importe en ajax "Header" et "Footer" dans n’importe quelle page
Créer un formulaire qui permet de saisir une liste de termes, à la validation le traiter pour :
générer un Json utilisable dans auto-complete
l’enregistrer en "local storage" (en remplaçant l’existant si besoin)
édition de l’existant : si il existe déja une liste stockée, au chargement du formulaire la récupérer pour l’intégrer dans le champ de saisie
Utiliser les jQuery UI et widgets pour réaliser les éléments suivants :
page "Inscription" :
ajouter 4 blocs ayant chacun un mot à l’intérieur + 1 cadre vide (plus grand que les blocs). Créer le javascript permettant de :
faire un drag’n drop d’un bloc-mot dans le cadre vide
récupérer le mot du bloc choisi et le stocker dans un champ "hidden" du formulaire
ajouter un bouton pour vider le cadre
si le cadre contient déja un bloc-mot le supprimer lorsqu’un nouveau bloc est glissé dedans
ajouter un sélecteur de couleur et un sélecteur de date
ajouter une auto-complétion dans un champ texte à partir d’une liste pré-établie de mots
page "Contenus" :
découper la page "Contenus" en onglets correspondant aux différentes parties
passer la table des matières en menu accordéon
page "Données" :
Intégrer le plugin DataTable dans la page "Données"
Elements pour l’exercice de prise en main HTML et CSS
Le B.A. BA de la POO en PHP
Définitions :
Un objet :
Un « objet » est une représentation d’une chose matérielle ou immatérielle du réel à laquelle on associe des propriétés et des actions.
exemple : un véhicule , une personne, un animal, un compte bancaire, ...
Une Classe :
contient la définition de l’objet que l’on va creer = c’est le plan de fabrication d’un objet
class Vehicule // Présence du mot-clé class suivi du nom de la classe.
{
// Déclaration des attributs et méthodes ici.
}
Les Attributs (variables) :
caractéristiques propres à un objet.
exemple : nom, prénom, couleur, ...
class Vehicule
{
private $nombre_roues = 4; // nombre de roues du véhicule, par défaut = 4
private $couleur = 'vert'; // couleur du véhicule;
private $nom;
}
Les Methodes (fonctions) :
Des actions que l’on peut appliquer à un objet
class Vehicule
{
private $nombre_roues = 4; // nombre de roues du véhicule, par défaut = 4
private $couleur = 'vert'; // couleur du véhicule;
private $nom;
private $niveau_carburant = 100
public fonction klaxonner() // une méthode pour faire du bruit
{
echo "tut tut";
}
}
Instance de classe = résultat d’une instanciation = création d’un objet
exemple : un tricyle est crée à partir de l’objet véhicule
création de methode qui ont comme seul role de modifier un attribut private d’un objet
class Vehicule {
private nom;
private roues = 4;
public function __construct($recup_nom = 'pas encore de nom'){
$this->nom = $recup_nom;
}
public fonction getRoues(){
return $this->roues;
}
public function setRoues($nombre_roues){
if(is_int($nombre_roues) && $nombre_roues > 0 && $nombre_roues < 10){
$this->roues = $nombre_roues;
}
else {
trigger_error('Le nombre de roue est invalide', E_USER_WARNING);
}
}
}
$tricycle = new Vehicule("Mon_Super_Tricycle");
$tricycle->setRoues(3);
echo $tricycle->getRoues; // affiche 3
$tricycle->setRoues(11);
echo $tricycle->getRoues; // Warning : le nombre de roues est invalide
Réaliser un webdocumentaire scientifique : concepts et éléments techniques
Le concept de webdoc et plus spécifiquement en tant que support de vulgarisation scientifique
Définition « basique » du webdoc (Wikipedia) :
« Le web-documentaire est un documentaire conçu pour être interactif – en associant texte, photos, vidéos, sons et animations – et produit pour être diffusé sur le Web. »
Concept de base : sur un support de site web développer le point de vue global d’un auteur basé sur différents types de documents (textes, photos, audios, vidéos, panoramiques 360°, animations, cartes, data-visualisations, contenus de réseaux sociaux…) tout en donnant la possibilité à l’utilisateur de choisir son parcours de consultation (qui devient « spectateur actif » donc)
Apparition début années 2000 :
contemporaine du déclin des médias traditionnels (TV en particulier) et du développement de l’hyperconnexion du public avec "picorage" des contenus (typiquement YouTube, réseaux sociaux...)
explosion du multi-médias dans les contenus informatifs : images, vidéos, cartes, infographies, animations... avec de plus en plus de "mix" entre les types
Caractérisé par :
l’utilisation d’un contenu multimédia,
l’introduction dans le récit de procédés interactifs,
une navigation et un récit non linéaire (implication de l’utilisateur + liberté de parcours)
une écriture spécifique
un point de vue d’auteur
Des exemples :
Fos / étang de Berre 200 ans d’histoire industrielle et environnementalehttps://fos200ans.fr : un webdoc destiné à la vulgarisation d’un projet de recherche conjoint histoire + sociologie
War in Raqqa : rhetoric versus realityhttps://raqqa.amnesty.org : un webdoc d’Amnesty International à propos des pertes civiles lors de la prise de Raqqa par les forces de la coalition
Le cloître & la prison Les espaces de l’enfermementhttp://cloitreprison.fr : un webdoc pour éclairer l’histoire des espaces d’enfermement et sur leurs multiples transformations en France. En relation avec un projet de recherche plus global sur l’enfermement monastique et carcéral.
: un webdoc à propos d’agriculture mais pas vraiment "scientifique", réalisé pour le Centre National Interprofessionnel de l’Économie Laitière
_un exemple techniquement très abouti d’intégration des médias et de navigation interactive_
— >
Eléments technique d’un webdoc avantage et contraintes du média "web"
narration principale / secondaire / transversale / thématique + point de vue réflexif puisqu’on est dans un cadre scientifique
importance du système de navigation : menu(s) / fil d’Ariane / « historique » perso (cf cookies)
unité narrative : notion de capsule : par ex War in Raqqa
contrainte forte du « multi terminal » pour la consultation : nécessité de concevoir l’interface utilisateur « responsive » = compatible avec tous les formats d’affichage et d’interactions (ordinateur / tablette / téléphone...) (+ notion de « fall-back »)
Data visualisation multi-types sur l’anthropocène (cartographies, timelines, photos satelliteshttps://anthropocene.info/index.php(peut nécessiter de désactiver les vérifications de sécurité du navigateur web...)
Transformations to groundwater sustainability :http://t2gws.com (data visualisation sous forme de schémas et dessins d’illustration) web doc collaboratif chercheurs / populations
intervention via commentaires, réseaux sociaux... + compétition entre participants (« gamedoc » ?) Fort McMonneyhttp://www.fortmcmoney.com (le site n’est plus opérationnel depuis la finde Flash Player... voir ce reportage de cinemadocumentaire pour les retours d’expérience)
« call to action » : appels à témoignages ou participation cf War in Raqqa avec appels à témoignages ou aux dons
parcours personnalisé : ex enregistrer et partager ses favoris sur Géoculturehttps://geoculture.fr (nécessite de se créer un compte !)
intégration de données et visualisations de celles-ci
contraintes de la visualisation responsive
possibilités de visualisations animées
possibilités de visualisations dynamiques en interaction avec l’utilisateur : https://www.worldnuclearreport.org/reactors.html Utilisation de librairies JavaScripts dédiées : 2 exemples avec code source ouvert
charte graphique générale classique (polices, palette de couleurs, jeux d’icônes...)
habillage photos
répartition des éléments textes / médias dans les pages
problématique du stockage et de la pérennité :
évolution des technologies : cf obsolescence de la techno Flash et tous les premiers webdocs qui ne sont plus disponibles si ce n’est en archivage : ex Prison Valleyhttp://prisonvalley.arte.tv/flash/#fr
disponibilité des ressources externes : passage en accès privé, changement des API...
nécessité de l’hébergement + maintenance / MàJ
Réalisation d’un webdoc étapes et éléments pour une gestion collaborative
collecte des données et tri (sources et références obligatoires !) « comme tout documentaire la base d’un web-documentaire reste un long travail de documentation »
constitution d’une médiathèque avec « formatage » commun / standardisé
choix des parcours narratifs selon les publics visés ("personnae")
élaboration du / des scénarios + découpage en parties (= unités de premier niveau)
définition des règles de découpage / subdivisions à l’intérieur des parties (ex pour Fos 200 ans : période > étape > capsule)
détermination du contenu des capsules et attribution des médias aux différents éléments narratifs
organisation précise des capsules dans les parties / sous-parties
habillage des contenus :
développement des différents gabarits (ou « templates »)
attribution des gabarits aux capsules + adaptations ponctuelles
organisation des éléments de navigation (menus généraux et contextuels, jeu d’icône, plan du site, moteur de recherche,
mise en place des références : sources, présentation des auteurs, crédits...
relecture, re-relecture, re-re-relecture... et corrections sans fin !
Dans cet exemple on souhaite supprimer (= remplacer par une chaine vide) les numéros qui précèdent le texte dans le champ titre de la table spip_articles. Ces numéros sont tous en début de titre et suivi par un point et un espace : l’expression régulière pour les "attraper" sera donc : ^[0-9]*\. , ce qui donne comme syntaxe de l’UPDATE :
UPDATE spip_articles SET titre = REGEXP_REPLACE(titre,"^[0-9]*\. ","") ;
Utiliser une sous-requête MySQL pour compter le nombre de liaisons sur un élément
Exemple en SPIP d’utilisation de COUNT() en sous-requête
La table spip_mots_liens est utilisée pour stocker les liaisons des objets SPIP (articles, rubriques...) sur les mots clés de la table spip_mots.
On souhaite faire une liste des mots clés du groupe 2 avec pour chacun le nombre de liaisons qu’il possède :
SELECT m.id_mot, m.titre,
(SELECTCOUNT(L.id_mot)FROM spip_mots_liens AS L WHERE L.id_mot = m.id_mot)AS nb
FROM spip_mots AS m WHERE m.id_groupe=2ORDERBY m.titre ;