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.
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.
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.
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
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èlesdoc.html
,img.html
etemb.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èlesimage.html
,audio.html
,video.html
etfile.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’argumentlabel_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 typepage
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 filtresingulier_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 optionnelabbr
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 esttrue
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 lespaquet.xml
le sont désormais. Un plugin qui n’aurait donc queplugin.xml
(sanspaquet.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é dansprive/squelettes
.
Balises / Filtres / Critères
- Suppression des balises
#DEBUT_SURLIGNE
et#FIN_SURLIGNE
dépréciées depuis SPIP 2. Utiliser les classes CSSsurlignable
etpas_surlignable
. - Les filtres
aligner
,aligner_gauche
,aligner_droite
,centrer
,justifier
etstyle_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()
. Utilisersql_fetch()
à la place. - Suppression de
generer_url_retour()
. Utiliserparametre_url()
à la place, avec le paramètre ’redirect’. - Suppression de
charger_php_extension()
(utiliserextension_loaded()
) - Suppression de
revisions_articles()
. Utiliserarticle_modifier()
- Suppression de
revision_article()
. Utiliserarticle_modifier()
- Suppression de
articles_set()
. Utiliserarticle_modifier()
- Suppression de
insert_article()
. Utiliserarticle_inserer()
- Suppression de
instituer_article()
. Utiliserarticle_instituer()
- Suppression de
insert_auteur()
. Utiliserauteur_inserer()
- Suppression de
auteurs_set()
. Utiliserauteur_modifier()
- Suppression de
instituer_auteur()
. Utiliserauteur_instituer()
- Suppression de
revision_auteur()
. Utiliserauteur_modifier()
- Suppression de
insert_rubrique()
. Utiliserrubrique_inserer()
- Suppression de
revisions_rubriques()
. Utiliserrubrique_modifier()
- Suppression de
instituer_rubrique()
. Utiliserrubrique_instituer()
- Suppression de
admin_repair_plat()
. Les fichiers .plat ne sont plus utilisés. Cette fonction n’est plus appelée depuisr14292
- Suppression de
version_svn_courante()
. Utiliserversion_vcs_courante()
- Suppression de
lire_meta()
. Utiliser$GLOBALS['meta'][$nom]
oulire_config('nom')
- Suppression de
auteur_referent()
. Utiliserauteur_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()
. Utiliserobjet_modifier()
. - Suppression de
notifier_publication_article()
. - Suppression de
notifier_proposition_article()
. - Suppression de
calcul_branche()
. Utilisercalcul_branche_in()
. - Suppression de
ecrire_metas()
. - Suppression de
spip_query_db()
. Utilisersql_query()
ou autre. - Suppression de
spip_get_lock()
etspip_release_lock()
qui n’étaient plus utilisées. - Suppression de
recuperer_entetes()
. Utiliserrecuperer_entetes_complets()
. - Suppression de
maj_version()
etupgrade_vers()
qui ne servent plus. - Suppression de
upgrade_types_documents()
. Utiliser directementcreer_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. Ces plugins, breves, organiseur, petitions et squelettes_par_rubriques sont toujours maintenus mais il faut les installer à la main (via SVP par exemple) afin de bénéficier de leurs fonctionnalités. Par exemple, installer le plugin Squelettes par rubrique
pour utiliser des squelettes suffixés par numéro de rubrique et/ou par code de langue : (-23.html
, =23.html
, et .en.html
). Pour installer ces plugins via SVP, il faut jouter le dépôt SPiP-Zone - Core (ref https://plugins.spip.net/spip.php?page=depots) dans la page de gestion des dépôts de l’interface privée.
- 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()
. Utiliserbreve_inserer()
- Suppression de
revisions_breves()
. Utiliserbreve_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()
. Utiliserdocument_modifier()
- Suppression de
insert_document()
. Utiliserdocument_inserer()
- Suppression de
revision_document()
. Utiliserdocument_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()
. Utilisergenerer_lien_entite()
- Suppression de
instituer_document()
. Utiliserdocument_instituer()
Mots
Fonctions PHP
- Suppression de
groupemots_inserer()
. Utilisergroupe_mots_inserer()
ouobjet_inserer()
- Suppression de
groupemots_modifier()
. Utilisergroupe_mots_modifier()
ouobjet_modifier()
- Suppression de
revision_groupe_mot()
. Utilisergroupe_mots_modifier()
- Suppression de
insert_mot()
. Utiliser Utilisermot_inserer()
- Suppression de
mots_set()
. Utilisermot_modifier()
- Suppression de
revision_mot()
. Utilisermot_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()