SPIP 4.0

Changements apportés par SPIP 4.0

Interface

Espace privé relooké

Un gros travail d’ergonomie a été initié pour rendre à terme l’espace privé adaptatif sur toutes les tailles d’écrans afin d’en faciliter l’usage.

L’espace privé s’adapte mieux à la largeur de l’écran, et commence à utiliser différentes variables CSS pour faciliter sa maintenance.

Aperçu de l’espace privé de SPIP 4.0
L’espace privé de SPIP  4.0 dans le site SPIP  Contrib.
Vue d’un article (avec la couleur grise)
Édition d’un article (avec la couleur grise)

Un écran de connexion (login) élégant

La page de connexion par défaut (login.html) est toute re-stylée, teintée du rose SPIP en fond.

Écran de connexion par défaut à SPIP  4.0
L’écran de connexion sur le site SPIP.net.

Et si le rose vous surprend, pas de panique ! Un nouveau formulaire dans la configuration de l’identité du site existe. Il permet de choisir la couleur qu’on veut. Et mieux : il permet même de déposer une magnifique image de fond.

Écran de connexion avec une image, dans SPIP  4.0

Iconographie en SVG

Une grande partie des icones et illustrations dans l’espace privé de SPIP et ses plugins sont passés en SVG.

  • Tickets #4468 et #4562 : Harmonisation dans l’espace privé du HTML & CSS des boutons
  • Nouveau jeu d’icône basé sur le thème Numix (en SVG) pour les types de document de la médiathèque

Documents & Logos

Un gros travail a été fait sur les documents et logos :

  • Les logos des articles et autres objets éditoriaux sont stockés comme les documents (dans spip_documents en base de données, et dans IMG/logo/ sur le disque en conservant le nom du fichier). Une phase de migration déplace les logos à leur nouvel emplacement sur le disque.
  • Les logos, documents images et filtres d’images acceptent et gèrent le format SVG
  • Le filtre balise_img permet de gérer des fichiers SVG et de déclarer leur taille
  • Le nouveau filtre balise_svg permet d’intégrer le code source d’un fichier d’image SVG dans le code html directement. Peut être pratique par exemple pour les petites icônes.
  • Les documents / logos peuvent être téléversés par drag’n’drop, quelles que soient leurs tailles (intégration du plugin BigUp en plugins-dist, amélioré pour l’occasion). La taille maximum autorisée est configurable.
  • Les modèles de documents (<docXX>, <imgXX>, ...) sont revus et simplifiés et utilisent la balise <figure>. Commit fa13018a. Attention : Les modèles doc.html, img.html et emb.html ne sont plus utilisés (et donc toute ancienne surcharge de ces fichiers dans des plugins ou squelettes ne sera plus utilisée). À la place, on utilise les modèles image.html, audio.html, video.html et file.html, correspondant au type de document. Le mode de document n’est plus pris en compte pour le calcul du modèle. NB : afin de ne pas casser vos anciens sites, un plugin de rétro-compatibilité permet de retrouver les anciens modèles.
  • Possibilité de décliner les fichiers HTML des modèles de document par type de fichier (mime type) détaillé : file_text_csv.html ou principal : file_text.html ; ou par extension : video_mp4.html. En conséquence vos variantes personnalisées doc_[variante].html correspondant au raccourci <docN|variante> ne fonctionneront plus et sont à décliner : image_[variante].html, video_[variante].html, etc.
  • L’écriture des raccourcis SPIP des modèles de documents <docXX>, <imgXX> ou <embXX> devient équivalente. L’écriture recommandée est <docXX> (où XX est le numéro du document).
  • La notion de Portfolio et de mode document / image sur les documents disparaît. Commit 9cf774b9. La constante _COMPORTEMENT_HISTORIQUE_PORTFOLIO déclarée à true permet de rétablir l’ancien fonctionnement.

Compatibilité PHP

Limitation de la compatibilité de SPIP 4.0 avec PHP de 7.3 à 8.0. De nombreuses notices, dépréciations ont été aussi corrigées. À noter que SPIP  3.2 sera donc la dernière version de SPIP à être compatible avec PHP  5.

Base de données

SPIP 4.0 fonctionne avec Mysql ou Sqlite. Il peut mettre à jour une base issue d’un SPIP >= 2.0.0.

