Skip to content
Extraits de code Groupes Projets
Bifurcation depuis spip / spip
561 validations de retard le dépôt en amont.
UPGRADE_5.0.md 12,19 Kio

UPGRADE de SPIP 4.2 à 5.0

Préliminaires

SPIP 5.0 nécessite PHP 8.1 minimum.

Migration BDD

SPIP 5.0 ne contient pas les mises à jour de BDD antérieures à SPIP 4.0. Pour rappel, SPIP 4.x ne contient pas les mises à jour antérieures SPIP 2.0.

Dit autrement, il faut a minima partir d’un SPIP 3.2 (ou supérieur donc) pour que la migration en SPIP 5.0 de la base de données s’effectue correctement. Pour des questions de compatibilité de SPIP 5.0 avec PHP 8.1 minimum, il est conseillé (mais pas obligatoire) de partir au moins d’un SPIP 4.1.

Déplacement plugins-dist

Les plugins-dist (plugins fournis avec la distribution SPIP et toujours activés) sont maintenant installés via l’outil Composer (ou présents dans l’archive SPIP téléchargée).

Ils sont maintenant placés dans le répertoire plugins-dist/spip/ avec leur préfixe comme nom de répertoire. Ils étaient auparavant directement à la racine de plugins-dist/.

En conséquence, et en fonction de votre méthode de migration vers SPIP 5.0, il faudra supprimer les anciens plugins-dist/ de SPIP 4.2 à la racine s’ils sont présents.

Ainsi, par exemple, le plugin Textwheel était auparavant dans plugins-dist/textwheel et se retrouve après mise à jour en SPIP 5.0 dans plugins-dist/spip/tw (où tw est le préfixe du plugin)

Webmestres

La constante _ID_WEBMESTRES (dépréciée en SPIP 2.1) n’est plus utilisée et n’a plus d’effet.

Si vous déclariez cette constante (dans config/mes_options.php par exemple), il convient de l’enlever et de déclarer les autrices et auteurs webmestres en conséquence depuis l’interface privée de SPIP en tant que webmestre (ou via le champ webmestre de la table spip_auteurs directement dans la base de données).

Suppression / déplacement de fonctionnalités

Squelettes

Parties optionnelles des balises

