L'idée de cette action m'est vue lors de la création des actions pour récupérer des informations pour la documentation d'un site.
Pourquoi ne pas avoir une action qui permette d'exprimer simplement une requête SQL SELECT et de mettre en forme le résultat.
Outre la présentation de données, elle permettrait de répondre simplement à des questions que tous webmasters se posent comme "Quels sont les articles avec un titre trop court pour la SEO"
{up sql=nom_table | ...}
Terminologie:
row : ligne de la table
col : cellule. Colonne de la table
tag ou motclé : ##nomcol##
- sql: nom de la table
- select = *: listes des colonnes
- where: commande SQL : where
- order: commande SQL : order
- group: commande SQL : group
- innerjoin: commande SQL : innerjoin
- outerjoin: commande SQL : outerjoin
- leftjoin: commande SQL : leftjoin
- rightjoin: commande SQL : rightjoin
- setlimit: commande SQL : setlimit
informations sur la base de données
- dbinfos: vide= la liste des tables OU nom_table = la liste des colonnes
- no-prefix-auto: utiliser le nom de la table sans ajouter le prefix #__
mise en forme du résultat
- presentation = table: présentation du résultat : list,table,div ou 0
- template (item-template): modèle mise en page
- header: 1 ou vide pour utiliser les mots-clés, sinon titres séparés par des points-virgules
- sort: type de tri par colonne sous la forme: i,3-f-s. i:int, s:string, f:float. ,3 indique un tri secondaire sur la 3e colonne
- sort-first: nom ou position de la colonne triée en premier
- col: alignement et largeur des colonnes sous la forme x-D-C5-100 pour rien-droite-centre 5%-100% (voir doc)
- no-content-html = aucun résultat: essage si echec requete
Style CSS pour afficher le résultat
- id: identifiant
- main-class = up: classe(s) pour bloc
- main-style: style inline pour bloc
- item-class: classe(s) pour ligne
- item-style: style inline pour ligne
- css-head (base-css): style ajouté dans le HEAD de la page
- Version 2.5
- retour valeur brute si appel d'une fonction d'aggrégation (count, sum, min, max, avg). Voir exemple de code
- Version 2.9
- Compatibilité php 8 pour les formats des dates
- Version 3.1.1
- Correction prise en charge de la case des colonnes
- Version 3.1.2
- Ajout option no-prefix-auto pour ne pas ajouter automatiquement le prefix
Voici un exemple obtenu avec cette action. Il s'agit de la liste des articles du site dont la longueur du titre est inférieure à 10 caractères.
142 | 8 | Donation | 0 |
143 | 9 | Connexion | 0 |
167 | 8 | menu top | 0 |
168 | 9 | Recherche | 0 |
180 | 4 | test | 0 |
185 | 4 | base | 0 |
Nous allons découvrir étape par étape comment obtenir ce résultat. Les impatients peuvent découvrir les shortcodes utilisés en cliquant ICI
Dans cette démo, je vais expliquer comment utiliser l'action en considérant que vous comprenez le SQL.
Une erreur de saisie se traduira par une erreur fatale.
Je vous recommande vivement de construire le shortcode petit à petit en testant chacune des étapes.
La requête
Le plus simple
Obtenir le nombre d'articles d'une catégorie. Je l'utilise sur la page d'acceuil de ce site comme argument de l'action counter pour afficher le nombre d'actions.
{up counter=0,{up sql=content | select=count(id) | where=catid=8 and state=1}}
Les fonctions SQL qui retourne une valeur unique (count, min, max, sum, avg) ne sont pas mise en forme.
Egalement très simple
Pour expliquer le principe, récupérer la liste des langages installés sur le site.
{up sql=languages}
Avec ce simple shortcode, nous obtenons le résultat ci-contre.
Il suffit d'indiquer la table comme argument principal.
Par défaut, le préfixe '#__' sera ajouté au nom des tables sauf si l'option 'no-prefix-auto' est spécifiée.
Par défaut, toutes les colonnes et lignes de la table sont affichées dans un tableau.
Pour les contenus longs ou avec du code HTML, seuls les 100 premiers caractères sont affichés sans mise en forme.
lang_id | asset_id | lang_code | title | title_native | sef | image | description | metakey | metadesc | sitename | published | access | ordering |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | en-GB | English (en-GB) | English (United Kingdom) | en | en_gb | 1 | 1 | 3 | ||||
2 | 0 | fr-FR | Français (fr-FR) | Français (France) | fr | fr_fr | 1 | 1 | 2 | ||||
3 | 378 | de-DE | German (Germany) | Deutsch (Deutschland) | de | de_de | 1 | 1 | 1 |
Il me semble difficile de faire plus simple pour connaitre le contenu d'une table sans avoir besoin d'aller jouer avec PhpMyAdmin !
Avec des options simples
Il n'est pas toujours nécessaire ni souhaitable d'afficher toutes les colonnes et lignes d'une table.
Pour la démo, affichons les 5 derniers articles du site sous la forme d'une liste.
- 17 : Version 5 crée le : 2024-01-21 07:45:32
- 17 : Version 3.1.2 crée le : 2023-11-08 07:45:32
- 17 : Version 3.1 crée le : 2023-09-28 07:45:32
- 8 : random ~ choix aléatoire crée le : 2023-09-25 00:00:00
- 8 : snippet crée le : 2023-09-25 00:00:00
{up sql=content | setlimit=5 | order=created DESC
| presentation=list | template=##catid## : ##title## [small]crée le : ##created##[/small] | header}
La première ligne contient les options pour définir la requête SQL. Vous noterez que l'action respecte la terminologie JDatabase et SQL. Ce shortcode va créer la requête :
SELECT * FROM #__content ORDER BY created DESC LIMIT 5
La seconde ligne contient les options pour la mise en forme. Présentation demande un affichage sous forme de liste et template est un modèle au format contenant le nom des champs (colonnes) entre un double signe dièse : ID de la catégorie, titre de l'article et date de création. Il est possible de styler cette liste en utilisant le simili-HTML de UP que j'appelle 🆙 BB-Code by UP
Avec jointure
Dans l'exemple précédent, il aurait été préférable d'avoir le nom de la catégorie plutôt que son ID.
Pour cela, il faut faire une jointure entre la table content et categories
News | Version 5 | 2024-01-21 07:45:32 |
News | Version 3.1.2 | 2023-11-08 07:45:32 |
News | Version 3.1 | 2023-09-28 07:45:32 |
Actions | random ~ choix aléatoire | 2023-09-25 00:00:00 |
Actions | snippet | 2023-09-25 00:00:00 |
{up sql=#__content AS art
| select=art.title AS title, cat.title AS catname, art.created AS date
| innerjoin=#__categories AS cat ON cat.id = art.catid
| setlimit=5
| order=created DESC
| template=##catname## ##title## ##date##
}
La présence de 2 tables oblige l'utilisation d'alias pour identifier les colonnes.
Pour les habitués du SQL, ce shortcode doit se comprendre facilement. Pour les autres, consultez les nombreux tutos disponibles sur le web et en particulier celui-ci : Sélection de données en utilisant JDatabase
La table principale est passée comme argument de from et on utilise innerjoin pour relier la table catégorie à content.
Les champs pour la mise en page reprennent les alias définis dans le select. N'ayant pas spécifié une présentation en liste, on retrouve notre tableau par défaut.
Les données JSON
Joomla utilise des chaines JSON pour stocker des informations. C'est le cas, par exemple, pour les images d'un article.
Présentation
{up sql=content | where=id='2'
| template=[img src="##images.image_intro##"][br]##title##
| presentation=div | main-class=tc}
Pour accéder à une donnée JSON, il suffit d'indiquer le nom de la colonne, un point et la clé JSON.
J'ai également utilisé une clause where pour avoir un résultat qui a une image 😀.
Pour mon unique fiche, une présentation dans une balise div est judicieuse ainsi que la classe pour centrer le tout. Noter l'utilisation du bbcode pour éviter leur interprétation par les éditeurs wysiwyg.
Il est donc impossible de les utiliser comme critères de la requête SQL.
Trier la table
En présentation table, il est possible de cliquer sur les titres des colonnes pour trier le contenu.
ID | Etat | Titre | Publié le | Position | Module |
---|---|---|---|---|---|
186 | Switch Editor | mod_switcheditor | |||
181 | Accès rapide aux démonstrations | banner | mod_lmcustom | ||
90 | tarteAuCitron + google + upstat | debug | mod_lmcustom | ||
185 | base | 2018-06-03 07:31:22 | debug | mod_lmcustom | |
178 | demo-bgvideo | 2023-09-09 03:46:45 | demo-bgvideo | mod_lmcustom | |
135 | Test article-category | 2021-04-01 06:51:12 | demo-up-module | mod_lmcustom | |
166 | Menu footer | footer | mod_lmcustom_menu | ||
180 | test | footer | mod_lmcustom | ||
142 | Donation | footer-droit | mod_custom | ||
167 | menu top | 2022-06-19 17:38:03 | menu | mod_lmcustom_menu | |
143 | Connexion | mod_login | mod_login | ||
168 | Recherche | mod_search | mod_finder | ||
137 | GTranslate | mod_translate | mod_gtranslate | ||
183 | Test perso Joomla | top-a | mod_custom |
{up sql=modules | select=id,position,published,title,publish_up,module | where=client_id=0 | order=position
| template=##id## ##published## ##title## ##publish_up## ##position## ##module##
| header=ID,Etat,Titre,Publié le,Position,Module
| col=d5-c5
| published-format=list[-2:icon-trash, 0:icon-unpublish t-rouge, 1:icon-publish t-vert
| published-model=<span class="%s"></span>
| sort=i-s,3-s-s-s}
- les options pour construire la requête SQL
- on précise les colonnes pour s'assurer de leur ordre d'affichage
- pour éviter d'avoir les noms des champs SQL comme titres, on les indique avec l'option header
- col permet de fixer la largeur et la justification des colonnes.
- pour éviter les valeurs numériques pour l'état, format définit les classes qui seront insérées par le modèle. Voir 'format des données' ci-après.
- le model est utilisé pour construire le contenu de la cellule. Voir 'Modèle d'affichage' ci-après.
- sort est l'option qui contient les directives pour le tri
L'argument de sort est une liste des critères par colonnes.
Dans notre exemple, i pour la première colonne spécifie que le contenu est un entier pour utiliser la méthode adéquate.
Les autres types sont s (string) pour une chaine ou f (float) pour les nombres
Tri multi-colonnes
s,3 pour la deuxième colonne permet de demander un premier tri alphanumérique de la colonne suivi d'un tri de la troisième colonne (le titre).
Valeur de tri dissociée de l'affichage
La colonne 'Etat' montre également que la colonne bien que vide (juste une classe) est triée selon sa valeur originale passée comme attribut de la cellule du tableau. C'est d'ailleurs pour cela que l'on doit faire un tri alphanumérique qui est le format de cet attribut.
UP spécifie automatiquement la valeur de tri pour toutes les colonnes ayant une définition de format de type list ou date.
Ordre de tri initial
Au chargement de la page, la table est triée selon l'ordre de la requête SQL. Vous pouvez le voir grâce au petit triangle dans son titre.
La mise en forme
Les données brutes fournies par la requête méritent d'être enrichies pour un meilleur aspect visuel : un état corbeille est plus parlant que -2, 2018-10-26 16:27:55 n'est pas très joli pour une date, ...
Dans une vue liste, il est souvent utile de préfixer le résultat. "Accès admin" informe plus que "admin" seul.
Pour mettre en évidence certains résultats, pouvoir styler une ligne ou une cellule serait également bienvenue.
Format des données
S'il est facile d'afficher du texte simple, certaines données nécessitent une interprétation.
Nous pouvons l'indiquer à l'aide d'une option qui reprend le nom de la colonne suivi de '-format'. Exemple : title-format.
L'argument de cette option peut être un des types ci-dessous, suivi d'un argument entre crochets.
- text
Il n'est pas toujours souhaitable d'afficher du contenu HTML tel quel. Le type text va supprimer toutes les balises HTML avec en option la possibilité de limiter la longueur du texte.
Exemple :
introtext-format=text[100]
va afficher les 100 premiers caractères non formatés de l'introtext- replace
Ce type permet de remplacer du texte par un autre. La recherche ne tient pas compte de la case.
La syntaxe complète (proche de la fonction php str_ireplace) est :
xxx-format=replace[old1,old2:new1,new2]
Exemple pour supprimer le préfixe d'un nom de module :
module-format=replace[mod_]
Pour remplacer up par Universal Plugin:
xxxx-format=replace[up:Universal PLugin]
- liste de valeurs
C'est le cas des statuts published ou des niveaux d'accès.
L'option
published-format=list[-2:Corbeille,0:Dépublié,1:Publié]
va indiquer à l'action qu'il faut remplacer les valeurs retournées par la requête par celles de l'option. Donc pour la valeur -2, le champ ##published## affichera Corbeille.Une variante est d'indiquer des noms de classe (iconfont) qui seront utilisés dans le template ou le modèle (voir ci-après) avec ces options.
| published-format=list[-2:icon-trash, 0:icon-unpublish t-rouge, 1:icon-publish t-vert
| template=<span class="##published##"></span>
OU | published-model=<span class="%s"></span>- min
- max
Affiche l'argument si la valeur est supérieure à (min) ou inférieure à (max).
- date
Précise le format à appliquer à une date
Exemple :
created-format=date[%e %B %Y]
le format est celui de la fonction php strftimeCode : %y ➜ AAAA, %Y ➜ AA, %m ➜ 01-12, %M ➜ Jan-Dec, %F ➜ Janvier-Décembre, %d ➜ 01-31, %j ➜ 1-31, %D ➜ Lun-Dim, %l ➜ Lundi-Dimanche,
%g ➜ 1-12, %h ➜ 01-12, %G ➜ 0-23, %H ➜ 00-23, %i ➜ 00-59, %s ➜ 00-59 (secondes),- image
On considère que la valeur de la colonne est une image.
xxx-format=img[60]
retourne le code HTML pour afficher l'image inscrite dans un carré de 60px.Si la colonne xxx retourne 'mon-image.jpg', le code généré sera
<img src="/mon-image.jpg" alt="Mon image" width="60px">
- regex
Affiche l'argument si la valeur répond à la recherche regex. Ce type est surtout utilisé pour affecter des styles en fonctions du contenu. Voir ci-après.
xxx-format=regex[#^joomla#:texte
Modèle d'affichage
Il permet d'ajouter du texte avant/après la valeur et de formater les nombres selon les règles pour la fonction php sprintf.
On utilise une option qui reprend le nom de la colonne suivi de '-model'. Exemple : title-model.
Exemple : tva-model=TVA: %0.2f €
pour une valeur de 18.1 affichera : TVA: 18,10 €
Par défaut, si la valeur est vide ou égale à zéro, rien ne sera affiché.
Il est possible de changer ce comportement en ajoutant le modèle à la suite : tva-model=TVA: %0.2f € ; EXPORT
Attention si vous utilisez un point-virgule, il faut mettre entre guillemets les 2 alternatives et doubler les éventuels guillemets doubles à l'intérieur
Exemple : published-model="[span class=""%s tc""]■[/span]"
bien que le HTML soit autorisé dans les options acceptant des balises, j'utilise du bbcode pour me protéger d'une interprétation par les éditeurs wysiwyg
Style sous conditions
Pour mettre en évidence certaines données, il est possible d'attribuer des classes à des lignes et/ou colonnes en fonction de leur contenu.
Pour la démonstration, je vais reprendre la table utilisée pour le tri. Les lignes seront colorées selon leur état et les cellules seront mises en évidence si elles contiennent un mot.
ID | Etat | Titre | Publié le | Position | Module |
---|---|---|---|---|---|
186 | Switch Editor | mod_switcheditor | |||
181 | Accès rapide aux démonstrations | banner | mod_lmcustom | ||
90 | tarteAuCitron + google + upstat | debug | mod_lmcustom | ||
185 | base | 3 June 2018 | debug | mod_lmcustom | |
178 | demo-bgvideo | 9 September 2023 | demo-bgvideo | mod_lmcustom | |
135 | Test article-category | 1 April 2021 | demo-up-module | mod_lmcustom | |
166 | Menu footer | footer | mod_lmcustom_menu | ||
180 | test | footer | mod_lmcustom | ||
142 | Donation | footer-droit | mod_custom | ||
167 | menu top | 19 June 2022 | menu | mod_lmcustom_menu | |
143 | Connexion | mod_login | mod_login | ||
168 | Recherche | mod_search | mod_finder | ||
137 | GTranslate | mod_translate | mod_gtranslate | ||
183 | Test perso Joomla | top-a | mod_custom |
{up sql=modules | select=id,position,published,title,publish_up,module | where=client_id=0 | order=position
| header=ID,Etat,Titre,Publié le,Position,Module
| template=##id## ##published## ##title## ##publish_up## ##position## ##module##
| col=d5-c5
| sort=i-s,3-s-s-s
| published-format=list[-2:icon-trash, 0:icon-unpublish t-rouge, 1:icon-publish t-vert
| published-model=[span class="%s"][/span]
| publish_up-format=date[%e %B %Y]
| published-rowclass=list[-2:bg-gris, 0:bg-rougeClair
| module-colclass=regex[#mod_lm#:bg-rouge t-jaune,#login#:bg-vert
}
ligne 9 : le suffixe -rowclass au nom de la colonne indique que nous mettons une condition sur la donnée de celle-ci. Selon le statut published, la ligne sera rouge ou grise ... ou sans changement !
ligne 10 : le suffixe -colclass va agir sur la colonne (la cellule TD). Nous utilisons ici le type regex. Si le mot "mod_lm" est trouvé, la cellule sera sur fond rouge et si c'est le mot "login", le fond sera vert.
Il n'est pas possible de mettre des conditions portant sur plusieurs colonnes.
Aide
Conscient de la difficulté d'utiliser cette action, j'ai mis en place plusieurs mécanismes d'aide.
Debug
En plus des informations habituelles, l'ajout d'une option debug au shortcode va afficher la requête SQL.
Un bon moyen pour comprendre pourquoi le résultat n'est pas celui attendu.
Exemple pour la démo requête avec jointure
Erreur SQL
Lors d'une erreur "fatale" SQL, le message est intercepté et affiché au début de la page
Exemple d'utilisation d'une table inexistante
Erreur de saisie
Bien qu'il soit possible d'utiliser des options non prévues, un contrôle de cohérence est réalisé.
Si vous utilisez un nom qui ne correspond pas à une colonne ou un suffixe (-format, -model) non autorisé, vous serez prévenu.
Exemple : les erreurs détectées dans le shortcode ci-dessous
{up sql=content | template=##idd## ##title##| title-xxx=text | xxxtitle-model=titre: %s | title-format=badtype[12]}
Exemple de code
Retourner une valeur calculée (v2.5)
Le langage SQL permet d'aggréger des données pour faire des calculs. J'utilise cette possibilité pour afficher le nombre d'actions de UP sur la page d'accueil de ce site.
une action parmi les {up counter=0,{up sql=content | select=count(id) | where=catid=8 and state=1}
| width=40px
| style=font-size:24px;font-weight:bold} proposées à ce jour.
Le shortcode sql retourne le nombre d'articles (count(id)) publiés (state=1) de la catégorie démos (catid=8)
Aide à la saisie
Il est délicat de se souvenir du nom exact des tables et de ses colonnes.
Pour éviter d'aller fouiller dans PhpMyAdmin, cette action dispose d'une option dbinfos qui affiche des informations sur la base de données courante dans le bloc des messages Joomla en haut de la page.
{up sql | dbinfos}
affiche la liste des tables
{up sql=#_nom_table | dbinfos}
affiche le nom et le type des colonnes de la table indiquée. Les clés sont soulignées.
upactionslist (1) readmore (1) csv2def (2) tabslide (1) toc (1) sql (7) modal (2) flexbox (5) icon (2) jcontent-info (1)