Pour une mise à jour d’un SPIP antérieur, une étape de migration en SPIP 3.2 sera nécessaire.

Syntaxe des squelettes étendue

Ajout du support des boucles anonymes : <BOUCLE(ARTICLES)>

Marre du fichage ? une boucle anonyme n’a pas besoin de préciser son nom !
Un identifiant lui sera automatiquement attribué en interne.

[(#REM) Une boucle nommée ]
<B_mon_nom>
    <ul>
<BOUCLE_mon_nom(ARTICLES){id_article}{0,5}>
    <li>#TITRE</li>
</BOUCLE_mon_nom>
    </ul>
</B_mon_nom>
[(#REM) Une boucle anonyme ]
<B>
    <ul>
<BOUCLE(ARTICLES){id_article}{0,5}>
    <li>#TITRE</li>
</BOUCLE>
    </ul>
</B>

Et si vous êtes ambitieux, vous pouvez en mettre autant que vous le souhaitez dans un squelette, et même les imbriquer ! Mais bon, pensez à vos successeurs pour ne pas rendre le code trop anonyme à ne plus pouvoir s’y retrouver :)

<B>
    <ul class="rubriques">
<BOUCLE(RUBRIQUES){racine}{par num titre, titre}>
    <li>
        <h3>#TITRE</h3>
        <B>
            <ul class="articles">
        <BOUCLE(ARTICLES){id_rubrique}{!par date}{0,5}>
            <li><a href="#URL_ARTICLE">#TITRE</a></li>
        </BOUCLE>
            </ul>
        </B>
    </li>
</BOUCLE>
    </ul>
</B>

Ajout des parties non conditionnelles de boucles, avant <BB_boucle> et après </BB_boucle>

Une syntaxe pour des parties non conditionnelles aux boucles est ajoutée : ce contenu sera toujours affiché, qu’il y ait un résultat ou pas, tout en permettant d’utiliser les balises propre à la boucle (#TOTAL_BOUCLE, #TRI, etc).

Cette syntaxe sert particulièrement pour les tableaux d’éléments avec des tris et filtrages. Si la boucle ne retourne pas d’éléments, on souhaite toujours afficher les filtres (pour les décocher / les modifier).

[(#REM) Une partie non conditionnelle avant / après la boucle ]
<BB_non_conditionnel>
    [(#REM) cette partie est affichée même si la boucle ne retourne pas d’articles ]
    <h3>Les articles</h3>
    Nombre :  #TOTAL_BOUCLE<br>
<BOUCLE_non_conditionnel(ARTICLES){id_article?}{id_rubrique?}{!par date}{0,5}{', '}>
    <a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_non_conditionnel>
   [(#REM) cette partie est affichée même si la boucle ne retourne pas d’articles ]
   <nav class="pagination" role="navigation">#PAGINATION</nav>
</BB_non_conditionnel>

Cela complète les parties conditionnelles des boucles avant <B_boucle> et après </B_boucle> qui elles s’affichent uniquement si la boucle a au moins un résultat.

[(#REM) Une partie conditionnelle avant / après la boucle ]
<B_conditionnel>
    [(#REM) cette partie n’est affichée que si la boucle retourne des articles ]
    <h3>Les articles</h3>
    Nombre :  #TOTAL_BOUCLE<br>
<BOUCLE_conditionnel(ARTICLES){id_article}{id_article?}{id_rubrique?}{!par date}{0,5}{', '}>
    <a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_conditionnel>
    [(#REM) cette partie n’est affichée que si la boucle retourne des articles ]
    <nav class="pagination" role="navigation">#PAGINATION</nav>
</B_conditionnel>
    <h3>Aucun article</h3>
<//B_conditionnel>

La partie non conditionnelle des boucles peut se coupler avec la partie conditionnelle :  dans se cas elle encadre la partie conditionnelle.

[(#REM) Mix non conditionnel / conditionnel avant / après ]
<BB_mix>
<div class="articles">
   <h3>Les articles</h3>
<B_mix>
    <ul>
<BOUCLE_mix(ARTICLES){id_article}{id_article}{!par date}{0,5}{', '}>
    <li>#TITRE</li>
</BOUCLE_mix>
    </ul>
    <nav class="pagination" role="navigation">#PAGINATION</nav>
</B_mix>
</div>
</BB_mix>

Ajout du support des boucles dans la partie conditionnelle des balises

Oui ! On peut maintenant mettre des boucles dans des balises !
Si si ! Dans les parties conditionnelles des balises.

Quelques exemples :

[(#BALISE) <BOUCLE(ARTICLES) {0,1}>#TITRE</BOUCLE> ]

[<BOUCLE(ARTICLES) {0,1}>#TITRE</BOUCLE> (#BALISE)]

[(#ENV{documents}|oui)
<B_docs>
    <ul>
<BOUCLE_docs(DOCUMENTS){id_article}{par num titre, titre}{mode=document}>
    <li>
        <a href="#URL_DOCUMENT">
        [(#TITRE|sinon{Document n°#ID_DOCUMENT})] \(#EXTENSION\)
        </a>
    </li>
</BOUCLE_docs>
    <ul>
</B_docs>
]

Changements et apports pour les squelettes

Les balises #PAGINATION nécessitent un changement de syntaxe et d’arguments.

Le changement porte 1) sur la balise englobante, qui doit être nav 2) sur les arguments.

1) La balise englobante doit désormais être <nav class="pagination">.

Jusqu’à SPIP 3.2, on écrivait par exemple :

[<p class='pagination'>(#PAGINATION)</p>]

Avec SPIP 4.0, il faut maintenant utiliser :

[<nav class='pagination' role='navigation'>(#PAGINATION)</nav>]

2) Il n’existe plus qu’un seul modèle de pagination. De ce fait, les différences de rendu de la pagination se font en lui passant des arguments.

  • afficher_lien_precedent=oui pour afficher le < vers les résultats précédents
  • afficher_lien_suivant=oui pour afficher le > qui mène aux résultats suivants
  • afficher_lien_tous=oui pour afficher un lien permettant de voir tous les résultats simultanément. Dans ce cas, le texte du lien est "" par défaut, mais il est possible de spécifier un autre label avec l’argument label_tous. Exemple : label_tous=tous.
  • nombre_liens_max permet de définir le nombre de lien de pagination maximum affiché par le modèle. On peut également employer la constante _PAGINATION_NOMBRE_LIENS_MAX pour l’espace public ou _PAGINATION_NOMBRE_LIENS_MAX_ECRIRE pour l’espace privé.

Le premier argument peut indiquer quel est le type de pagination désiré. On peut également l’indiquer avec un argument type_pagination.
Exemple : #PAGINATION{naturel} est équivalent à #PAGINATION{type_pagination=naturel}.

  • type_pagination=page pour afficher les n° de page : 1, 2, 3, 4...
  • type_pagination=rang pour afficher les rangs : 0, 10, 20, 30...
  • type_pagination=naturel pour afficher les rangs avec 1 à la place du 0 : 1, 10, 20, 30...
  • type_pagination=resultats pour afficher les rangs de 10 en 10 à partir de 1 : 1, 11, 21, 31...
  • type_pagination=page_precedent_suivant est la combinaison d’une pagination de type page avec les liens précédents et suivants.

L’utilisation de la balise dans l’espace privé est détectée automatiquement, ce qui rend inutile le passage de l’argument type_pagination=prive. La compatibilité avec l’ancienne syntaxe étant toutefois assurée sur ce point, on pourra conserver, sur des anciens squelettes, l’argument de l’ancienne version ainsi :

[<nav class='pagination' role='navigation'>(#PAGINATION{prive})</nav>]

Critère {id_?}

Le critère {id_?} permet de faire toutes les liaisons possibles avec les variables d’environnement. Il se comporte donc comme autant de critères {id_xxx ?} que possibles pour la boucle donnée.

Voir id_ ?

Fonction lister_champs_id_conditionnel et pipeline exclure_id_conditionnel

Le critère {id_?} s’appuie directement sur la fonction lister_champs_id_conditionnel($table) qui retourne une liste des champs de sélection conditionnelle possibles pour cette table.

Le calcul est fait à partir des champs commençant par ’id_’ dans la table, ainsi qu’avec un éventuel champ ’objet’. On complète ensuite avec les clés primaires des tables éditoriales qui peuvent être liées facilement.

Enfin, le résultat traverse le pipeline exclure_id_conditionnel qui permet d’exclure certains champs de la liste calculée par la fonction lister_champs_id_conditionnel. Voir l’exemple dans le plugin Brèves ou le plugin SVP.

Critère {par_ordre_liste champ,#LISTE{...}}

Nouveau critère par_ordre_liste pour ordonner une boucle selon un ordre précis.

Critère {fusion_supprimer}

Ce critère entre dans le Core. Il était jadis défini dans le plugin SPIP-Bonux. Important : Il faut mettre à jour le plugin SPIP-Bonux, s’il est actif, en version >= 3.7.1 avant de mettre à jour le site vers SPIP 4.0 pour éviter un conflit.

Filtre et fonction identifiant_slug

Ticket #4628 : ajout de la fonction identifier_slug(). Permet de transformer un texte clair en nom court pouvant servir d’identifiant, class, id, url… en ne conservant que des caractères alphanumériques et un separateur.

Filtres label_nettoyer et label_ponctuer

Ces filtres sont ajoutés pour gérer et utiliser un peu mieux les chaînes de langues historiques de SPIP (parfois avec des :, parfois sans).

  • label_nettoyer enlève les : en fin de texte
  • label_ponctuer ajoute  : en fin de texte

Évolution des critères {tri} et {par num xxx}

  • Le critère {tri xxx} accepte un #TRI{par numéro, num xxx} se comportant comme {par num xxx} (les éléments sans numéros sont classés après les éléments ayant un numéro)
  • Le critère {par num xxx} intègre automatiquement le critère {par sinum xxx} avant lui : ainsi dans (ARTICLES){par num titre}, les articles sans numéros (ou avec le numéro 0) passent après les articles ayant un numéro

Autres points sur les squelettes

  • Nouveaux arguments de #FORMULAIRE_INSCRIPTION et #FORMULAIRE_LOGIN
  • Nouveaux filtres ajouter_class, supprimer_class et commuter_class
  • Filtre lien_ou_expose amélioré
  • Le filtre |singulier_ou_pluriel peut être étendu pour chaque langue en créant son propre filtre singulier_ou_pluriel_<lang>, qui sera appelé si la langue correspond
  • Nouveau filtre appliquer_si_filtre en complément de appliquer_filtre : le 1er renvoie le contenu initial si le filtre cherché n’existe pas, le 2nd ne renvoie plus rien.

Squelettes-dist (thème de l’espace public par défaut)

  • Le squelettes-dist par défaut utilise maintenant une syntaxe HTML5

Autres apports

  • Intégration de la librairie Javascript Sortable.js pour prendre en charge le glisser-déposer de façon plus fluide, notamment pour ordonner les documents, en remplacement du module de jQuery UI.
  • Une nouvelle boite modale légère, accessible, responsive et plus jolie basée sur Lity
  • Une feuille de style XSLT fournit des flux RSS stylés
  • Le graphique des statistiques refait à neuf (il utilise d3.js)
  • Le compagnon peut être ignoré pour chaque auteur qui connait déjà SPIP
  • L’option "se limiter au HTML4" pour l’espace public est supprimée. Les squelettes par défaut (la dist) passent en HTML 5 (plugin de rétro-compatibilité)
  • L’attribut summary pour les tableaux est enlevé
  • Intertitres de niveau h2 par défaut, et plus de niveau h3 comme c’était le cas avant (plugin de rétro-compatibilité)
  • La fonction autoriser_exception() accepte un argument * en guise d’id : cela l’autorise pour tout id. Quand on annule une exception avec *, cela annule toutes les exceptions pour cet objet, même celles qui auraient été posées individuellement avec des ids.
  • Le filtre heure_minutes accepte en argument optionnel abbr lorsqu’on ne souhaite pas indiquer l’unité des minutes. Ainsi [(#DATE|heures_minutes{abbr})] affichera, par exemple : 17h26
  • La constante _AUTO_SELECTION_RUBRIQUE, qui permet d’affecter automatiquement une rubrique à la création d’un article si sa valeur est true accepte maintenant en plus un entier : dans ce cas cela correspond à l’identifiant de rubrique à attribuer par défaut.
  • Si le 3è paramètre (class) de #BOUTON_ACTION{libellé, url, class ,message de confirmation} contient "ajax", cette classe est ajoutée au formulaire qui contient le bouton.

Corrections

  • Mise à jour de toutes les librairies JS utilisées
  • [login] Ticket #3957 : Ne plus afficher le cadenas sur la page login, trop ambigu avec le cadenas https du navigateur.
  • [admin] Le lien "Afficher les visiteurs" n’est pas présenté s’il n’y a pas d’utilisateurs avec ce statut sur le site.
  • [svp][plugins] S’il y a une erreur XML sur un paquet.xml, elle est directement explicitée sur la page de gestion des plugins.

Nettoyages

Plugins

  • Les fichiers plugin.xml des plugins SPIP 2.x ne sont plus interprétés. Seuls les paquet.xml le sont désormais. Un plugin qui n’aurait donc que plugin.xml (sans paquet.xml à côté) ne fonctionnera donc plus à partir de SPIP 4.0.

Divers

  • Ticket #4060 : Nettoyage code < PHP 5.4
  • Nettoyage code & CSS <= IE9
  • Nettoyage htaccess (plus de compat sur les URLs .php(3) de SPIP <= 1.8

Fichiers

  • Suppression de inc/mail déprécié depuis SPIP 2. Utiliser par exemple :
    $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
    $envoyer_mail(...);
    
  • Suppression de action/preferer.php inutilisé depuis SPIP 3.2 (suppression de ecrire/oo/).
  • Supression de exec/valider_xml.php non fonctionnel, déplacé dans le plugin à corriger Valider XML
  • Suppression de exec/fond_monobloc.php. Créer les squelettes de l’espace privé dans prive/squelettes.

Balises / Filtres / Critères

  • Suppression des balises #DEBUT_SURLIGNE et #FIN_SURLIGNE dépréciées depuis SPIP 2. Utiliser les classes CSS surlignable et pas_surlignable.
  • Les filtres aligner, aligner_gauche, aligner_droite, centrer, justifier et style_align sont supprimés. Utiliser du code CSS pour obtenir le même résultat.
  • Suppression de #LOGIN_PRIVE. Utiliser #FORMULAIRE_LOGIN
  • Suppression de #LOGIN_PUBLIC. Utiliser #FORMULAIRE_LOGIN
  • Suppression de #DOSSIER_SQUELETTE. Utiliser #CHEMIN
  • Suppression de #NOOP. Utiliser #VAL
  • Suppression de {datasource ...}. Utiliser directement le critère {source ...}

Fonctions PHP

  • Suppression de echo_log() (inutile maintenant).
  • Suppression de spip_fetch_array(). Utiliser sql_fetch() à la place.
  • Suppression de generer_url_retour(). Utiliser parametre_url() à la place, avec le paramètre ’redirect’.
  • Suppression de charger_php_extension() (utiliser extension_loaded())
  • Suppression de revisions_articles(). Utiliser article_modifier()
  • Suppression de revision_article(). Utiliser article_modifier()
  • Suppression de articles_set(). Utiliser article_modifier()
  • Suppression de insert_article(). Utiliser article_inserer()
  • Suppression de instituer_article(). Utiliser article_instituer()
  • Suppression de insert_auteur(). Utiliser auteur_inserer()
  • Suppression de auteurs_set(). Utiliser auteur_modifier()
  • Suppression de instituer_auteur(). Utiliser auteur_instituer()
  • Suppression de revision_auteur(). Utiliser auteur_modifier()
  • Suppression de insert_rubrique(). Utiliser rubrique_inserer()
  • Suppression de revisions_rubriques(). Utiliser rubrique_modifier()
  • Suppression de instituer_rubrique(). Utiliser rubrique_instituer()
  • Suppression de admin_repair_plat(). Les fichiers .plat ne sont plus utilisés. Cette fonction n’est plus appelée depuis r14292
  • Suppression de version_svn_courante(). Utiliser version_vcs_courante()
  • Suppression de lire_meta(). Utiliser $GLOBALS['meta'][$nom] ou lire_config('nom')
  • Suppression de auteur_referent(). Utiliser auteur_associer()
  • Suppression de table_jointure(). Utiliser Utiliser l’API editer_liens ou les tables de liaisons spip_xx_liens ou spip_yy_liens, selon.
  • Suppression de modifier_contenu(). Utiliser les fonctions génériques pour l’API de modification de contenu.
  • Suppression de revision_objet(). Utiliser objet_modifier().
  • Suppression de notifier_publication_article().
  • Suppression de notifier_proposition_article().
  • Suppression de calcul_branche(). Utiliser calcul_branche_in().
  • Suppression de ecrire_metas().
  • Suppression de spip_query_db(). Utiliser sql_query() ou autre.
  • Suppression de spip_get_lock() et spip_release_lock() qui n’étaient plus utilisées.
  • Suppression de recuperer_entetes(). Utiliser recuperer_entetes_complets().
  • Suppression de maj_version() et upgrade_vers() qui ne servent plus.
  • Suppression de upgrade_types_documents(). Utiliser directement creer_base_types_doc() du plugin Medias

Dépréciations

  • La <BOUCLE(POUR) et son critère {tableau ...} sont dépréciés au profit de la <BOUCLE(DATA)> et son critère {source table, ...}.
  • De même, le fitre |foreach est déprécié au profit de la syntaxe à base de boucle (DATA).

Plugins

-  Les plugins breves, jquery_ui, organiseur, petitions, vertebres, squelettes_par_rubriques ne sont plus distribués avec SPIP par défaut.
-  Mais breves, organiseur, petitions, squelettes_par_rubriques sont toujours maintenus !
-  jquery_ui est maintenu par la communauté, mais déprécié
-  vertebres bien que fonctionnel en SPIP 4.0 est abandonné : le plugin Adminer est une alternative plus complète.
Pour faciliter la suppression de leurs tables dans la base de données lors de la migration 3.2 -> 4.0, le plugin dédié Léon est mis à votre disposition : https://contrib.spip.net/leon-le-nettoyeur

Breves

Fonctions PHP

  • Suppression de insert_breve(). Utiliser breve_inserer()
  • Suppression de revisions_breves(). Utiliser breve_modifier()

Grenier

Le grenier est nettoyé et ne contient plus que les fonctions enlevées de SPIP 3.2 et SPIP 4.0.
Ce qui est antérieur à SPIP 3.2 n’est plus présent dedans.

Il reçoit les différentes fonctions et fichiers supprimés de SPIP 4.0 qui pouvaient potentiellement être utilisés par des squelettes ou plugins.

Medias

Fonctions PHP

  • Suppression de document_set(). Utiliser document_modifier()
  • Suppression de insert_document(). Utiliser document_inserer()
  • Suppression de revision_document(). Utiliser document_modifier()
  • Suppression de afficher_documents_colonne(). Utiliser l’inclusion prévue ou une véritable déclaration d’objet éditorial (la colonne document est alors affichée automatiquement sur la page d’édition de l’objet)
  • Suppression de lien_objet(). Utiliser generer_lien_entite()
  • Suppression de instituer_document(). Utiliser document_instituer()

Mots

Fonctions PHP

  • Suppression de groupemots_inserer(). Utiliser groupe_mots_inserer() ou objet_inserer()
  • Suppression de groupemots_modifier(). Utiliser groupe_mots_modifier() ou objet_modifier()
  • Suppression de revision_groupe_mot(). Utiliser groupe_mots_modifier()
  • Suppression de insert_mot(). Utiliser Utiliser mot_inserer()
  • Suppression de mots_set(). Utiliser mot_modifier()
  • Suppression de revision_mot(). Utiliser mot_modifier()

Pétitions

L’utilisation des pétitions est maintenant optionnelle : elles sont désactivées par défaut sur les nouvelles installations [1]. Vous pouvez les activer dans la configuration des contenus du site.

Sites

Fonctions PHP

  • Suppression de insert_syndic(). Utiliser site_inserer()
  • Suppression de revisions_sites(). Utiliser site_modifier()
  • Suppression de syndic_set(). Utiliser site_modifier()
  • Suppression de instituer_syndic(). Utiliser objet_instituer()

Notes

[1Sur les installation existantes, ce n’est le cas que si elles nétaient pas utilisées auparavant

Auteur erational, Matthieu Marcillaud, tcharlss Publié le : Mis à jour : 18/10/23

Traductions : English, Español, français