Il devient possible d’utiliser des crochets dans les parties optionnelles des balises. Ainsi :

  • [avant] (#VAL{texte})] écrit avant] texte
  • [(#VAL{texte}) [après] écrit texte [après
  • [avant] (#VAL{texte}) [après] écrit avant] texte [après

En conséquence, certaines écritures de squelettes deviennent comprises comme des parties optionnelles, lorsque (#BALISE est utilisé alors que la parenthèse ne désigne pas une partie optionnelle.

Ce cas peut se trouver par exemple dans des écriture pour du CSS. Il convient de lever l’ambiguité

Avant

a[href] { background-image: url(#CHEMIN_IMAGE{img.svg}); }

Après

a[href] { background-image: url\(#CHEMIN_IMAGE{img.svg}); }

ou

a[href] { background-image: url("#CHEMIN_IMAGE{img.svg}"); }

Nouvelles dépréciations

Gestion des traductions

Fichiers de langue avec $GLOBALS (déprécié en 5.0)

Les fichiers de langue peuplant une variable globale sont dépréciés. Retourner directement le tableau PHP. Note: Cette syntaxe est valide à partir de SPIP 4.1

avant

<?php
if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

$GLOBALS[$GLOBALS['idx_lang']] = array(
	'mots_description' => 'Mots et Groupes de mots',
	'mots_slogan' => 'Gestion des mots et groupes de mots dans SPIP'
);

Après

<?php
return [
	'mots_description' => 'Mots et Groupes de mots',
	'mots_slogan' => 'Gestion des mots et groupes de mots dans SPIP'
];

Les éléments suivants sont dépréciés et seront supprimés dans une future version.

Syntaxes de squelettes

Critère {collecte} (déprécié en 5.0)

Utiliser {collate}

Avant

<BOUCLE_a(ARTICLES) {par titre} {collecte utf8_spanish_ci} {"<br />"}>...

Après

<BOUCLE_a(ARTICLES) {par titre} {collate utf8_spanish_ci} {"<br />"}>...

Critères {fusion} (déprécié en 5.0)

Utiliser {groupby}

Avant

<BOUCLE_extrait(ARTICLES){fusion id_rubrique}>...

Après

<BOUCLE_extrait(ARTICLES){groupby id_rubrique}>...

Critères {fusion_supprimer} (déprécié en 5.0)

Utiliser {groupby_supprimer}

Avant

<BOUCLE_facette_annee(ARTICLES){id_mot=27}{fusion_supprimer}{fusion YEAR(date)}>
    [(#DATE|annee)]<br />
</BOUCLE_facette_annee>

Après

<BOUCLE_facette_annee(ARTICLES){id_mot=27}{groupby_supprimer}{groupby YEAR(date)}>
    [(#DATE|annee)]<br />
</BOUCLE_facette_annee>

Fonctions PHP

Dans certains cas parfois utilisées en filtres de squelettes également.

Fonction spip_log

La fonction très courante spip_log est dépréciée au profit de la fonction spip_logger, qui retourne une instance de Psr/Log/LoggerInterface.

Les constantes de niveau de log associées, comme _LOG_ERREUR sont aussi dépréciées.

La constante (configuration) _LOG_FILTRE_GRAVITE prend pour valeur un Psr\Log\LogLevel::*

Avant

spip_log('message defaut (info)');
spip_log('message d’erreur', _LOG_ERREUR);

# ensemble des hiérarchies de log
spip_log('message debug', _LOG_DEBUG);
spip_log('message info', _LOG_INFO);
spip_log('message info importante', _LOG_INFO_IMPORTANTE);
spip_log('message avertissement', _LOG_AVERTISSEMENT);
spip_log('message erreur', _LOG_ERREUR);
spip_log('message critique', _LOG_CRITIQUE);
spip_log('message alerte', _LOG_ALERTE_ROUGE);
spip_log('message hs', _LOG_HS);

# écriture dans un autre fichier de log
spip_log('message A', 'saisies');
spip_log('message B', 'saisies' . _LOG_ERREUR);
spip_log('message C', 'saisies.' . _LOG_DEBUG);

# niveau de log variable
$level = _LOG_ERREUR;
spip_log('message level variable', $level);

# niveau de gravité de logs écrits (mes_options.php)
define(`_LOG_FILTRE_GRAVITE`, _LOG_DEBUG);

Après

spip_logger()->info('message defaut (info)');
spip_logger()->error('message d’erreur');

# ensemble des hiérarchies de log
$logger = spip_logger();
$logger->debug('message debug');
$logger->info('message info');
$logger->notice('message info importante');
$logger->warning('message avertissement');
$logger->error('message erreur');
$logger->critical('message critique');
$logger->alert('message alerte');
$logger->emergency('message hs');

# écriture dans un autre fichier de log
spip_logger('saisies')->info('message A');

$logger = spip_logger('saisies');
$logger->error('message B');
$logger->debug('message C');

# niveau de log variable
$level = Psr\Log\LogLevel::ERROR;
spip_logger()->log($level, 'message level variable');

# niveau de gravité de logs écrits (mes_options.php)
define(`_LOG_FILTRE_GRAVITE`, Psr\Log\LogLevel::DEBUG);

Fonctions extraire_multi et extraire_idiome

Le 3è paramètre $options déprécié si booléen. Ce paramètre $options doit être un array.

Avant

$multi = extraire_multi($texte, 'en', true);
$idiome = extraire_idiome($texte, 'en', true);

Après

$multi = extraire_multi($texte, 'en', ['echappe_span' => true]);
$idiome = extraire_idiome($texte, 'en', ['echappe_span' => true]);

Fonction spip_setcookie

La fonction spip_setcookie() reprend les arguments de la fonction php setcookie.

Les constantes _COOKIE_SECURE et _COOKIE_SECURE_LIST sont dépréciées au profit des options secure (activée par défaut en HTTPS) et httponly de la fonction

Exemple

spip_setcookie('mon_cookie', 'ma valeur', time() + 3600, httponly: true);

Fonction spip_sha256 (dépréciée en 5.0)

Utiliser la fonction native hash

Avant

$hash = spip_sha256('mon contenu');

Après

$hash = hash('sha256', 'mon contenu');

Fonction abs_url (dépréciée en 5.0)

Utiliser url_absolue ou liens_absolus selon.

Avant

$texte = abs_url($texte);
$url = abs_url($url);
[(#TEXTE|abs_url)]
[(#URL_ARTICLE|abs_url)]

Après

$texte = liens_absolus($texte);
$url = url_absolue($url);
[(#TEXTE|liens_absolus)]
[(#URL_ARTICLE|url_absolue)]

Renommage / changement de configurations

Nettoyage des paramètres d’URI

Une configuration (certainement très peu surchargée) a été modifiée et renommée :

  • Introduction de la constante _CONTEXTE_IGNORE_LISTE_VARIABLES.
  • Suppression de la constante _CONTEXTE_IGNORE_VARIABLES.

Avant

define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');

Après

define('_CONTEXTE_IGNORE_LISTE_VARIABLES', ['^var_', '^PHPSESSID$', '^fbclid$', '^utm_']);

Suppressions des éléments dépréciés

Les éléments suivants ont été supprimés et doivent être adaptés si ce n’est pas encore le cas.

Syntaxes de squelettes

Filtres de #LOGO_ (dépréciés en 2.1)

Les syntaxes des #LOGO_xx avec de faux filtres |left |right |center |bottom, |top, |lien |fichier ne sont plus prises en compte.

Avant

- [(#LOGO_ARTICLE|#URL_ARTICLE)]
- [(#LOGO_ARTICLE|fichier)]
- [(#LOGO_ARTICLE|lien)]
- [(#LOGO_ARTICLE|left)]

Après

- [(#LOGO_ARTICLE{#URL_ARTICLE})]
- [(#LOGO_ARTICLE**)]
- [(#LOGO_ARTICLE*)]
- [(#LOGO_ARTICLE{left})]

Note: les positionnements left, right, center, bottom, top ajustent simplement une classe CSS.

Filtre de #FORMULAIRE_RECHERCHE|parametre (déprécié en 2.1)

Avant

[(#FORMULAIRE_RECHERCHE|param)]

Après

[(#FORMULAIRE_RECHERCHE{param})]

Balise #EXPOSER (déprécié en 1.8.2)

Avant

[(#EXPOSER|on,off)]

Après

[(#EXPOSE{on,off})]

Balise #EMBED_DOCUMENT (déprécié en 2.0)

Avant

[(#EMBED_DOCUMENT|autostart=true)]

Après

[(#MODELE{emb, autostart=true})]

Filtre icone

Le filtre icone est supprimé. Utiliser icone_verticale (ou icone_horizontale)

Avant

[(#URL_ECRIRE{article_edit,id_article=#ID_ARTICLE}
  |icone{Éditer,article-24.png,#LANG_RIGHT,edit,ajax})]

Après

[(#URL_ECRIRE{article_edit,id_article=#ID_ARTICLE}
  |icone_verticale{Éditer,article,edit,right ajax})]

Filtre foreach

Le filtre déprécié foreach est supprimé. Utiliser une boucle DATA.

Avant

[(#LISTE{a,b,c,d}|foreach)]

Après

<BOUCLE_liste(DATA){source tableau, #LISTE{a,b,c,d}}>
- #CLE => #VALEUR <br />
</BOUCLE_liste>

Boucle POUR

La boucle POUR dépréciée est supprimée. Utiliser une boucle DATA.

Avant

<BOUCLE_liste(POUR){tableau #LISTE{un,deux,trois}}>
- #CLE : #VALEUR <br />
</BOUCLE_liste>

Après

<BOUCLE_liste(DATA){source tableau, #LISTE{un,deux,trois}}>
- #CLE : #VALEUR <br />
</BOUCLE_liste>

Fonctions PHP

Dans certains cas parfois utilisées en filtres de squelettes également.

Fonction http_status

La fonction dépréciée http_status est supprimée. Utiliser la fonction PHP native http_response_code

Avant

http_status(404);

Après

http_response_code(404);

Fonction generer_url_ecrire_objet

La fonction dépréciée generer_url_ecrire_objet est supprimée. Utiliser generer_objet_url_ecrire.

Avant

$url = generer_url_ecrire_objet(3, 'article');
[(#ID_ARTICLE|generer_url_ecrire_objet{article})]

Après

$url = generer_objet_url_ecrire(3, 'article');
[(#ID_ARTICLE|generer_objet_url_ecrire{article})]

Fonctions generer_{x}_entite

De même que generer_url_ecrire_objet les fonctions dépréciées