Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found

Cible

Sélectionner le projet cible
  • spip/spip
  • Roman/spip
  • g0uZ/spip_puce_changement_statut_rapide_sans_JS_inline
  • erational/issue_4450
  • cy.altern/spip_core
  • fa_b/spip
  • glopglop/spip
  • MathieuAlphamosa/spip
  • taffit/spip
  • claffont/spip
  • RealET/spip
  • alexis.pellicier/spip
  • syl20/spip
  • cpol/spip_cpol0
  • franck_r/spip
  • JLuc/spip
  • JLuc/jluc-spip
  • bricebou/spip
  • Jack31/spip-issue-5919
  • Plumf/spip
  • jo/spip
  • pierretux/spip
  • placido/spip
  • touti/spip
  • florent.tri/spip
25 résultats
Afficher les modifications
Validations sur la source (297)
Affichage de
avec 2448 ajouts et 2247 suppressions
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{yml,yaml,md}]
indent_style = space
indent_size = 2
[*.{xml,xml.dist,json}]
indent_style = space
indent_size = 4
.DS_Store export-ignore
.editorconfig export-ignore
.gitignore export-ignore
.gitattributes export-ignore
.htaccess export-ignore
docker-compose.override.yml export-ignore
docker-compose.yml export-ignore
ecs.php export-ignore
rector.php export-ignore
/lib/ export-ignore
/plugins/ export-ignore
/squelettes/ export-ignore
/lib/ export-ignore
/mutualisation/ export-ignore
/sites/ export-ignore
/ecrire/tests/ export-ignore
/themes/ export-ignore
# .gitignore export-ignore
# .gitattributes export-ignore
# composer & outils
#composer & outils
/vendor/
/composer.phar
/composer.local.*
/phpunit.xml
/phpcs.xml
/phpstan.neon
/.phpunit.cache
/docker-compose.override.yml
/docker-compose.yml
/.phpunit.cache
/*.zip
# SPIP
/IMG/
!/IMG/remove.txt
/config/
!/config/remove.txt
/local/
!/local/CACHEDIR.TAG
!/local/remove.txt
/config/*.php
/plugins-dist/
/squelettes-dist/
/tmp/
!/tmp/CACHEDIR.TAG
!/tmp/remove.txt
# Contrib ou personalisation
/.htaccess
/lib/
/mutualisation/
/plugins/
/sites/
/squelettes/
/themes/
# IDE
**/.DS_Store
/.buildpath
/.project
/.settings
/.idea/
/.vscode/*
/prive/
/ecrire/
## Description du bug / Comment le reproduire
1. ...
2. ...
3. ...
## Comportement attendu / Comportement obtenu
_Qu'est ce que vous vous attendez à obtenir ?_\
_Quel est le résultat réellement obtenu ?_
## Piste de résolution
_Si vous avez une piste pour résoudre, sinon effacez cette section_
## Autres informations
_Si nécessaire, vous pouvez ajouter_ :
- _url dans l'espace privé /ecrire/?exec=..._
- _url du site public si le bug y est visible / reproductible,_
- _captures écrans,_
- _extraits de logs,_
_sinon effacez cette section_
## Informations techniques
* Version de SPIP :
* Version de PHP :
* Navigateur utilisé : Nom et version
* Serveur web (si pertinent) : Apache, Nginx, ...
* Système d'exploitation (si pertinent) :
* Base de données (si pertinent) : MySQL/MariaDb/Sqlite + numéro de version
......@@ -2,83 +2,15 @@
## Unreleased
### Added
- !5824 Logger `spip_logger()` impplémentant `Psr\Log\LoggerInterface` (PSR-3) via une librairie `spip/logger` qui utilise Monolog
- !5807 Cache des squelettes réécrit en utilisant une librairie `spip/cache` (PSR-16)
- !5806 Gestion des chemins (path) & leur cache réécrit en utilisant une librairie `spip/path`
- #5565 Critère `{collate}` (remplace `{collecte}`)
- #5565 Critères `{groupby}` et `{groupby_supprimer}` (remplace `{fusion}` et `{fusion_supprimer}`)
- #5565 Critère `{having}`
- Les plugins-dist et le squelettes-dist s'intallent avec composer
### Changed
- #4657 Renommage de `admin_tech` en `admin_bdd` et des chaînes de langue afférentes
- !5708 Découpage des fichiers de démarrage de SPIP (non surchargeables) dans `ecrire/boostrap`
- !5765 Nettoyage des paramètres d’URI : la constante `_CONTEXTE_IGNORE_LISTE_VARIABLES` remplace `_CONTEXTE_IGNORE_VARIABLES` supprimée.
- #3637 Phraseur: Accepter des crochets dans la partie optionnelle d’une balise. `[hop] (#REM) [truc]` devient possible.
- Refactor de `echappe_html()` avec un collecteur
- #5552 Signature de `spip_setcookie` (reprend la signature de php `setcookie`)
- Les logos historiques (migrés en documents à partir de SPIP 4.0) ne sont plus utilisés s’il en restait.
- #5898 Nécessite PHP 8.2 minimum
### Fixed
- !5981 Ne pas afficher qu’une mise à jour est disponible alors qu’elle vient d’être faite !
- #5953 Les modèles de formulaires doivent être encadrés d’une balise `div` (retiré par erreur dans !5956 pour spip-team/securite#4853)
- #5825 Ne pas mettre l'adresse du site entre parenthèses dans les mails envoyés par SPIP
### Deprecated
- Mise à jour documentation d’upgrade
- Mise à jour des dépendances
- !5824 Fonction `spip_log()`. Utiliser `spip_logger()` qui retourne une instance impplémentant `Psr\Log\LoggerInterface`
- Fichiers de langue peuplant une variable globale. Retourner directement un array (valide à partir de SPIP 4.1)
- Filtre/fonction `abs_url`. Utiliser `url_absolue` ou `liens_absolus` selon.
- Dans les fonctions `extraire_idiome` et `extraire_multi`, le 3è paramètre `$options` de type `bool` est déprécié. Utiliser un array `['echappe_span' => true]`
- #5552 Constantes `_COOKIE_SECURE` et `_COOKIE_SECURE_LIST` (utiliser les options `secure` et/ou `httponly` de `spip_setcookie`)
- #5565 Critère `{collecte}`. Utiliser `{collate}`
- #5565 Critères `{fusion}` et `{fusion_supprimer}`. Utiliser `{groupby}` et `{groupby_supprimer}`
- Fonction `logo_migrer_en_base()` (utilisable jusqu’en SPIP 5.y pour migrer les logos en documents)
- Fonction `spip_sha256` (utiliser `hash('sha256', $str)`)
## 5.0.0-beta - 2024-12-03
### Removed
### Changed
- #5199 Retrait de toutes les références à la globale `auteur_session`
- #5917 Retrait de toutes les références à NETPBM
- #5885 fonction `formulaire_recherche()`
- #5803 Fichier `ecrire/inc/json.php` et les vieilles fonctions de compatibilité json `json_export` et `var2js` : utiliser `json_encode` natif.
- !5890 Fichiers `ecrire/base/serial.php` et `ecrire/base/auxiliaires.php`, appeler la fonction de `base/objets` à la place.
- !5765 Constante `_CONTEXTE_IGNORE_VARIABLES` (string), utiliser `_CONTEXTE_IGNORE_LISTE_VARIABLES` (array)
- #5701 Retrait de la fonctionnalité de surlignage des résultats de la recherche. Cf. plugin Surligne <https://git.spip.net/spip-contrib-extensions/surligne>
- !5688 Ne plus chercher d’eventuels fichiers `ecrire/mes_options.php` ou `ecrire/inc_connect.php` (ils sont dans `config/mes_options.php` ou `config/connect.php`)
- #5654 Migration BDD < SPIP 4.0 (il faut partir d’un SPIP 3.2 minimum pour migrer en SPIP 5.0)
- #5652 Constante `_ID_WEBMESTRES` (dépréciée en SPIP 2.1). Utiliser le champ `webmestre` dans la table `spip_auteurs`.
- !5631 Balise `#EMBED_DOCUMENT` (déprécié en SPIP 2.0). Utiliser `#MODELE{emb, ...}`
- !5631 Balise & syntaxe `[(#EXPOSER|on,off)]` (dépréciée depuis SPIP 1.8.2). Utiliser `[(#EXPOSE{on,off})]`
- !5631 Syntaxes des `[(#FORMULAIRE_RECHERCHE|param)]` (dépréciée depuis SPIP 2.1). Utiliser `[(#FORMULAIRE_RECHERCHE{param})]`
- !5631 Syntaxes des `#LOGO_xx` avec de faux filtres `|left` `|right` `|center` `|bottom` `|top`, `|lien` `|fichier` (dépréciées depuis SPIP 2.1)
- Javascript `jquery.placeholder-label` (qui simulait l’attribut placeholder sur des vieux navigateurs)
- Suppression du test sur [mbstring.overload](https://www.php.net/manual/en/mbstring.configuration.php#ini.mbstring.func-overload) à l'install
- Suppression de l’usage de la classe `no_image_filtrer` (utiliser la classe `filtre_inactif` qui l’a remplacé)
- Fichier `plugins-dist.json` (on utilise `composer.json` maintenant)
- Boucle `POUR` (utiliser une boucle DATA tel que `<BOUCLE_x(DATA){source tableau, ...}>`)
- Filtre `icone` (utiliser probablement le filtre `icone_verticale`)
- Filtre `foreach` (utiliser une boucle `<BOUCLE_x(DATA){source table, #GET{tableau}}>...`)
- Action `super_cron` (utiliser l’action `cron`, tel que `spip.php?action=cron`)
- Fonction `inc_lister_objets_dist` (utiliser `recuperer_fond('prive/objets/liste/xxx')`)
- Fonction `critere_par_joint` (utiliser `calculer_critere_par_champ` si besoin)
- Fonction `http_status` (utiliser `http_response_code`)
- Fonction `generer_url_ecrire_objet` (utiliser `generer_objet_url_ecrire`)
- Fonction `generer_lien_entite` (utiliser `generer_objet_lien`)
- Fonction `generer_introduction_entite` (utiliser `generer_objet_introduction`)
- Fonction `generer_info_entite` (utiliser `generer_objet_info`)
- Fonction `lignes_longues` (utiliser un style CSS tel que `word-wrap:break-word;`)
- Fonction `extraire_date`
- Fonction `exporter_csv_ligne` (utiliser `exporter_csv_ligne_numerotee`)
- Fonctions `cvtmulti_formulaire_charger` et `cvtmulti_formulaire_verifier` (voir `cvtmulti_formulaire_charger_etapes` et `cvtmulti_formulaire_verifier_etapes`)
- Fonction `auteurs_article` (utiliser `auteurs_objets`)
- Fonction `param_low_sec` (utiliser `generer_url_api_low_sec`)
- Fonction `spip_connect_ldap` (utiliser `auth_ldap_connect`)
- Fonction `_nano_sha256` (utiliser `hash('sha256', $str)`)
- #5505 Fonctions `verif_butineur()`, `editer_texte_recolle()` et environnement `_texte_trop_long` des formulaires (Inutilisé — servait pour IE !)
- #5258 Retrait de toute mention à GD1 dans la configuration des vignettes
- Les dossiers `ecrire`, `prive`, `squelettes-dist`, `plugins-dist` s'installent avec Composer
- L’écran de sécurité s’installe avec Composer
- Le Changelog concernant `ecrire` et `prive` est déplacé dans leurs dépôts respectifs.
\ No newline at end of file
Vous pouvez effacer ce fichier sans dommages.
You can safely remove this file.
......@@ -28,8 +28,10 @@ maintenu par sa communauté avec tendresse.
### Installation classique
```bash
git clone https://git.spip.net/spip/spip/
git clone https://git.spip.net/spip/spip.git
cd spip
composer install --no-dev
composer run post-create-project-cmd
```
Mise à jour
......@@ -39,14 +41,29 @@ git pull
composer install --no-dev
```
### Installation de développement (plugins-dist via git)
### Installation avec composer
Cf. [composer create-project](https://getcomposer.org/doc/03-cli.md#create-project)
```bash
composer create-project \
--repository=https://get.spip.net/composer \
spip/spip \
spip \
5.0.x-dev
```
### Installation de développement (prive et plugins-dist via git)
```bash
git clone https://git.spip.net/spip/spip/
git clone https://git.spip.net/spip/spip.git
cd spip
composer install
composer local mode-dev
rm -rf plugins-dist
composer run post-create-project-cmd
composer --no-interaction local mode-dev # config
rm -rf plugins-dist prive squelettes-dist ecrire vendor/spip/security
composer local install
composer local mode-dev # https->ssh
```
Mise à jour
......@@ -54,7 +71,7 @@ Mise à jour
```bash
git pull
rm composer.local.*
composer local mode-dev
composer --no-interaction local mode-dev
composer local install
```
......
# UPGRADE de SPIP 4.2 à 5.0
# UPGRADE de SPIP 4.x à 5.0
## Préliminaires
......@@ -29,11 +29,7 @@ La constante `_ID_WEBMESTRES` (dépréciée en SPIP 2.1) n’est plus utilisée
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
- Le surlignage des mots de recherche est déplacé dans [le nouveau plugin Surligne](https://git.spip.net/spip-contrib-extensions/surligne)
- la fonction `formulaire_recherche()` est supprimée. Utiliser la balise `#FORMULAIRE_RECHERCHE_ECRIRE`.
- NETPBM n'est plus disponible pour la génération des vignettes.
## Squelettes
......@@ -67,39 +63,54 @@ ou
a[href] { background-image: url("#CHEMIN_IMAGE{img.svg}"); }
```
# Nouvelles dépréciations
### Casse des items de langues
## Gestion des traductions
Avant SPIP 5.0, les items de langues en squelettes étaient automatiquement passées en minuscules. Ainsi `<:toto:>` était équivalent à `<:TOTO:>`.
### Fichiers de langue avec `$GLOBALS` (déprécié en 5.0)
À partir de SPIP 5.0, les deux ne seront plus équivalent. Il convient de vérifier ses squelettes.
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
Il est _fortement conseillé_ de n'utiliser que des items de langue en minuscule.
#### avant
### Suppression de l'inclusion en squelette de fichier PHP
```php
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
L'inclusion en squelette de fichier PHP via `<INCLURE>` est supprimé
#### Avant
$GLOBALS[$GLOBALS['idx_lang']] = array(
'mots_description' => 'Mots et Groupes de mots',
'mots_slogan' => 'Gestion des mots et groupes de mots dans SPIP'
);
```
<INCLURE(fichier.php)>
```
ou
```
<INCLURE{fond=fichier.php}>
```
#### Après
```php
<?php
return [
'mots_description' => 'Mots et Groupes de mots',
'mots_slogan' => 'Gestion des mots et groupes de mots dans SPIP'
];
```
<INCLURE{fond=fichier_de_squelette}>
```
### Suppression de la balise fermante `</INCLURE>`
La balise fermant `</INCLURE>` est supprimée.
#### Avant
````
<INCLURE{fond=xxx}...></INCLURE>
````
après
````
<INCLURE{fond=xxx}... />
````
# Nouvelles dépréciations
Les éléments suivants sont dépréciés et seront supprimés dans une future version.
......@@ -272,7 +283,6 @@ Utiliser la fonction native `hash`
```php
$hash = spip_sha256('mon contenu');
```
#### Après
```php
......@@ -337,11 +347,292 @@ Par conséquent, il faut adapter :
- les liens vers la page
- les éventuelles pipelines qui la modifie (en se demandant dans ce cas la pertinence de créer une nouvelle page plutôt que d'insérer du contenu dans cette page)
## Modification du comportement du formulaire d'édition des liaisons
Le formulaire d'association des liens à un objet est éditable à partir du moment où l'on a l'autorisation de modifier l'objet, le test d'affichage ou non des boutons d'association se faisant désormais dans le squelette du formulaire.
Pour les personnes ayant surchargé les squelettes de ce formulaire ou ayant des pipelines se branchant dessus, il convient d'effectuer les adaptations nécessaires à la modification du paramètre `editable`.
## Le menu « Squelettes » de l'espace privé devient « Apparence »
Le menu « Squelettes » (identifiant `menu_squelette`) de l'espace privé est renommé « Apparence » (identifiant `menu_apparence`).
Bien qu'une rétrocompatibilité soit assurée, il convient de corriger dès maintenant les appels.
### Avant
```
<menu nom="..." titre="..." parent="menu_squelette" icone="..." action="..." />
```
### Après
```
<menu nom="..." titre="..." parent="menu_apparence" icone="..." action="..." />
```
## Les menus préfixés par `bando_` doivent être préfixés par `menu_`
Si un menu a pour parent un menu dont l'identifiant commençe par `bando_`, celui-ci continue d'être automatiquement converti en menu commençant par `menu_`. Mais cette conversion est dépréciée et sera supprimée en 6.0. Il convient de corriger les appels.
### Avant
```
<menu nom="..." titre="..." parent="bando_xxx" icone="..." action="..." />
```
### Après
```
<menu nom="..." titre="..." parent="menu_xxx" icone="..." action="..." />
```
# 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.
## Recherche d'un fichier `ecrire/mes_options.php`.
La recherhe d'un fichier `mes_options` dans `ecrire` n'est plus supporté. Le fichier `mes_options` doit forcément se trouver dans `config`.
## Constantes PHP
### `_DIR_RESTREINT_ABS`
Certaines constantes sont dépréciées en SPIP4.4 et supprimée en SPIP5
La constante `_DIR_RESTREINT_ABS` est dépréciée en SPIP4.4 et supprimée en SPIP5 au profit de paramètres gérés dans un [conteneur de services](https://symfony.com/doc/current/service_container.html).
[Voir aussi la documentation de développement](https://symfony.com/doc/current/components/dependency_injection.html)
#### Avant
```php
function lambda() {
$chaine = _DIR_RESTREINT_ABS . 'suite';
}
```
Dans un fichier squelette :
```html
[(#CONST{_DIR_RESTREINT_ABS})]
```
#### Après
```php
function lambda() {
// suivant le contexte (URL vers l'espace privé / répertoire physique "ecrire/")
$chaine = \SpipLeague\Component\Kernel\param('spip.routes.back_office') . 'suite';
// ou
$chaine = \SpipLeague\Component\Kernel\param('spip.dirs.core') . 'suite';
}
```
Dans un squelette :
```html
[(#PARAM{spip.routes.back_office})]
```
### `_ROOT_CWD`
#### Avant
```php
$cwd = _ROOT_CWD;
```
#### Après
```php
use function \SpipLeague\Component\Kernel\app;
$cwd = app()->getCwd();
// ou
$cwd = \SpipLeague\Component\Kernel\app()->getCwd();
```
### `_DIR_LOG`
#### Avant
```php
_DIR_LOG
```
#### Après
```php
use function \SpipLeague\Component\Kernel\app;
app()->getLogDir()
```
### `_ESPACE_PRIVE`
#### Avant
```php
if (defined('_ESPACE_PRIVE')) {
...
} else {
...
}
```
En squelette :
```spip
[(#CONST{_ESPACE_PRIVE}|?{oui,non})]
```
#### Après
```php
use function \SpipLeague\Component\Kernel\app;
if (app()->isBackOffice()) {
...
} else {
...
}
```
En squelette :
```spip
[(#NULL|test_espace_prive|?{oui,non})]
```
### `_ROOT_IMG_PACK` & `_DIR_IMG_PACK`
#### Avant
```php
$absolute = _ROOT_IMG_PACK;
$relative = _DIR_IMG_PACK;
```
#### Après
```php
use function \SpipLeague\Component\Kernel\app;
$absolute = app()->getPrivateTemplateDir() . _NOM_IMG_PACK;
$relative = app()->relative()->getPrivateTemplateDir() . _NOM_IMG_PACK;
```
Préferez cependant `find_in_theme()` ou `chemin_image()` (qui recherchent dans des dossiers différents).
## Fonctions et variables Javascript
SPIP5 amorce une émancipation du code javascript hors du giron de jQuery, et se tourne vers l'adoption d'usages plus modernes via les ESM. Ce chantier débute avec le fichier `config.js` dédié au stockage de la configation de SPIP et de ses plugins, et le fichier `ajaxCallBack.js`, en charge des rechargements dynamiques.
Les fonctions concernées par la migration sont les suivantes :
`ajaxReload`,`onAjaxLoad`,`triggerAjaxLoad`,`positionner`,`animateLoading`,`endLoading`,`animateRemove`,`animateAppend`,`parametre_url`,`followLink`,`ajaxClick`
Il est recommandé de passer par une directive `import` lorsque l'usage d'une balise `<script type="module">` est possible.
```javascript
import { parametre_url, animateLoading, onAjaxLoad } from "ajaxCallback.js";
```
Les balises `<script type="module">` qui contiennent une directive `import` s'exécutent de manière asynchrone et différée, une fois que toutes les ressources javascript de la page ont été résolues. Auparavant, il fallait s'assurer de différer l'exécution du code en l'encapulant dans une fonction `$(document).ready(function(){...})` ou `$(function(){...})`.
### Avant
```html
<script>
// déclaration directe d'une propriété de l'objet window (non recommandé)
var ajax_image_searching = "";
// code à exécuter au chargement complet
$(document).ready(function(){
// lecture depuis l'objet jQuery
console.log(jQuery.spip.load_handlers);
// animation d'un bloc
jQuery('.mon_bloc').animateLoading();
});
</script>
```
### Après
```html
<!-- Pour les modules ESM -->
<script type="module">
import { default as spip } from "config.js";
import { animateLoading, onAjaxLoad } from "ajaxCallback.js";
// lecture
console.log(spip.load_handlers);
// ecriture
spip.ajax_image_searching = "";
// animation d'un bloc
const monbloc = document.querySelector('.mon_bloc');
if (monbloc) {
animateLoading(monbloc);
}
</script>
<!-- Pour le code non ESM, on peut consulter l'objet spipConfig -->
<script>
// code à exécuter au chargement complet
document.addEventListener("DOMContentLoaded", () => {
// lecture
console.log(spipConfig.load_handlers);
// ecriture
spipConfig.ajax_image_searching = "";
});
</script>
```
Un fichier `retrocompat.js` tâche d'assurer la compatibilité avec la syntaxe historique.
Ajouter le paramètre `?var_mode=debug_js` dans l'url permet de tracer les usages dépréciés dans la console.
## Fichiers de langue
Les fichiers de langue peuplant une variable globale sont supprimés. Retourner directement le tableau PHP.
Note: Cette syntaxe est valide à partir de SPIP 4.1
### Avant
```php
<?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
<?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.
## Surlignage des mots de recherches
Le surlignage des mots de recherche est déplacé dans [le nouveau plugin Surligne](https://plugins.spip.net/surligne)
## Fonction `formulaire_recherche()`
La fonction `formulaire_recherche()` est supprimée. Utiliser la balise `#FORMULAIRE_RECHERCHE_ECRIRE`.
## Support de NETPMB
NETPBM n'est plus disponible pour la génération des vignettes. Adapter la configuration le cas échéant (Menu « Configuration » -> « Fonctions avancées ».
## Fichiers base/serial.php et base/auxiliaires.php
- les appels à ces fichiers, via `include_spip('base/serial');` par exemple, seront sans effet.
......@@ -471,6 +762,27 @@ La boucle `POUR` dépréciée est supprimée. Utiliser une boucle `DATA`.
</BOUCLE_liste>
```
## Filtre `|image_typo`
Le filtre `|image_typo` n'est plus livré avec SPIP. Installez le plugin [Image Typo](https://plugins.spip.net/image_typo) pour l'obtenir.
## Balise `#LARGEUR_ECRAN`
La balise `#LARGEUR_ECRAN` pour les squelettes de l'espace privé doit être remplacée par `#LAYOUT_PRIVE`.
#### Avant
```spip
#LARGEUR_ECRAN{pleine_largeur}
```
### Après
```spip
#LAYOUT_PRIVE{pleine_largeur}
```
## Fonctions PHP
Dans certains cas parfois utilisées en filtres de squelettes également.
......@@ -589,4 +901,32 @@ $GLOBALS['auteur_session'];
```php
$GLOBALS['visiteur_session'];
```
\ No newline at end of file
```
### `$formats_logos`
La globale `$formats_logos` est supprimé, utilisez `_image_extensions_logos()` à la place (en lecture) et le pipeline `image_extensions_logos` en écriture.
#### Avant
```php
$xx = $GLOBALS['formats_logos']; // (Lecture)
$GLOBALS['formats_logos'] = ;// (Écriture)
```
#### Après
```php
$xx = _image_extensions_logos(['objet' => string, 'id_objet' => int]); // (Lecture)
/**
* (Écriture)
* Modification des formats de logos autorisés
* @param array $flux
* @return array $flux
**/
function <prefix_plugin>_image_extension_logos(array $flux): array {
$flux['data'] = ;
return $flux;
}
```
{
"name": "spip/spip",
"description": "Système de Publication pour l’Internet",
"license": "GPL-3.0-only",
"type": "project",
"keywords": [
"cms",
"spip"
],
"require": {
"php": "^8.2",
"ext-json": "*",
"ext-sodium": "*",
"ext-xml": "*",
"ext-zip": "*",
"algo26-matthias/idna-convert": "^4.0",
"spip/aide": "^3.3.x-dev",
"spip/archiviste": "^3.0.x-dev",
"spip/bigup": "^3.3",
"spip/cache": "^1.0.x-dev",
"spip/compagnon": "^3.2.x-dev",
"spip/composer-installer": "^0.6.1",
"spip/compresseur": "^2.2.x-dev",
"spip/dist": "^4.3.x-dev",
"spip/dump": "^2.2.x-dev",
"spip/filesystem": "^1.2.x-dev",
"spip/forum": "^3.2.x-dev",
"spip/hasher": "^1.0.x-dev",
"spip/images": "^4.3.x-dev",
"spip/logger": "^1.0",
"spip/mediabox": "^3.2.x-dev",
"spip/medias": "^4.4.x-dev",
"spip/mots": "^4.2.x-dev",
"spip/path": "^1.0.x-dev",
"spip/plan": "^4.2.x-dev",
"spip/porte-plume": "^3.2.x-dev",
"spip/revisions": "^3.2.x-dev",
"spip/safehtml": "^3.2.x-dev",
"spip-league/composer-installer": "^0.8",
"spip-league/kernel": "^2.0",
"spip/classic-distribution": "^5.0",
"spip/security": "^1.6",
"spip/sites": "^4.2.x-dev",
"spip/stats": "^3.2.x-dev",
"spip/svp": "^3.2.x-dev",
"spip/tw": "^3.2.x-dev",
"spip/urls": "^4.2.x-dev",
"symfony/deprecation-contracts": "^3.3",
"symfony/polyfill-mbstring": "^1.27",
"symfony/polyfill-php82": "^1.27"
"symfony/polyfill-php83": "^1.31",
"symfony/polyfill-php84": "^1.31"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^1.0",
"lolli42/finediff": "^1.0",
"phpcompatibility/php-compatibility": "10.x-dev",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^11.0",
"spip/coding-standards": "^1.3",
"symfony/var-dumper": "^7.0",
"symplify/easy-coding-standard": "^11.5"
},
"suggest": {
"ext-curl": "*",
"ext-gd": "For image processing",
"ext-iconv": "Can be used as fallback when ext-mbstring is not available",
"ext-mbstring": "Faster than the polyfill for string actions",
"ext-mysqli": "*",
"ext-pdo": "*",
"ext-pdo_sqlite": "*"
"phpunit/phpunit": "^11.4",
"symfony/var-dumper": "^7.2"
},
"repositories": {
"spip": {
......@@ -64,45 +26,28 @@
"url": "https://get.spip.net/composer"
}
},
"autoload": {
"psr-4": {
"Spip\\": "ecrire/src/"
}
},
"minimum-stability": "dev",
"autoload-dev": {
"psr-4": {
"Spip\\Test\\": "ecrire/tests/"
"Spip\\Test\\": "ecrire/tests/integration/"
}
},
"archive": {
"name": "spip",
"exclude": [
"!/vendor",
"/phpunit.xml.dist",
"/phpcs.xml.dist",
"/phpstan.neon.dist",
"/phpstan-baseline.neon",
"!/ecrire",
"!/plugins-dist",
"!/prive",
"!/squelettes-dist",
"/config/",
"!/config/ecran_securite.php",
"!/config/remove.txt",
"/IMG/",
"!/IMG/remove.txt",
"/local/",
"!/local/remove.txt",
"!/local/CACHEDIR.TAG",
"/tmp/",
"!/tmp/remove.txt",
"!/tmp/CACHEDIR.TAG"
"!/vendor"
]
},
"config": {
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true,
"spip/composer-installer": true
"spip-league/composer-installer": true
},
"platform": {
"php": "8.2.17"
"php": "8.2.26"
}
},
"extra": {
......@@ -110,6 +55,7 @@
"dev-master": "5.0.x-dev"
},
"spip": {
"back_office": "spip/ecrire",
"extensions": [
"spip/aide",
"spip/archiviste",
......@@ -132,6 +78,7 @@
"spip/tw",
"spip/urls"
],
"private_template": "spip/prive",
"template": "spip/dist"
}
}
......
Ce diff est replié.
Vous pouvez effacer ce fichier sans dommages.
You can safely remove this file.
<?php
/**
* Répertoires physiques de l'installation SPIP.
*/
return [
/**
* Configuration permanente et inaccessible de la distribution et du ou des sites (clés, accès bdd, ...)
*/
'etc' => 'config/',
/**
* Fond documentaire permanent et accessible d'un site (logo, document, ...)
*/
'doc' => 'IMG/',
/**
* Fichiers temporaires et inaccessibles d'une instance (cache, session, log, ...)
*/
'tmp' => 'tmp/',
/**
* Fichiers temporaires et accessibles d'un site (assets compressés, minifiés, images générés, ...)
*/
'var' => 'local/',
/**
* Noyau historique de SPIP
*/
'core' => 'ecrire/',
/**
* Plugins SPIP fournis avec une distribution, activés automatiquement
*/
'extensions' => 'plugins-dist/',
/**
* Plugins SPIP installables pour l'instance
*/
'plugins' => 'plugins/',
/**
* Jeu de Squelette SPIP par défaut de la distribution
*/
'template' => 'squelettes-dist/',
/**
* Personalisaation de la distribution (ou d'un site ?)
*
* @todo gérer $GLOBALS['dossier_squelettes']
*/
'custom' => 'squelettes/',
/**
* Jeu de Squelette de l'espace privé SPIP par défaut de la distribution
*/
'private_template' => 'prive/',
];
<?php
return [
'front_office' => '/',
'back_office' => 'ecrire/', # Should be /ecrire
];
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Gestion de l'action activer_plugins
*
* @package SPIP\Core\Plugins
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Mise à jour des données si envoi via formulaire
*
* @global array $GLOBALS ['visiteur_session']
* @global array $GLOBALS ['meta']
* @return void
*/
function enregistre_modif_plugin() {
include_spip('inc/plugin');
// recuperer les plugins dans l'ordre des $_POST
$test = [];
foreach (liste_plugin_files() as $file) {
$test['s' . substr(md5(_DIR_PLUGINS . $file), 0, 16)] = $file;
}
if (defined('_DIR_PLUGINS_SUPPL')) {
foreach (liste_plugin_files(_DIR_PLUGINS_SUPPL) as $file) {
$test['s' . substr(md5(_DIR_PLUGINS_SUPPL . $file), 0, 16)] = $file;
}
}
$plugin = [];
foreach ($_POST as $choix => $val) {
if (isset($test[$choix]) && $val == 'O') {
$plugin[] = $test[$choix];
}
}
spip_logger()->info(sprintf(
'Changement des plugins actifs par l’auteur %s: %s',
$GLOBALS['visiteur_session']['id_auteur'],
implode(',', $plugin)
));
ecrire_plugin_actifs($plugin);
// Chaque fois que l'on valide des plugins, on memorise la liste de ces plugins comme etant "interessants", avec un score initial, qui sera decremente a chaque tour : ainsi un plugin active pourra reter visible a l'ecran, jusqu'a ce qu'il tombe dans l'oubli.
$plugins_interessants = @unserialize($GLOBALS['meta']['plugins_interessants']);
if (!is_array($plugins_interessants)) {
$plugins_interessants = [];
}
$plugins_interessants2 = [];
foreach ($plugins_interessants as $plug => $score) {
if ($score > 1) {
$plugins_interessants2[$plug] = $score - 1;
}
}
foreach ($plugin as $plug) {
$plugins_interessants2[$plug] = 10;
} // score initial
ecrire_meta('plugins_interessants', serialize($plugins_interessants2));
}
/**
* Fonction d'initialisation avant l'activation des plugins
*
* Vérifie les droits et met à jour les méta avant de lancer l'activation des plugins
*
* @return void
*/
function action_activer_plugins_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$securiser_action();
if (!autoriser('configurer', '_plugins')) {
die('erreur');
}
// forcer la maj des meta pour les cas de modif de numero de version base via phpmyadmin
lire_metas();
enregistre_modif_plugin();
}
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Gestion de l'action ajouter_lien
*
* @package SPIP\Core\Liens
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Action pour lier 2 objets entre eux
*
* L'argument attendu est `objet1-id1-objet2-id2` (type d'objet, identifiant)
* tel que `mot-7-rubrique-3`.
*
* @uses objet_associer()
*
* @param null|string $arg
* Clé des arguments. En absence utilise l'argument
* de l'action sécurisée.
* @return void
*/
function action_ajouter_lien_dist($arg = null) {
if (is_null($arg)) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
$arg = explode('-', (string) $arg);
[$objet_source, $ids, $objet_lie, $idl] = $arg;
include_spip('action/editer_liens');
objet_associer([$objet_source => $ids], [$objet_lie => $idl]);
}
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Gestion de l'action annuler_job
*
* @package SPIP\Core\Job
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Annuler un travail
*
* @return void
*/
function action_annuler_job_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$id_job = $securiser_action();
if (
($id_job = (int) $id_job)
&& autoriser('annuler', 'job', $id_job)
) {
job_queue_remove($id_job);
}
}
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Gestion de l'action activer_plugins
*
* @package SPIP\Core\Action
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function action_api_transmettre_dist($arg = null) {
// Obtenir l'argument 'id_auteur/cle/format/fond'
if (is_null($arg)) {
$arg = _request('arg');
}
$args = explode('/', (string) $arg);
if (count($args) !== 4) {
action_api_transmettre_fail($arg);
}
[$id_auteur, $cle, $format, $fond] = $args;
$id_auteur = (int) $id_auteur;
if (preg_match(',[^\w\\.-],', $format)) {
action_api_transmettre_fail("format $format ??");
}
if (preg_match(',[^\w\\.-],', $fond)) {
action_api_transmettre_fail("fond $fond ??");
}
// verifier la cle
//[(#ENV{id,0}|securiser_acces{#ENV{cle}, voirstats, #ENV{op}, #ENV{args}}|?{1,0})]
//[(#ENV{id,0}|securiser_acces{#ENV{cle}, voirstats, #ENV{op}, #ENV{args}}|?{1,0})]
$qs = $_SERVER['QUERY_STRING'];
// retirer action et arg de la qs
$contexte = [];
parse_str((string) $qs, $contexte);
foreach (array_keys($contexte) as $k) {
if (in_array($k, ['action', 'arg', 'var_mode'])) {
unset($contexte[$k]);
}
}
$qs = http_build_query($contexte);
include_spip('inc/acces');
if (!securiser_acces_low_sec((int) $id_auteur, $cle, "transmettre/$format", $fond, $qs)) {
// si le autoriser low_sec n'est pas bon, on peut valider l'appel si l'auteur est identifie
include_spip('inc/autoriser');
$autoriser_type = preg_replace(',\W+,', '', "_{$format}{$fond}");
if (
!$id_auteur
|| empty($GLOBALS['visiteur_session']['id_auteur'])
|| $GLOBALS['visiteur_session']['id_auteur'] != $id_auteur
|| !autoriser('transmettre', $autoriser_type, $id_auteur)
) {
action_api_transmettre_fail("auth QS $qs ??");
}
}
$contexte['id_auteur'] = $id_auteur;
$fond = "transmettre/$format/$fond";
if (!trouver_fond($fond)) {
$fond = "prive/$fond";
}
if (!trouver_fond($fond)) {
action_api_transmettre_fail("fond $fond ??");
}
$res = recuperer_fond($fond, $contexte, ['raw' => true]);
if (!empty($res['entetes'])) {
foreach ($res['entetes'] as $h => $v) {
header("$h: $v");
}
}
$res = ltrim((string) $res['texte']);
if (empty($res)) {
spip_logger('transmettre')->notice("$arg $qs resultat vide");
}
echo $res;
exit();
}
function action_api_transmettre_fail($arg): never {
include_spip('inc/minipres');
echo minipres(_T('info_acces_interdit'), $arg);
exit;
}
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Gestion de l'action auth
*
* @package SPIP\Core\Authentification
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Retour d'authentification pour les SSO
*/
function action_auth_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!preg_match(',^(\w+)[/](.+)$,', (string) $arg, $r)) {
spip_logger()->info("action_auth_dist $arg pas compris");
} else {
$auth_methode = $r[1];
$login = $r[2];
include_spip('inc/auth');
$res = auth_terminer_identifier_login($auth_methode, $login);
if (is_string($res)) { // Erreur
$redirect = _request('redirect');
$redirect = parametre_url($redirect, 'var_erreur', $res, '&');
include_spip('inc/headers');
redirige_par_entete($redirect);
}
// sinon on loge l'auteur identifie, et on finit (redirection automatique)
auth_loger($res);
}
}
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Gestion de l'action calculer_taille_cache
*
* @package SPIP\Core\Cache
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Calculer la taille du cache ou du cache image pour l'afficher en ajax sur la page d'admin de SPIP
*
* Si l'argument reçu est 'images', c'est la taille du cache _DIR_VAR qui est calculé,
* sinon celle du cache des squelettes (approximation)
*
* @param string|null $arg
* Argument attendu. En absence utilise l'argument
* de l'action sécurisée.
*/
function action_calculer_taille_cache_dist($arg = null) {
if (is_null($arg)) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
include_spip('inc/filtres');
if ($arg == 'images') {
$taille = calculer_taille_dossier(_DIR_VAR);
$res = _T(
'ecrire:taille_cache_image',
[
'dir' => joli_repertoire(_DIR_VAR),
'taille' => '<b>' . (taille_en_octets($taille) > 0 ? taille_en_octets($taille) : '0 octet') . '</b>'
]
);
} else {
include_spip('inc/invalideur');
$taille =
calculer_taille_dossier(_DIR_CACHE_XML)
+ calculer_taille_dossier(_DIR_CACHE . 'skel/')
+ calculer_taille_dossier(_DIR_CACHE . 'wheels/')
+ calculer_taille_dossier(_DIR_CACHE . 'contextes/');
$taille += (int) taille_du_cache();
if ($taille <= 150000) {
$res = _T('taille_cache_vide');
} elseif ($taille <= 1024 * 1024) {
$res = _T('taille_cache_moins_de', ['octets' => taille_en_octets(1024 * 1024)]);
} else {
$res = _T('taille_cache_octets', ['octets' => taille_en_octets($taille)]);
}
$res = "<b>$res</b>";
}
$res = "<p>$res</p>";
ajax_retour($res);
}
/**
* Calculer la taille d'un dossier, sous dossiers inclus
*
* @param string $dir Répertoire dont on souhaite évaluer la taille
* @return int Taille en octets
*/
function calculer_taille_dossier($dir) {
if (!is_dir($dir) || !is_readable($dir)) {
return 0;
}
$handle = opendir($dir);
if (!$handle) {
return 0;
}
$taille = 0;
while (($fichier = @readdir($handle)) !== false) {
// Eviter ".", "..", ".htaccess", etc.
if ($fichier[0] == '.') {
continue;
}
if (is_file($d = "$dir/$fichier")) {
$taille += filesize($d);
} else {
if (is_dir($d)) {
$taille += calculer_taille_dossier($d);
}
}
}
closedir($handle);
return $taille;
}
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Gestion de l'action confirmer_email
*
* @package SPIP\Core\Inscription
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Confirmer un changement d'email
*
* @global array $GLOBALS ['visiteur_session']
* @global string $GLOBALS ['redirect']
* @return void
*/
function action_confirmer_email_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
include_spip('inc/filtres');
if ($GLOBALS['visiteur_session']['id_auteur'] && email_valide($arg)) {
include_spip('action/editer_auteur');
auteur_modifier($GLOBALS['visiteur_session']['id_auteur'], ['email' => $arg]);
}
// verifier avant de rediriger pour invalider le message de confirmation
// si ca n'a pas marche
if (
($redirect = _request('redirect')) && !$arg == sql_getfetsel(
'email',
'spip_auteurs',
'id_auteur=' . (int) $GLOBALS['visiteur_session']
)
) {
$GLOBALS['redirect'] = parametre_url($redirect, 'email_modif', '');
}
}