SPIP - français, ces 365 derniers jours
SPIP est un système de publication pour l’Internet qui s’attache particulièrement au fonctionnement collectif, au multilinguisme et à la facilité (…)
Lac de Créteil - 94000 - Val de Marne - France
Pour nous contacter, cliquez sur l’enveloppe.http://laccreteil.fr/spip.php?page=…
vendredi 23 septembre 2022
Pour afficher les images inclues dans le texte d'un objet, les squelettes spécifient souvent une taille d'affichage maximum au moyen du filtre
|image_reduire
afin de limiter leur taille d'affichage. À noter que la taille d'affichage peut aussi être modifiée lorsque l'on passe un paramètre|largeur=xxx
au modèle d'insertion.Indépendamment de cette taille, la vignette des images dont les dimensions originales sont plus grandes que la valeur de la constante
_IMAGE_TAILLE_MINI_AUTOLIEN
comportent un lien permettant de les afficher en grand dans la Mediabox. Par défaut, la valeur de cette constante est de 800 pixels de large ou de haut. Il est possible de personnaliser cette valeur dans votre fichierconfig/mes_options.php
(voir l'article qui lui est consacré).Exemple :
Il est possible de désactiver ces liens automatiques en spécifiant une valeur très élevée :
Sommaire
pour illustrer l'article,
et
SPIP 4 permet d'ajouter des images aux articles d'une façon simple et standardisée à travers un modèle unique
Ajouter une image à un article
Vous sélectionnez l'image à télécharger depuis votre disque dur. Après le chargement, l'image apparaît alors à coté de l'article avec son numéro unique.
Vous pouvez ensuite effectuer les actions suivantes :
dans le texte de votre article (voir paragraphe suivant)Utiliser le code de l'image
pour illustrer l'articlePour placer l'image dans votre article il suffit d'ajouter le code obtenu
dans le texte de l'article.Ce qui donne le résultat suivant :
Pour afficher les images inclues dans le texte d'un objet, les squelettes spécifient souvent une taille d'affichage maximum au moyen du filtre
|image_reduire
. Indépendamment de cette taille, la vignette des images dont les dimensions originales sont plus grandes que la valeur de la constante _IMAGE_TAILLE_MINI_AUTOLIEN comportent un lien permettant de les afficher en grand dans la Mediabox.Quoiqu'il en soit, il faut garder à l'esprit que l'affichage final sur le site publique peut énormément varier selon l'habillage graphique du site et aussi selon le périphérique ("device") avec lequel vous consultez le site.
Aligner l'image avec les codes
,
et
Vous pouvez aussi préciser l'alignement de l'image avec les codes suivants
L'image se place dans le fil du texte
|left
>L'image se place à gauche et le fil du texte continue sur sa droite jusqu'à dépasser l'image en hauteur
|center
>L'image se place au centre et le texte passe à la ligne
|right
>L'image se place à droite et le fil du texte continue sur sa gauche jusqu'à dépasser l'image en hauteur
Renseigner les informations d'une image
Il est possible d'aller plus loin et d'ajouter un titre, un légende, des crédits à une image.
Pour cela, il faut cliquer sur le bouton "modifier"
Vous pouvez alors renseigner le titre, la description de l'image, ses crédits, le texte alternatif de l'image...
Ce qui peut donner l'affichage suivant
Les images "vues"
Les images dont on a utilisé le code dans l'article sont marquées dans l'espace privé avec une icône "œil".
Ce sont les images filtrées par le critère
{vu}
. On ne peut pas supprimer ou détacher ces images. Il faudra donc au préalable supprimer les codes
correspondants dans le texte de l'article.Dans le squelette par défaut, les images restantes sont listées dans un portfolio en bas de l'article.
Organiser les images d'un article
Dans la partie privée, toutes les images de l'article sont listées en bas de l'article.
Les boutons suivants permettent de changer les vues (plus ou moins compactes).
Il est aussi possible de modifier l'ordre des images via un glisser-déposer.
Dans le squelette par défaut, cette fonctionnalité permet de ranger les images qui sont listées dans le portfolio.
Autres options du formulaire d'ajout d'images
/tmp/upload
du serveur.Évolutions par rapport aux versions précédentes de SPIP
L'utilisation des images a été simplifiée en SPIP 4.
Pour les rédacteurs et rédactrices habitué⋅es aux versions SPIP 3 et précédentes, les principaux changements sont :
![]()
et
(qui restent néanmoins actifs pour assurer une rétro-compatibilité) au profit du modèle unique
.Explications détaillées : changements dans la gestion des images avec SPIP4.0
Le filtre
|lignes_longues
, introduit des césures dans les mots « trops longs » en y insérant des espaces sécables qui permettent alors le passage à la ligne (utile, par exemple, pour afficher des urls dans une colonne étroite).Ainsi, si le #TEXTE d'un article contient un lien comme :
alors
affichera
Noter que la césure conserve les tag html ; dans l'exemple ci-dessus, tout le lien est cliquable comme on peut le voir dans le source html.
Ce filtre coupe par défaut à 70 caractères, mais on peut spécifier une autre longueur en passant un paramètre au filtre, par exemple :
[(#TEXTE|lignes_longues{40})]
.mardi 23 août 2022
Il est parfois utile de vouloir récupérer le contenu d'une boucle parente de celle en cours, à travers une balise. SPIP dispose d'une écriture pour cela (n étant l'identifiant de la boucle voulue) :
#_n:BALISE
Exemple
Afficher systématiquement le titre de la rubrique en même temps que le titre de l'article :
vendredi 19 août 2022
Lorsque cette constante est définie à true, SPIP ajoute une variable
type-page
dans l'environnement de tous les squelettes de premier niveau et dans certains pipelines. Cette variable contient le nom de la page courante :- sur la page d'un objet éditorial, c'est le type d'objet : "article", "rubrique", ou "patate" ;
- sur une page indépendante, c'est le nom du squelette.
Comme certains plugins se servent de cette variable, il n'est pas recommandé de changer sa valeur.
Depuis SPIP 4.0, cette constante est définie
true
par défaut.C'est utilisé notamment par le plugin Z-Core et dans la partie privée de SPIP pour la construction des pages avec l'architecture Z.
jeudi 18 août 2022
Cette constante sert à détecter si le serveur accepte une redirection par
header("location: $url")
après la pose d'un cookie. Elle contient l'expression régulière qui doit être employée pour tester la valeur de la variable$_SERVER['SERVER_SIGNATURE']
. Par défaut cette expression est"Apache|Cherokee|nginx"
Lorsque le test est négatif, c'est un
header("Refresh: 0; url=$url");
qui sera employé.Voir aussi _SERVEUR_SOFTWARE_ACCEPTE_LOCATION_APRES_COOKIE.
Cette constante, lorsqu'elle est définie, indique qu'il ne faut pas comptabiliser de visite dans les statistiques de SPIP. Ce sera utile, par exemple, lorsqu'on utilise un marqueur javascript pour les statistiques.
define ('_STATS_INHIB_COMPTER_VISITES_AFFICHAGE_ENTETES_FINAL', true);
La configuration des statistiques dans l'espace privé de SPIP permet également de les désactiver, mais avec cette constante, c'est possible depuis le code, par exemple pour certaines pages seulement.
jeudi 31 mars 2022
Le filtre
|balise_svg
permet d'intégrer le code d'une image svg dans le HTML, afin de l'afficher.Sommaire
Depuis SPIP 4.0, la balise |balise_img prends en charge les images svg. Les fichiers SVG sont alors référencés en tant que valeur de l'attribut
src
d'une baliseimg
.Le filtre
|balise_svg
permet, quant à lui, d'insérer directement dans le HTML le contenu du fichier SVG, avec ou sans attributalt
selon les bonnes pratiques [1].Ce sera utile pour de petites icônes, ou lorsqu'on veut bénéficier des attributs
title
définis à l'intérieur du SVG.Paramètres optionnels
Ce sont les mêmes que ceux du filtre
|balise_img
(voir les détails) :alt
texte alternatif ; une valeur nulle pour explicitement ne pas avoir de balise alt sur l'image (au lieu d'un alt vide)class
null par defautsize
permettant de spécifier la taille du rendu - à partir de SPIP 4.0.produira le tag :
.
Voir aussi : Recommandations pour les icônes SVG utilisées dans l'interface SPIP
[1] telles que décrites par https://www.accede-web.com/notices/html-et-css/images-et-icones/gerer-lalternative-des-svg-images-vectorielles
vendredi 25 mars 2022
SPIP 4.1 est avant tout une version qui suit les versions maintenues de PHP (7.4 à 8.1) et met à jour différentes librairies utilisées en interne. Il modifie aussi le système d'authentification des auteurs.
Sommaire
transmettre
en .apiCompatibilité PHP
SPIP 4.1 nécessite PHP 7.4 minimum, et fonctionne jusqu'à PHP 8.1.
Il nécessite les extensions PHP : sodium, Zlib, Zip et Phar.
Rappel : SPIP 4.0 c'est PHP 7.3 à 8.0.
Compatibilité PHP 8.1
Pour la compatibilité PHP 8.1, nous avons du corriger / adapter de nombreuses fonctions.
Cela concerne particulièrement des appels à des fonctions de PHP traitant des chaînes de caractères, si elles reçoivent
null
au lieu d'une chaîne, pour éviter desdeprecated
: https://php.watch/versions/8.1/internal-func-non-nullable-null-deprecationAuthentification & Chiffrement
Nous reprenons en l'adaptant le travail de g0uz sur le plugin Chiffrer.
- Cela corrige certains rares cas où la librairie Javascript utilisée jusqu'à présent échouait à identifier l'utilisateur
- Cela renforce la sécurité en évitant certains types d'attaques.
# Le formulaire de login
HTTPS est désormais encore plus fortement conseillé
En effet, SPIP ne cherche plus à chiffrer le mot de passe des auteurs en Javascript depuis le formulaire de login, et le mot de passe arrive donc systématiquement « en clair » à SPIP. Il est donc fortement conseillé d'avoir son site en HTTPS, car HTTPS assure alors la sécurité de la transmission.
En conséquence, la constante
_AUTORISER_AUTH_FAIBLE
, qui permettait de forcer l'envoi du mot de passe en clair, est supprimée.# Poivre, sel, hash du mot de passe
Le mot de passe d'un auteur est maintenant haché dans SPIP en utilisant un poivre (une clé spécifique pour le site). Par ailleurs, la fonction
password_hash
de PHP s'occupe de trouver le meilleur algorithme de hachage et de créer un sel dedans. La fonctionpassword_verify
de PHP est utilisée pour le vérifier.Les "aléas" rotatifs des auteurs sont toujours créés, mais ne sont plus utilisés pour saler le mot de passe vu que PHP gère cela très bien. Par contre, l'application supplémentaire d'un poivre est une nouveauté.
Comme avant, à chaque authentification réussie d'un auteur, on enregistre un nouveau hash en base, en recréant un hash avec
password_hash
: cela applique un nouveau sel dessus donc, et éventuellement PHP en profite pour utiliser un algorithme de hachage plus performant si besoin.# Clés de chiffrement
Pour mener à bien ce poivre, et d'autres actions dans SPIP, des clés de chiffrement sont utilisées et stockées dans
config/cles.php
. Il y en a 2 par défaut :secret_du_site
de la tablespip_meta
. Ce secret du site (combiné) permet de signer et/ou chiffrer certaines parties de SPIP (contextes ajax, actions d'auteurs).Lorsqu'un webmestre se connecte, les clés sont sauvegardées dans le nouveau champ
backup_cles
de la tablespip_auteurs
, en le chiffrant avec le mot de passe en clair de l'auteur.Ceci permet de restaurer les clés du site si le fichier
cles.php
a été effacé, lors de l'authentification d'un webmestre.La classe
\Spip\Chiffrer\SpipCles
permet de manipuler les clés au besoin.# Password
SPIP fournit deux méthodes qui sont utilisées dans
ecrire/auth/spip.php
-
\Spip\Chiffrer\Password::verifier($clair, $hash, $key = null): bool
-
\Spip\Chiffrer\Password::hacher($clair, $key = null): string
La clé par défaut est celle de
secret_des_auth
, utilisée pour poivrer.# Chiffrement
Trois méthodes sont aussi fournies pour chiffrer et déchiffrer (chiffrage symétrique) des contenus.
Dedans nous utilisons la librairie Sodium (fournie par défaut dans PHP >= 7.2).
-
Chiffrement::chiffrer($message, $key): ?string
-
Chiffrement::dechiffrer($encoded, $key): ?string
-
Chiffrement::keygen(): string
La méthode
keygen
produit simplement une clé de chiffrement à la longueur adaptée.Les méthodes
chiffrer()
etdechiffrer()
seront très lentes si la clé transmise n'a pas la bonne longueur : on considère alors la clé de chiffrement comme étant un mot de passe nécessitant un traitement supplémentaire lourd (avecsodium_crypto_pwhash
).# Signature des actions
Les actions sont authentifiées maintenant en utilisant
hash_hmac
ethash_equals
(et les aléas d'auteurs et/ou le secret du site)Qualité du code
Il y a de quoi progresser sur la qualité du code PHP de SPIP… l'avenir ne peut être que meilleur ;-)
# Typage
Ce faisant pour PHP 8.1, nous avons commencé à typer certains arguments et retours de fonctions pour détecter au plus tôt certains appels incorrects.
C'est un changement potentiellement impactant : cela peut créer des erreurs de squelettes là où l'erreur était auparavant plus silencieuse ou tolérée. De même cela pourrait provoquer des erreurs PHP dans des plugins ou des scripts maison sur les appels erronés à ces fonctions.
En assurant la compatibilité avec les nouvelles versions de PHP nous irons forcément vers plus de typage dans le code de SPIP au fur et à mesure des évolutions et factorisations du code source.
La conséquence sera donc que les personnes développant des plugins ou des squelettes devront être plus vigilantes sur les appels effectués d'une part, et d'autre part que nous restreindrons certainement les nouvelles fonctions à des types uniques (éviter les
mixed
), de même que certaines fonctions déjà existantes verront probablement certains types d'arguments mixtes réduits (éviter qu'un argument puisse recevoir un peu tout commeint | string | array
par exemple), de même pour les retours de fonctions.Au vu du code de SPIP historique ce ne sera pas si évident.
# Sucre syntaxique
Nous avons passé l'outil Rector sur le code de SPIP 4.1 avec la configuration PHP 7.4. L'outil permet de transformer la syntaxe du code source PHP en modifiant certains éléments qui peuvent être simplifiés grâce à des écritures plus récentes de PHP. Par exemple utiliser les opérateurs
??
ou??=
lorsque c'est possible (Voir la doc PHP).C'est toujours ça de pris :-)
Changements d'API sur les URLs et objets
Certaines fonctions d'appels pour calculer ou décoder les URLs sont modifiées.
Les anciennes API sont dépréciées.
Il y a maintenant 2 jeux de fonctions distincts pour générer l'URL d'un objet et pour décoder une URL. Ce nouveau mécanisme permet de définir une fonction pour générer une URL propre pour les `#URL_PAGE`.
Les nouvelles fonctions sont typées. Dans les explications suivantes, on ne présente que le début des signatures des différentes fonctions modifiées.
Voir la demande d'ajout correspondante pour le détail complet.
# Encodage
generer_objet_url (anciennement
generer_url_entite
)Cette fonction génére une URL, qui peut être soit pour l'espace public (paramètre
$public = true
), soit pour l'espace privé ($public = false
), soit par défaut ($public = null
) retourner une URL pour l'espace dans lequel on se trouve actuellement …La fonction
generer_objet_url()
est la fonction de haut niveau, qui va finir par appeler une fonctionurls_xxx_generer_url_objet()
_dist selon le module d'URL actif.Note : Pour cette fonction la signature change légèrement.
Dans
generer_url_entite()
maintenant déprécié :$public
pouvait valoirtrue, false, null ou 'string'
. Dans le cas d'une chaine, il correspondait à un paramètre "connect".Ce sont maintenant 2 paramètres séparés pour
generer_objet_url
:?bool $public = null
(donctrue, false ou null)
,string $connect = ''
.Dans la majorité des cas, cela n'affectera pas les usages et renommer simplement la fonction devrait être suffisant.
generer_objet_url_ecrire
Générer l'URL d'un objet dans l'espace privé
generer_objet_url_absolue
Generer l'url absolue vers un objet
# Décodage
La fonction de décodage des URLs s'appelle maintenant
urls_xxxx_decoder_url_dist()
ce qui évite toute confusion avec l'ancienne fonctionurls_xxxx_dist()
.De plus, pour un module d'URLs qui voudrait être compatible avec les anciennes versions de SPIP et cette nouvelle convention, il suffit de proposer une fonction
urls_xxxx_dist()
non typée qui fait le routage vers les 2 fonctionsurls_xxx_generer_url_objet_dist()
etdecoder_url()
du module.# Objet
generer_objet_lien
Génère un lien (titre cliquable vers url) vers un objet
generer_objet_info
Donner une information sur un objet éditorial. Utilisé entre autres par
#INFO_XX
Les fonctions permettant de définir des calculs spécifiques pour l'obtention d'information sont aussi renommées. Pour l'information calculée 'xxx' : appelé via
generer_objet_info(3, 'article', 'xxx')
ou#INFO_XXX{article,3}
.Si ces fonctions existent, elles sont utilisées par SPIP dans ce cas :
L'ancien nommage est déprécié.
Suivant ce principe, la fonction interne à SPIP pour calculer l'introduction a été renommée :
generer_objet_introduction
Génère l'introduction de l'objet (fonction privée à SPIP), utilisé par
#INTRODUCTION
et#INFO_INTRODUCTION
)Réécriture de
transmettre
en .apiPour faciliter et sécuriser partiellement l'envoi de données spécifiques (CSV, JSON) à des auteurs connus de SPIP, l'URL d'api transmettre.api a été mis en place (elle remplace un ancien mécanisme à l'objectif identique qui utilisait un squelette
transmettre.html
).L'URL est générée avec la fonction
generer_url_api_low_sec()
(« low sec » signifiant ici « sécurité basse »). Un jeton fixe est créé pour cette action (avec ses paramètres) pour l'auteur désigné et sera acceptée même si l'auteur est déconnecté (ce qui veut dire que quiconque possède l'URL pourra accéder au contenu renvoyé).Historiquement cela permet de générer des fichiers non publics (RSS des articles proposés à publication, statistiques du site) qui peuvent être exploités par des outils tierces (agrégateur RSS par exemple).
Également :
securiser_acces()
est renommee ensecuriser_acces_low_sec()
et definie dans inc/acces.filtre_securiser_acces_dist()
dans inc/filtres pour la compat des vieux squelettesparam_low_sec()
est deprecieeMises à jour des librairies
Nous avons mis à jour différentes librairies utilisées par SPIP.
# Javascript
# PHP
Suppression de librairies
Nous avons supprimé
jQuery.cookie
qui était déprécié depuis SPIP 3.2 au profit de JS Cookie.Pour rappel si vous n'aviez pas encore adaptés vos utilisations :
Interface
Les rubriques dans l'espace privé affichent maintenant aussi la liste des articles refusés.
Nettoyages
Nous avons supprimé
#FORMULAIRE_CONFIGURER_METAS
qui était déprécié depuis SPIP 3.0 au profit des formulaires#FORMULAIRE_CONFIGURER_XX
. Voir la documentation Configurer une fonctionnalité de votre site, ou un plugin à ce sujet.Quelques adaptations
Dans un squelette, pour avoir la liste des tables des objets éditoriaux, préférer
#NULL
(qui retournenull
) plutôt que#REM
(qui retourne une chaîne vide).Plugins
Archiviste
Le plugin "Archiviste" a été mis à jour pour utiliser les extensions PHP Zip, zlib et Phar, qui sont désormais requises. Ceci nous a permis de supprimer les (très) vielles librairies Pcl* que nous traînions depuis quelques années.
À noter aussi que le plugin est accompagné de tests unitaires écrits avec PHPUnit.
Bigup
Le formulaire de configuration de Bigup est affiché sur la page des options avancées, avec une formulation un peu plus parlante pour le titre du formulaire d'explication.
Compresseur
Mise à jour de la librairie CSSTidy en version 2.0 et correction d'un bug dans la compression des fichiers Javascript sur certains environnements.
Forum
Mediabox
Medias
Plan
Mise à jour de la librairie Jstree en version 3.3.12.
Révisions
Correction d'un bug qui empêchait le fonctionnement du génie d'optimisation des révisions.
Sites
Statistiques
SVP
TextWheel
URLs étendues
Pour faire suite aux changements d'API sur les URLs et objets, les fonctions d'URLs ont été reprises pour une écriture plus claire et mieux typée avec 2 points d'entrée pour la partie décodage/encodage.
Voir la demande d'ajout correspondante pour le détail complet.
Squelettes dist
|header_silencieux
sur les pages publiques afin de respecter la valeur de la globalespip_header_silencieux
jeudi 10 mars 2022
Ce filtre s'applique aux dates.
-
|affdate_heure
retourne la date suivie de l'heure.[(#DATE|affdate_heure)]
affiche "10 mars 2022 à 12h10min".|affdate_heure
est une variante du filtre|affdate