Browse Source

Passage qualité sur le plugin afin d'éviter des problèmes en php 8.2

master
Eric Lupinacci 1 month ago
parent
commit
bb5ba78803
  1. 8
      action/affecter_plugin.php
  2. 8
      action/desaffecter_plugin.php
  3. 10
      action/supprimer_export.php
  4. 13
      action/telecharger_export.php
  5. 48
      base/svptype_declarations.php
  6. 108
      ezrest/svptype.php
  7. 30
      formulaires/editer_affectations.php
  8. 46
      formulaires/exporter_typologie.php
  9. 36
      formulaires/importer_typologie.php
  10. 21
      formulaires/vider_typologie.php
  11. 28
      inc/svptype_mot.php
  12. 54
      inc/svptype_plugin.php
  13. 106
      inc/svptype_type_plugin.php
  14. 150
      inc/svptype_typologie.php
  15. 4
      paquet.xml
  16. 22
      saisies/selection_type_plugin_fonctions.php
  17. 22
      svptype_administrations.php
  18. 12
      svptype_autorisations.php
  19. 5
      svptype_fonctions.php
  20. 105
      svptype_pipelines.php

8
action/affecter_plugin.php

@ -9,23 +9,25 @@ if (!defined('_ECRIRE_INC_VERSION')) {
/**
* Action pour affecter un type de plugin à un plugin.
*
* Cette action est réservée aux utilisateurs pouvant affecter un type de plugin.
* L'argument attendu est `id_mot_actuel:prefixe:id_mot:typologie`.
*
* @uses plugin_desaffecter_type_plugin()
* @uses plugin_affecter_type_plugin()
*
* @param null|string $arguments Arguments de l'action ou null si l'action est appelée par une URL
*
* @return void
*/
function action_affecter_plugin_dist($arguments = null) {
// Récupération des arguments de façon sécurisée.
if (is_null($arguments)) {
if (null === $arguments) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arguments = $securiser_action();
}
$arguments = explode(':', $arguments);
list($id_mot_affecte, $id_plugin, $prefixe, $id_mot, $typologie) = $arguments;
[$id_mot_affecte, $id_plugin, $prefixe, $id_mot, $typologie] = $arguments;
// Verification des autorisations
include_spip('inc/autoriser');

8
action/desaffecter_plugin.php

@ -9,22 +9,24 @@ if (!defined('_ECRIRE_INC_VERSION')) {
/**
* Action pour désaffecter un type de plugin d'un plugin.
*
* Cette action est réservée aux utilisateurs pouvant affecter un type de plugin.
* L'argument attendu est `prefixe:id_mot`.
*
* @uses plugin_desaffecter_type_plugin()
*
* @param null|string $arguments Arguments de l'action ou null si l'action est appelée par une URL
*
* @return void
*/
function action_desaffecter_plugin_dist($arguments = null) {
// Récupération des arguments de façon sécurisée.
if (is_null($arguments)) {
if (null === $arguments) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arguments = $securiser_action();
}
$arguments = explode(':', $arguments);
list($id_plugin, $prefixe, $id_mot) = $arguments;
[$id_plugin, $prefixe, $id_mot] = $arguments;
// Verification des autorisations
include_spip('inc/autoriser');

10
action/supprimer_export.php

@ -1,16 +1,20 @@
<?php
/**
* Action pour supprimer un fichier d'export JSON.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Supprimer un fichier d'export JSON.
* Supprimer un fichier d'export JSON (catégories, affectations).
*
* Cette action est réservée aux utilisateurs pouvant accéder à toutes les pages ds SVP Typologie.
* Elle ne nécessite aucun argument.
*
* @return void
*/
function action_supprimer_export_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$fichier = $securiser_action();

13
action/telecharger_export.php

@ -1,15 +1,20 @@
<?php
/**
* Action pour télécharger un fichier d'export JSON.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Telecharger un fichier d'export JSON.
* Télécharger un fichier d'export JSON (catégories, affectations).
*
* Cette action est réservée aux utilisateurs pouvant accéder à toutes les pages ds SVP Typologie.
* Elle ne nécessite aucun argument.
*
* @return void
*/
function action_telecharger_export_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$fichier = $securiser_action();
@ -31,7 +36,7 @@ function action_telecharger_export_dist() {
// Header du stream
$nom = basename($fichier);
header('Content-Type: application/json');
header("Content-Disposition: attachment; filename=\"${nom}\";");
header("Content-Disposition: attachment; filename=\"{$nom}\";");
header('Content-Transfer-Encoding: binary');
// fix for IE catching or PHP bug issue
@ -44,7 +49,7 @@ function action_telecharger_export_dist() {
}
readfile($fichier);
} else {
http_status(404);
http_response_code(404);
include_spip('inc/minipres');
echo minipres(_T('erreur') . ' 404', _T('info_acces_interdit'));
}

48
base/svptype_declarations.php

@ -1,9 +1,9 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Ajouter le champ `identifiant` à la table des mots.
* Ce champ est une chaine sans espace qui représente un id textuel unique (l'unicité se définit
@ -11,44 +11,60 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @pipeline declarer_tables_objets_sql
*
* @param array $tables
* Description des tables
* @param array $tables Description des tables de la base.
*
* @return array
* Description complétée des tables
* @return array Description des tables de la base complétée par celles du plugin.
*/
function svptype_declarer_tables_objets_sql($tables){
function svptype_declarer_tables_objets_sql($tables) {
// Colonne 'identifiant'
$tables['spip_mots']['field']['identifiant'] = "varchar(255) DEFAULT '' NOT NULL";
return $tables;
}
/**
* Déclarations des tables auxilliaires nécessaires au plugin :
* - plugins_typologies, liens entre plugins et types de plugin
*
* @pipeline declarer_tables_auxiliaires
*
* @param $tables_auxiliaires
*
* @return mixed
*/
function svptype_declarer_tables_auxiliaires($tables_auxiliaires) {
// Tables de liens entre plugins et les types de plugins : spip_plugins_typologies
$plugins_typologies = array(
$plugins_typologies = [
'id_groupe' => 'bigint(21) DEFAULT 0 NOT NULL',
'id_mot' => 'bigint(21) DEFAULT 0 NOT NULL',
'prefixe' => "varchar(30) DEFAULT '' NOT NULL"
);
];
$plugins_typologies_key = array(
$plugins_typologies_key = [
'PRIMARY KEY' => 'id_mot, prefixe',
'KEY id_groupe' => 'id_groupe'
);
];
$tables_auxiliaires['spip_plugins_typologies'] = array(
$tables_auxiliaires['spip_plugins_typologies'] = [
'field' => &$plugins_typologies,
'key' => &$plugins_typologies_key
);
];
return $tables_auxiliaires;
}
/**
* Déclaration des informations tierces (alias, traitements, jointures, etc)
* sur les tables de la base de données modifiées ou ajoutées par le plugin.
*
* Le plugin se contente de déclarer les alias des tables et des jointures.
*
* @pipeline declarer_tables_interfaces
*
* @param array $interface Tableau global des informations tierces sur les tables de la base de données
*
* @return array Tableau fourni en entrée et mis à jour avec les nouvelles informations
*/
function svptype_declarer_tables_interfaces($interface) {
// Les tables
$interface['table_des_tables']['plugins_typologies'] = 'plugins_typologies';

108
ezrest/svptype.php

@ -8,7 +8,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// -----------------------------------------------------------------------
// ----------------------- COLLECTION CATEGORIES -------------------------
// -----------------------------------------------------------------------
@ -16,19 +15,14 @@ if (!defined('_ECRIRE_INC_VERSION')) {
/**
* Récupère la liste des catégories de la table spip_mots éventuellement filtrée par profondeur.
*
* @param array $conditions
* Tableau des conditions SQL à appliquer au select et correspondant aux filtres passés dans la requête.
* @param array $filtres
* Tableau des critères de filtrage additionnels.
* @param array $configuration
* Configuration de la collection catégories utile pour savoir quelle fonction appeler pour construire
* chaque filtre.
* @param array $conditions Tableau des conditions SQL à appliquer au select et correspondant aux filtres passés dans la requête.
* @param array $filtres Tableau des critères de filtrage additionnels.
* @param array $configuration Configuration de la collection catégories utile pour savoir quelle fonction appeler pour construire
* chaque filtre.
*
* @return array
* Tableau des catégories.
* @return array Tableau des catégories.
*/
function categories_collectionner($conditions, $filtres, $configuration) {
// Initialisation de la typologie
$typologie = 'categorie';
@ -42,14 +36,12 @@ function categories_collectionner($conditions, $filtres, $configuration) {
/**
* Détermine si la valeur de la profondeur est valide.
*
* @param string $profondeur
* La valeur du critère profondeur
* @param string $profondeur La valeur du critère profondeur
* @param mixed $erreur Erreur retournée éventuellement par la vérification
*
* @return bool
* `true` si la valeur est valide, `false` sinon.
* @return bool `true` si la valeur est valide, `false` sinon.
*/
function categories_verifier_filtre_profondeur($profondeur, &$erreur) {
$est_valide = true;
// Acquisition de la liste des catégories affectables.
@ -57,16 +49,15 @@ function categories_verifier_filtre_profondeur($profondeur, &$erreur) {
$max_profondeur = lire_config('svptype/typologies/categorie/max_profondeur', 0);
// Test de validité
if (intval($profondeur) > $max_profondeur) {
if ((int) $profondeur > $max_profondeur) {
$est_valide = false;
$erreur['type'] = 'profondeur_nok';
$erreur['extra'] = _T('svptype:erreur_400_profondeur_nok_extra', array('max' => $max_profondeur));
$erreur['extra'] = _T('svptype:erreur_400_profondeur_nok_extra', ['max' => $max_profondeur]);
}
return $est_valide;
}
// -----------------------------------------------------------------------
// -------------------------- COLLECTION TAGS ----------------------------
// -----------------------------------------------------------------------
@ -74,19 +65,14 @@ function categories_verifier_filtre_profondeur($profondeur, &$erreur) {
/**
* Récupère la liste des tags de la table spip_mots.
*
* @param array $conditions
* Tableau des conditions SQL à appliquer au select et correspondant aux filtres passés dans la requête.
* @param array $filtres
* Tableau des critères de filtrage additionnels: toujours vide pour les tags.
* @param array $configuration
* Configuration de la collection catégories utile pour savoir quelle fonction appeler pour construire
* chaque filtre.
* @param array $conditions Tableau des conditions SQL à appliquer au select et correspondant aux filtres passés dans la requête.
* @param array $filtres Tableau des critères de filtrage additionnels: toujours vide pour les tags.
* @param array $configuration Configuration de la collection catégories utile pour savoir quelle fonction appeler pour construire
* chaque filtre.
*
* @return array
* Tableau des catégories.
* @return array Tableau des catégories.
*/
function tags_collectionner($conditions, $filtres, $configuration) {
// Initialisation de la typologie
$typologie = 'tag';
@ -97,7 +83,6 @@ function tags_collectionner($conditions, $filtres, $configuration) {
return $tags;
}
// -----------------------------------------------------------------------
// ---------------------- COLLECTION AFFECTATIONS ------------------------
// -----------------------------------------------------------------------
@ -105,21 +90,16 @@ function tags_collectionner($conditions, $filtres, $configuration) {
/**
* Récupère la liste des affectations pour une typologie donnée.
*
* @param array $conditions
* Tableau des conditions SQL à appliquer au select et correspondant aux filtres passés dans la requête.
* @param array $filtres
* Tableau des critères : permet en particulier de choisir les affectations pour une typologie donnée.
* @param array $configuration
* Configuration de la collection affectations utile pour savoir quelle fonction appeler pour construire
* chaque filtre (pas utilisée aujourd'hui).
* @param array $conditions Tableau des conditions SQL à appliquer au select et correspondant aux filtres passés dans la requête.
* @param array $filtres Tableau des critères : permet en particulier de choisir les affectations pour une typologie donnée.
* @param array $configuration Configuration de la collection affectations utile pour savoir quelle fonction appeler pour construire
* chaque filtre (pas utilisée aujourd'hui).
*
* @return array
* Tableau des affectations indexé par préfixe de plugin.
* @return array Tableau des affectations indexé par préfixe de plugin.
*/
function affectations_collectionner($conditions, $filtres, $configuration) {
// Initialisation de la collection
$affectations = array();
$affectations = [];
// On traite préalablement le filtre typologie :
// -- celui-ci est forcément présent (obligatoire) et sa valeur est forcément valide.
@ -127,13 +107,13 @@ function affectations_collectionner($conditions, $filtres, $configuration) {
// Récupérer les informations sur la typologie et le groupe de mots correspondant.
// -- on loge l'identifiant de la typologie.
$affectations['typologie'] = array('identifiant' => $typologie);
$affectations['typologie'] = ['identifiant' => $typologie];
// -- on ajoute le titre du groupe de mots
include_spip('inc/config');
$configuration_typologie = lire_config("svptype/typologies/${typologie}", array());
$id_groupe = intval($configuration_typologie['id_groupe']);
$select = array('titre');
$where = array('id_groupe=' . $id_groupe);
$configuration_typologie = lire_config("svptype/typologies/{$typologie}", []);
$id_groupe = (int) ($configuration_typologie['id_groupe']);
$select = ['titre'];
$where = ['id_groupe=' . $id_groupe];
$affectations['typologie'] = array_merge(
$affectations['typologie'],
sql_fetsel($select, 'spip_groupes_mots', $where)
@ -151,7 +131,7 @@ function affectations_collectionner($conditions, $filtres, $configuration) {
// On refactore le tableau de façon à le présenter avec le préfixe en index.
// -- la liste des types est toujours un tableau même si pour une typologie un seul type est affectable.
$affectations['affectations'] = array();
$affectations['affectations'] = [];
if ($collection) {
foreach ($collection as $_affectation) {
$affectations['affectations'][$_affectation['prefixe']][] = $_affectation['identifiant_mot'];
@ -161,23 +141,20 @@ function affectations_collectionner($conditions, $filtres, $configuration) {
return $affectations;
}
/**
* Détermine si la valeur de la profondeur est valide.
*
* @param string $typologie
* Identifiant de la typologie concernée : categorie, tag...
* @param string $typologie Identifiant de la typologie concernée : categorie, tag...
* @param mixed $erreur Erreur retournée éventuellement par la vérification
*
* @return bool
* `true` si la valeur est valide, `false` sinon.
* @return bool `true` si la valeur est valide, `false` sinon.
*/
function affectations_verifier_filtre_typologie($typologie, &$erreur) {
$est_valide = true;
// Acquisition de la liste des catégories affectables.
include_spip('inc/config');
$typologies = array_keys(lire_config('svptype/typologies', array()));
$typologies = array_keys(lire_config('svptype/typologies', []));
// Test de validité
if (!in_array($typologie, $typologies)) {
@ -189,7 +166,6 @@ function affectations_verifier_filtre_typologie($typologie, &$erreur) {
return $est_valide;
}
// -----------------------------------------------------------------------
// ------------------------ COLLECTION PLUGINS ---------------------------
// -----------------------------------------------------------------------
@ -198,20 +174,18 @@ function affectations_verifier_filtre_typologie($typologie, &$erreur) {
* Détermine si la valeur de la catégorie est valide.
* La fonction récupère via l'API du plugin la liste des catégories autorisées.
*
* @param string $categorie
* La valeur du critère catégorie
* @param string $categorie La valeur du critère catégorie
* @param mixed $erreur Erreur retournée éventuellement par la vérification
*
* @return bool
* `true` si la valeur est valide, `false` sinon.
* @return bool `true` si la valeur est valide, `false` sinon.
*/
function plugins_verifier_filtre_categorie($categorie, &$erreur) {
$est_valide = true;
// Acquisition de la liste des catégories affectables.
include_spip('inc/svptype_type_plugin');
$filtres = array('profondeur' => 1);
$informations = array('identifiant');
$filtres = ['profondeur' => 1];
$informations = ['identifiant'];
$categories = type_plugin_repertorier('categorie', $filtres, $informations);
// Test de validité
@ -224,25 +198,21 @@ function plugins_verifier_filtre_categorie($categorie, &$erreur) {
return $est_valide;
}
/**
* Construit le critère applicable sur la table spip_plugins pour filtrer la collection sur le
* critère categorie.
*
* @param string $categorie
* La valeur du critère catégorie
* @param string $categorie La valeur du critère catégorie
*
* @return string
* Chaine représentant le critère sur la catégorie appliqué à la table spip_plugins.
* @return string Chaine représentant le critère sur la catégorie appliqué à la table spip_plugins.
*/
function plugins_conditionner_categorie($categorie) {
// On initialise le critère avec une condition toujours fausse.
$condition = '0=1';
// On récupère les affectations de plugins pour la catégorie demandée
include_spip('inc/svptype_type_plugin');
$filtres = array('type' => $categorie);
$filtres = ['type' => $categorie];
$affectations = type_plugin_repertorier_affectation('categorie', $filtres);
// Construction de la condition sur les préfixes

30
formulaires/editer_affectations.php

@ -9,14 +9,13 @@ if (!defined('_ECRIRE_INC_VERSION')) {
/**
* Chargement du formulaire d'affectation d'un type de plugin à un plugin donné.
*
* @param int $id_plugin
* @param string $typologie
* @param array $options
* @param int $id_plugin Identifiant unique du plugin
* @param string $typologie Identifiant de la typologie
* @param array $options Options de chargement du formulaire :
*
* @return array
* @return array Variables de contexte en entrée du formulaire
*/
function formulaires_editer_affectations_charger($id_plugin, $typologie, $options = array()) {
function formulaires_editer_affectations_charger($id_plugin, $typologie, $options = []) {
// Les options peuvent être limitées au booléen d'éditabilité
if (!isset($options['editable'])) {
$options['editable'] = true;
@ -32,7 +31,7 @@ function formulaires_editer_affectations_charger($id_plugin, $typologie, $option
// Acquérir la configuration de la typologie.
include_spip('inc/config');
$configuration_typologie = lire_config("svptype/typologies/${typologie}", array());
$configuration_typologie = lire_config("svptype/typologies/{$typologie}", []);
// On détermine si la typologie n'accepte qu'un type de plugin par plugin ou plus.
$typologie_singuliere = ($configuration_typologie['max_affectations'] == 1);
@ -42,19 +41,19 @@ function formulaires_editer_affectations_charger($id_plugin, $typologie, $option
$affectations = plugin_lister_type_plugin($prefixe, $typologie);
// Envoi des valeurs au formulaire.
$valeurs = array(
$valeurs = [
'id_plugin' => $id_plugin,
'prefixe' => $prefixe,
'typologie' => $typologie,
'affectations' => $affectations,
'profondeur_max' => $configuration_typologie['max_profondeur'],
'typologie_singuliere' => $typologie_singuliere,
'attribut_id' => "plugin-${typologie}",
'attribut_id' => "plugin-{$typologie}",
'affecter_plugin' => '',
'desaffecter_plugin' => '',
'visible' => 0,
'editable' => $editable,
);
];
// Les options non definies dans $valeurs sont passees telles quelles au formulaire html
$valeurs = array_merge($options, $valeurs);
@ -81,17 +80,16 @@ function formulaires_editer_affectations_charger($id_plugin, $typologie, $option
*
* @return array
*/
function formulaires_editer_affectations_traiter($id_plugin, $typologie, $options = array()) {
function formulaires_editer_affectations_traiter($id_plugin, $typologie, $options = []) {
// Les options peuvent être limitées au booléen d'éditabilité
if (!isset($options['editable'])) {
$options['editable'] = true;
}
// Initialisation du retour
$retour = array(
$retour = [
'editable' => $options['editable']
);
];
include_spip('inc/autoriser');
if ($options['editable']
@ -117,8 +115,8 @@ function formulaires_editer_affectations_traiter($id_plugin, $typologie, $option
'action',
true
);
$ancien_type_plugin = intval(key($action_affecter_plugin));
$affecter("${ancien_type_plugin}:${nouvelle_affectation}");
$ancien_type_plugin = (int) (key($action_affecter_plugin));
$affecter("{$ancien_type_plugin}:{$nouvelle_affectation}");
}
}
}

46
formulaires/exporter_typologie.php

@ -11,39 +11,33 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* Chargement des données : le formulaire sert à tout type d'exportation. Il est donc nécessaire de construire le
* choix d'exportation entre les types de plugins ou leurs affectations.
*
* @param string $typologie
* Typologie de plugin concernée. Prend les valeurs `categorie` ou `tag`...
* @param string $typologie Typologie de plugin concernée. Prend les valeurs `categorie` ou `tag`...
*
* @return array
* Tableau des données à charger par le formulaire (affichage) :
* - `_vues` : (affichage) choix d'exportation entre les types de plugin ou leurs affectations.
* - `_vue_defaut` : choix par défaut (types de plugin).
* @return array Tableau des données à charger par le formulaire (affichage) :
* - `_vues` : (affichage) choix d'exportation entre les types de plugin ou leurs affectations.
* - `_vue_defaut` : choix par défaut (types de plugin).
*/
function formulaires_exporter_typologie_charger($typologie) {
// Initialisation du tableau des variables fournies au formulaire.
$valeurs = array();
$valeurs = [];
$valeurs['_vues'] = array(
'liste' => _T("svptype:${typologie}_export_vue_liste_label"),
'affectation' => _T("svptype:${typologie}_export_vue_affectation_label"),
);
$valeurs['_vues'] = [
'liste' => _T("svptype:{$typologie}_export_vue_liste_label"),
'affectation' => _T("svptype:{$typologie}_export_vue_affectation_label"),
];
return $valeurs;
}
/**
* Vérification des saisies : il est indispensable de choisir d'exporter les types de plugin ou leurs affectations.
*
* @param string $typologie
* Typologie de plugin concernée. Prend les valeurs `categorie` ou `tag`.
* @param string $typologie Typologie de plugin concernée. Prend les valeurs `categorie` ou `tag`.
*
* @return array
* Tableau des erreurs concernant le choix de la vue qui est obligatoire.
* @return array Tableau des erreurs concernant le choix de la vue qui est obligatoire.
*/
function formulaires_exporter_typologie_verifier($typologie) {
// Initialisation des messages d'erreur
$erreurs = array();
$erreurs = [];
$champ = 'vue_export';
if (empty(_request($champ))) {
@ -54,30 +48,26 @@ function formulaires_exporter_typologie_verifier($typologie) {
return $erreurs;
}
/**
* Exécution du formulaire : les types sont exportés dans un fichier JSON dont le format est compatible avec
* celui de l'importation. Le fichier est créé dans un sous-répertoire de `_DIR_TMP`.
*
* @param string $typologie
* Typologie de plugin concernée. Prend les valeurs `categorie` ou `tag`...
* @param string $typologie Typologie de plugin concernée. Prend les valeurs `categorie` ou `tag`...
*
* @return array
* Tableau retourné par le formulaire contenant toujours un message de bonne exécution ou
* d'erreur. L'indicateur editable est toujours à vrai.
* @return array Tableau retourné par le formulaire contenant toujours un message de bonne exécution ou
* d'erreur. L'indicateur editable est toujours à vrai.
*/
function formulaires_exporter_typologie_traiter($typologie) {
// Initialisation du retour de traitement du formulaire (message, editable).
$retour = array();
$retour = [];
// Récupération des saisies
$vue = _request('vue_export');
// Construction de la fonction d'export.
include_spip('inc/svptype_typologie');
$suffixe = ($vue == 'liste' ? '' : "_${vue}");
$exporter = "typologie_plugin_exporter${suffixe}";
$suffixe = ($vue == 'liste' ? '' : "_{$vue}");
$exporter = "typologie_plugin_exporter{$suffixe}";
// Création du fichier d'export sur le serveur.
if ($fichier = $exporter($typologie)) {

36
formulaires/importer_typologie.php

@ -17,15 +17,14 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* - `_vues` : (affichage) choix d'exportation entre les types de plugin ou leurs affectations.
*/
function formulaires_importer_typologie_charger($typologie) {
// Initialisation du tableau des variables fournies au formulaire.
$valeurs = array();
$valeurs = [];
// Choix des natures de données à importer ou exporter.
$valeurs['_vues'] = array(
'liste' => _T("svptype:${typologie}_import_vue_liste_label"),
'affectation' => _T("svptype:${typologie}_import_vue_affectation_label")
);
$valeurs['_vues'] = [
'liste' => _T("svptype:{$typologie}_import_vue_liste_label"),
'affectation' => _T("svptype:{$typologie}_import_vue_affectation_label")
];
return $valeurs;
}
@ -38,9 +37,8 @@ function formulaires_importer_typologie_charger($typologie) {
* @return array Tableau des erreurs concernant le fichier ou tableau vide si aucune erreur.
*/
function formulaires_importer_typologie_verifier($typologie) {
// Initialisation des messages d'erreur
$erreurs = array();
$erreurs = [];
$champ = 'vue_import';
if (empty(_request($champ))) {
@ -52,12 +50,11 @@ function formulaires_importer_typologie_verifier($typologie) {
if (empty($_FILES[$champ]['name'])) {
// Aucun fichier choisi.
$erreurs[$champ] = _T('info_obligatoire');
} else {
// Le fichier choisi doit être un JSON
if (empty($_FILES[$champ]['type'])
or ($_FILES[$champ]['type'] != 'application/json')) {
$erreurs[$champ] = _T('svptype:import_message_nok_json');
}
} elseif (
empty($_FILES[$champ]['type'])
or ($_FILES[$champ]['type'] != 'application/json')
) {
$erreurs[$champ] = _T('svptype:import_message_nok_json');
}
return $erreurs;
@ -73,9 +70,8 @@ function formulaires_importer_typologie_verifier($typologie) {
* d'erreur. L'indicateur editable est toujours à vrai.
*/
function formulaires_importer_typologie_traiter($typologie) {
// Initialisation du retour de traitement du formulaire (message, editable).
$retour = array();
$retour = [];
$resultat_import = false;
$erreur_json = '';
@ -108,8 +104,8 @@ function formulaires_importer_typologie_traiter($typologie) {
// -- Importation du tableau représentant la typologie.
if ($liste) {
include_spip('inc/svptype_typologie');
$suffixe = $vue == 'liste' ? '' : "_${vue}";
$importer = "typologie_plugin_importer${suffixe}";
$suffixe = $vue == 'liste' ? '' : "_{$vue}";
$importer = "typologie_plugin_importer{$suffixe}";
$resultat_import = $importer($typologie, $liste);
}
}
@ -117,7 +113,7 @@ function formulaires_importer_typologie_traiter($typologie) {
// Retour du formulaire.
if ($resultat_import) {
$retour['message_ok'] = _T('svptype:import_message_ok', array('nb' => $resultat_import));
$retour['message_ok'] = _T('svptype:import_message_ok', ['nb' => $resultat_import]);
// On redirige vers la liste des types ou des plugins suivants le choix afin de voir les ajouts.
include_spip('inc/utils');
$redirect = parametre_url(
@ -131,7 +127,7 @@ function formulaires_importer_typologie_traiter($typologie) {
);
} else {
$retour['message_erreur'] = _T('svptype:import_message_nok')
. ($erreur_json ? "(${erreur_json})" : '');
. ($erreur_json ? "({$erreur_json})" : '');
// On reste sur la page d'importation pour visualiser l'erreur.
$redirect = '';
}

21
formulaires/vider_typologie.php

@ -21,13 +21,12 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* - `_nb_affectations` : (affichage) permet d'afficher ou de masquer le choix des types de plugin en JS
*/
function formulaires_vider_typologie_charger($typologie) {
// Initialisation du tableau des variables fournies au formulaire.
$valeurs = array();
$valeurs = [];
// Labels et explication des choix.
$valeurs['_label_liste'] = _T("svptype:${typologie}_vidage_liste_label");
$valeurs['_label_affectation'] = _T("svptype:${typologie}_vidage_affectation_label");
$valeurs['_label_liste'] = _T("svptype:{$typologie}_vidage_liste_label");
$valeurs['_label_affectation'] = _T("svptype:{$typologie}_vidage_affectation_label");
// Autoriser le vidage des types de plugin :
// - si aucune affectation.
@ -35,14 +34,14 @@ function formulaires_vider_typologie_charger($typologie) {
// Déterminer l'id du groupe pour la typologie concernée.
include_spip('inc/config');
$id_groupe = lire_config("svptype/typologies/${typologie}/id_groupe", 0);
$id_groupe = lire_config("svptype/typologies/{$typologie}/id_groupe", 0);
// Compter les affectations
$valeurs['_nb_affectations'] = sql_countsel(
'spip_plugins_typologies',
array(
[
'id_groupe=' . $id_groupe
)
]
);
return $valeurs;
@ -58,16 +57,18 @@ function formulaires_vider_typologie_charger($typologie) {
* d'erreur. L'indicateur editable est toujours à vrai.
*/
function formulaires_vider_typologie_traiter($typologie) {
// Initialisation du retour de traitement du formulaire (message, editable).
$retour = array();
$retour = [];
// Récupération des saisies
$vider_affectation = _request('vidage_affectation');
$vider_liste = _request('vidage_liste');
// Vérifier qu'un choix a été fait
if (!$vider_affectation and !$vider_liste) {
if (
!$vider_affectation
and !$vider_liste
) {
$retour['message_erreur'] = _T('svptype:vidage_message_nok');
} else {
// On vide en premier les affectations qui elles peuvent toujours être supprimées sans dommage.

28
inc/svptype_mot.php

@ -18,9 +18,8 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @return bool True si le mot est une racine d'une typologie arborescente, false sinon.
*/
function mot_est_racine($id_mot) {
// Initialisation du tableau statique des indicateurs de groupe typologique.
static $est_racine = array();
static $est_racine = [];
if (!isset($est_racine[$id_mot])) {
$est_racine[$id_mot] = false;
@ -28,10 +27,10 @@ function mot_est_racine($id_mot) {
// Groupe et parent du mot
if ($id_mot) {
include_spip('action/editer_objet');
$mot = objet_lire('mot', $id_mot, array('id_groupe', 'id_parent'));
$mot = objet_lire('mot', $id_mot, ['id_groupe', 'id_parent']);
include_spip('inc/config');
if ($configurations_typologie = lire_config('svptype/typologies', array())) {
if ($configurations_typologie = lire_config('svptype/typologies', [])) {
$est_arborescente = array_column($configurations_typologie, 'est_arborescente', 'id_groupe');
if (!empty($est_arborescente[$mot['id_groupe']])) {
$est_racine[$id_mot] = $mot['id_parent'] == 0;
@ -53,15 +52,14 @@ function mot_est_racine($id_mot) {
* @return bool True si le groupe est celui d'une typologie, false sinon.
*/
function groupe_est_typologie_plugin($id_groupe) {
// Initialisation du tableau statique des indicateurs de groupe typologique.
static $est_typologie = array();
static $est_typologie = [];
if (!isset($est_typologie[$id_groupe])) {
$est_typologie[$id_groupe] = false;
include_spip('inc/config');
if ($configurations_typologie = lire_config('svptype/typologies', array())) {
if ($configurations_typologie = lire_config('svptype/typologies', [])) {
$ids_groupe = array_column($configurations_typologie, 'id_groupe');
if (in_array($id_groupe, $ids_groupe)) {
$est_typologie[$id_groupe] = true;
@ -82,16 +80,16 @@ function groupe_est_typologie_plugin($id_groupe) {
* @return int Id du groupe d'appartenance du mot-clé ou 0 sinon.
*/
function mot_lire_groupe($id_mot) {
static $ids_groupe = array();
static $ids_groupe = [];
if (!isset($ids_groupe[$id_mot])) {
$ids_groupe[$id_mot] = 0;
$from = 'spip_mots';
$where = array('id_mot=' . intval($id_mot));
$where = ['id_mot=' . (int) $id_mot];
$id = sql_getfetsel('id_groupe', $from, $where);
if ($id !== null) {
$ids_groupe[$id_mot] = intval($id);
$ids_groupe[$id_mot] = (int) $id;
}
}
@ -109,13 +107,13 @@ function mot_lire_groupe($id_mot) {
* @return string Champ `identifiant` du mot-clé si celui-ci est un type de plugin ou chaine vide sinon.
*/
function mot_lire_identifiant($id_mot) {
static $identifiants = array();
static $identifiants = [];
if (!isset($identifiants[$id_mot])) {
$identifiants[$id_mot] = '';
$from = 'spip_mots';
$where = array('id_mot=' . intval($id_mot));
$where = ['id_mot=' . (int) $id_mot];
$identifiant = sql_getfetsel('identifiant', $from, $where);
if ($identifiant !== null) {
$identifiants[$id_mot] = $identifiant;
@ -133,13 +131,13 @@ function mot_lire_identifiant($id_mot) {
* @return array Tableau des id des enfants d'un mot-clé ou tableau vide sinon.
*/
function mot_lire_enfants($id_mot) {
static $ids_enfant = array();
static $ids_enfant = [];
if (!isset($ids_enfant[$id_mot])) {
$ids_enfant[$id_mot] = array();
$ids_enfant[$id_mot] = [];
$from = 'spip_mots';
$where = array('id_parent=' . intval($id_mot));
$where = ['id_parent=' . (int) $id_mot];
$ids = sql_allfetsel('id_mot', $from, $where);
if ($ids) {
$ids_enfant[$id_mot] = array_column($ids, 'id_mot');

54
inc/svptype_plugin.php

@ -18,14 +18,13 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @return bool `true` si l'insertion se passe correctement ou `false` sinon.
*/
function plugin_affecter_type_plugin($plugin, $id_mot, $typologie) {
// La sortie est toujours ok a priori
$retour = true;
// On détermine le préfixe du plugin qui est utilisé dans la table des affectations :
// -- si c'est le préfixe on le passe en majuscules pour être cohérent avec le stockage en base.
// -- sinon on lit le préfixe à partir de l'id du plugin.
if ($id_plugin = intval($plugin)) {
if ($id_plugin = (int) $plugin) {
include_spip('inc/svp_plugin');
$prefixe = plugin_lire($id_plugin, 'prefixe');
} else {
@ -34,29 +33,29 @@ function plugin_affecter_type_plugin($plugin, $id_mot, $typologie) {
// On récupère l'id du groupe pour la typologie concernée.
include_spip('inc/config');
$id_groupe = lire_config("svptype/typologies/${typologie}/id_groupe", 0);
$id_groupe = lire_config("svptype/typologies/{$typologie}/id_groupe", 0);
// Contruire l'enregistrement d'une affectation définie par le préfixe du plugin et l'id du mot représentant
// le type de plugin. Pour simplifier la récupération des affectations d'une typologie on ajoute aussi l'id du
// groupe matérialisant la typologie.
$set = array(
$set = [
'prefixe' => $prefixe,
'id_mot' => intval($id_mot),
'id_mot' => (int) $id_mot,
'id_groupe' => $id_groupe
);
];
if (sql_insertq('spip_plugins_typologies', $set) === false) {
$retour = false;
} else {
pipeline(
'post_affectation_plugin',
array(
'args' => array(
[
'args' => [
'typologie' => $typologie,
'prefixe' => $prefixe,
'id_mot' => $id_mot,
),
'data' => array()
)
],
'data' => []
]
);
}
@ -72,14 +71,13 @@ function plugin_affecter_type_plugin($plugin, $id_mot, $typologie) {
* @return bool `true` si la suppresion se passe correctement ou `false` sinon.
*/
function plugin_desaffecter_type_plugin($plugin, $id_mot) {
// La sortie est toujours ok a priori
$retour = true;
// On détermine le préfixe du plugin qui est utilisé dans la table des affectations :
// -- si c'est le préfixe on le passe en majuscules pour être cohérent avec le stockage en base.
// -- sinon on lit le préfixe à partir de l'id du plugin.
if ($id_plugin = intval($plugin)) {
if ($id_plugin = (int) $plugin) {
include_spip('inc/svp_plugin');
$prefixe = plugin_lire($id_plugin, 'prefixe');
} else {
@ -89,10 +87,10 @@ function plugin_desaffecter_type_plugin($plugin, $id_mot) {
// Cibler l'affectation dans la table par le préfixe du plugin et l'id du mot représentant le type de plugin.
// Il est inutile de préciser l'id du groupe (donc la typologie) car un mot est uniquement rattaché à une seule
// typologie.
$where = array(
$where = [
'prefixe=' . sql_quote($prefixe),
'id_mot=' . intval($id_mot)
);
'id_mot=' . (int) $id_mot
];
if (sql_delete('spip_plugins_typologies', $where) === false) {
$retour = false;
}
@ -110,11 +108,10 @@ function plugin_desaffecter_type_plugin($plugin, $id_mot) {
* affectés au plugin concerné. Vide si aucune affectation.
*/
function plugin_lister_type_plugin($plugin, $typologie) {
// On détermine le préfixe du plugin qui est utilisé dans la table des affectations :
// -- si c'est le préfixe on le passe en majuscules pour être cohérent avec le stockage en base.
// -- sinon on lit le préfixe à partir de l'id du plugin.
if ($id_plugin = intval($plugin)) {
if ($id_plugin = (int) $plugin) {
include_spip('inc/svp_plugin');
$prefixe = plugin_lire($id_plugin, 'prefixe');
} else {
@ -123,13 +120,13 @@ function plugin_lister_type_plugin($plugin, $typologie) {
// On récupère l'id du groupe pour la typologie concernée.
include_spip('inc/config');
$id_groupe = lire_config("svptype/typologies/${typologie}/id_groupe", 0);
$id_groupe = lire_config("svptype/typologies/{$typologie}/id_groupe", 0);
// Cibler les affectations par le préfixe du plugin et l'id du groupe représentant la typologie.
$where = array(
$where = [
'prefixe=' . sql_quote($prefixe),
'id_groupe=' . $id_groupe
);
];
if ($affectations = sql_allfetsel('id_mot', 'spip_plugins_typologies', $where)) {
// On renvoie la liste des id mot.
$affectations = array_column($affectations, 'id_mot');
@ -139,15 +136,14 @@ function plugin_lister_type_plugin($plugin, $typologie) {
}
function plugin_elaborer_condition($typologie, $id_mot = 0, $plugins_exclus = []) {
// Initialisation de la condition
$condition = '0=1';
// Récupération des plugins sous la forme [prefixe] = id_plugin
$select = array('prefixe', 'spip_plugins.id_plugin as id_plugin');
$from = array('spip_plugins', 'spip_depots_plugins');
$group_by = array('spip_plugins.id_plugin');
$where = array('spip_depots_plugins.id_depot>0', 'spip_depots_plugins.id_plugin=spip_plugins.id_plugin');
$select = ['prefixe', 'spip_plugins.id_plugin as id_plugin'];
$from = ['spip_plugins', 'spip_depots_plugins'];
$group_by = ['spip_plugins.id_plugin'];
$where = ['spip_depots_plugins.id_depot>0', 'spip_depots_plugins.id_plugin=spip_plugins.id_plugin'];
$plugins = sql_allfetsel($select, $from, $where, $group_by);
$plugins = array_column($plugins, 'id_plugin', 'prefixe');
@ -160,11 +156,11 @@ function plugin_elaborer_condition($typologie, $id_mot = 0, $plugins_exclus = []
// sous la forme [prefixe] = affectation
// -- si le type de plugin est une racine d'une typologie arborescente, alors on cherche les affectations aux feuilles
// -- sinon on cherche juste les affectations au type de plugin fourni
$filtres = array();
$filtres = [];
if ($id_mot) {
$filtres = $est_racine
? array('type_racine' => mot_lire_identifiant($id_mot))
: array('id_mot' => $id_mot);
? ['type_racine' => mot_lire_identifiant($id_mot)]
: ['id_mot' => $id_mot];
}
$affectations = type_plugin_repertorier_affectation($typologie, $filtres);
$plugins_affectes = array_column($affectations, null, 'prefixe');

106
inc/svptype_type_plugin.php

@ -24,40 +24,40 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* - sous la forme d'une valeur simple si l'information demandée est unique (chaine)
* - sous la forme d'un tableau associatif indexé par le nom du champ sinon.
*/
function type_plugin_lire($typologie, $type_plugin, $informations = array()) {
static $description_type = array();
static $configurations = array();
function type_plugin_lire($typologie, $type_plugin, $informations = []) {
static $description_type = [];
static $configurations = [];
if (!isset($description_type[$typologie][$type_plugin])) {
// Déterminer les informations du groupe typologique si il n'est pas encore stocké.
if (!isset($configurations[$typologie])) {
include_spip('inc/config');
$configurations[$typologie] = lire_config("svptype/typologies/${typologie}", array());
$configurations[$typologie] = lire_config("svptype/typologies/{$typologie}", []);
}
// Chargement de la description nécessaire du type de plugin en base de données.
// -- seules l'id, l'id_parent, la profondeur, l'identifiant typologique, le titre et le descriptif sont utiles.
$champs_type_plugin = array('id_mot', 'id_parent', 'identifiant', 'profondeur', 'titre', 'descriptif');
$champs_type_plugin = ['id_mot', 'id_parent', 'identifiant', 'profondeur', 'titre', 'descriptif'];
// -- on construit la condition soit sur l'id_mot soit sur l'identifiant en fonction de ce qui est passé
// dans le paramètre $type_plugin.
if ($id_mot = intval($type_plugin)) {
$where = array(
if ($id_mot = (int) $type_plugin) {
$where = [
'id_mot=' . $id_mot,
);
];
} else {
$where = array(
'id_groupe=' . intval($configurations[$typologie]['id_groupe']),
$where = [
'id_groupe=' . (int) ($configurations[$typologie]['id_groupe']),
'identifiant=' . sql_quote($type_plugin)
);
];
}
$description = sql_fetsel($champs_type_plugin, 'spip_mots', $where);
// Sauvegarde de la description de la page pour une consultation ultérieure dans le même hit.
if ($description) {
// Traitements des champs entiers id et profondeur
$description['id_mot'] = intval($description['id_mot']);
$description['id_parent'] = intval($description['id_parent']);
$description['profondeur'] = intval($description['profondeur']);
$description['id_mot'] = (int) ($description['id_mot']);
$description['id_parent'] = (int) ($description['id_parent']);
$description['profondeur'] = (int) ($description['profondeur']);
// Stockage de la description
$description_type[$typologie][$type_plugin] = $description;
@ -69,7 +69,10 @@ function type_plugin_lire($typologie, $type_plugin, $informations = array()) {
// On ne retourne que les champs demandés
$type_plugin_lu = $description_type[$typologie][$type_plugin];
if ($type_plugin_lu and $informations) {
if (
$type_plugin_lu
and $informations
) {
// Extraction des seules informations demandées.
// -- si on demande une information unique on renvoie la valeur simple, sinon on renvoie un tableau.
// -- si une information n'est pas un champ valide elle n'est pas renvoyée sans monter d'erreur.
@ -100,36 +103,35 @@ function type_plugin_lire($typologie, $type_plugin, $informations = array()) {
*
* @api
*
* @param string $typologie Typologie concernée : categorie, tag...
* @param array $filtres Liste des couples (champ, valeur) ou tableau vide.
* @param string|array $informations Identifiant d'un champ ou de plusieurs champs de la description d'un type de plugin.
* Si l'argument est vide, la fonction renvoie les descriptions complètes.
* @param string $typologie Typologie concernée : categorie, tag...
* @param array $filtres Liste des couples (champ, valeur) ou tableau vide.
* @param array|string $informations Identifiant d'un champ ou de plusieurs champs de la description d'un type de plugin.
* Si l'argument est vide, la fonction renvoie les descriptions complètes.
*
* @return array Description complète ou information précise pour chaque type de plugin de la typologie concernée.
*/
function type_plugin_repertorier($typologie, $filtres = array(), $informations = array()) {
function type_plugin_repertorier($typologie, $filtres = [], $informations = []) {
// Utilisation d'une statique pour éviter les requêtes multiples sur le même hit.
static $types = array();
static $types = [];
if (!isset($types[$typologie])) {
// On récupère l'id du groupe pour le type précisé (categorie, tag).
include_spip('inc/config');
$id_groupe = lire_config("svptype/typologies/${typologie}/id_groupe", 0);
$id_groupe = lire_config("svptype/typologies/{$typologie}/id_groupe", 0);
// On récupère la description complète de toutes les catégories de plugin
$from = array('spip_mots');
$where = array('id_groupe=' . $id_groupe);
$order_by = array('identifiant');
$from = ['spip_mots'];
$where = ['id_groupe=' . $id_groupe];
$order_by = ['identifiant'];
$types[$typologie] = sql_allfetsel('*', $from, $where, '', $order_by);
}
// Refactoring du tableau suivant les champs demandés et application des filtres.
$types_filtrees = array();
$types_filtrees = [];
if (!is_array($informations)) {
$informations = array($informations);
$informations = [$informations];
}
$informations = $informations ? array_flip($informations) : array();
$informations = $informations ? array_flip($informations) : [];
foreach ($types[$typologie] as $_cle => $_type) {
// On détermine si on retient ou pas le type.
$filtre_ok = true;
@ -165,28 +167,27 @@ function type_plugin_repertorier($typologie, $filtres = array(), $informations =
*
* @return array Description de chaque affectation (type de plugin, plugin) de la typologie concernée.
*/
function type_plugin_repertorier_affectation($typologie, $filtres = array()) {
function type_plugin_repertorier_affectation($typologie, $filtres = []) {
// On récupère l'id du groupe pour la typologie concernée.
include_spip('inc/config');
$id_groupe = lire_config("svptype/typologies/${typologie}/id_groupe", 0);
$id_groupe = lire_config("svptype/typologies/{$typologie}/id_groupe", 0);
// On initialise la jointure pour récupérer l'identifiant du type de plugin et pas uniquement son id.
$from = array('spip_plugins_typologies', 'spip_mots');
$select = array(
$from = ['spip_plugins_typologies', 'spip_mots'];
$select = [
'spip_plugins_typologies.id_groupe',
'spip_plugins_typologies.id_mot',
'spip_mots.identifiant as identifiant_mot',
'spip_plugins_typologies.prefixe'
);
$order_by = array('spip_plugins_typologies.id_mot', 'spip_plugins_typologies.prefixe');
];
$order_by = ['spip_plugins_typologies.id_mot', 'spip_plugins_typologies.prefixe'];
// On calcule les conditions en y intégrant les critères si ils existent
// -- conditions minimales
$where = array(
$where = [
'spip_plugins_typologies.id_groupe=' . $id_groupe,
'spip_plugins_typologies.id_mot=spip_mots.id_mot'
);
];
// -- conditions issues des filtres
if ($filtres) {
// Traitement du cas où le critère 'type' est utilisé : on le transforme en un critère id_mot.
@ -207,10 +208,10 @@ function type_plugin_repertorier_affectation($typologie, $filtres = array()) {
foreach ($filtres as $_critere => $_valeur) {
if ($_critere == 'id_mot') {
$where[] = is_array($_valeur)
? sql_in("spip_plugins_typologies.${_critere}", $_valeur)
: "spip_plugins_typologies.${_critere}=" . intval($_valeur);
? sql_in("spip_plugins_typologies.{$_critere}", $_valeur)
: "spip_plugins_typologies.{$_critere}=" . (int) $_valeur;
} elseif ($_critere == 'prefixe') {
$where[] = "spip_plugins_typologies.${_critere}=" . sql_quote(strtoupper($_valeur));
$where[] = "spip_plugins_typologies.{$_critere}=" . sql_quote(strtoupper($_valeur));
}
}
}
@ -232,13 +233,12 @@ function type_plugin_repertorier_affectation($typologie, $filtres = array()) {
* @return array Liste des enfants d'un type de plugin ou tableau vide si aucun.
*/
function type_plugin_repertorier_enfant($typologie, $type_plugin) {
// Initialisations statiques pour les performances.
static $enfants = array();
static $enfants = [];
// Le type est fourni soit sous forme de son identifiant soit de son id.
// On calcule dans tous les cas l'id.
if (!$id_mot = intval($type_plugin)) {
if (!$id_mot = (int) $type_plugin) {
// On a passé l'identifiant, il faut déterminer l'id du mot.
$id_mot = type_plugin_lire($typologie, $type_plugin, 'id_mot');
}
@ -263,7 +263,6 @@ function type_plugin_repertorier_enfant($typologie, $type_plugin) {
* @return int Nombre d'enfants d'un type de plugin ou 0 si aucun.
*/
function type_plugin_compter_enfant($typologie, $type_plugin) {
return count(type_plugin_repertorier_enfant($typologie, $type_plugin));
}
@ -278,20 +277,19 @@ function type_plugin_compter_enfant($typologie, $type_plugin) {
* @return int Nombre d'affectations (type de plugin, plugin) d'un type de plugin ou 0 si aucun.
*/
function type_plugin_compter_affectation($typologie, $type_plugin) {
// Initialisations statiques pour les performances.
static $compteurs = array();
static $configurations_typologie = array();
static $compteurs = [];
static $configurations_typologie = [];
// Déterminer les informations du groupe typologique si il n'est pas encore stocké.
if (!isset($configurations_typologie[$typologie])) {
include_spip('inc/config');
$configurations_typologie[$typologie] = lire_config("svptype/typologies/${typologie}", array());
$configurations_typologie[$typologie] = lire_config("svptype/typologies/{$typologie}", []);
}
// Le type est fourni soit sous forme de son identifiant soit de son id.
// Extrait les informations du type de plugin pour utiliser id_mot et profondeur.
$description_type = type_plugin_lire($typologie, $type_plugin, array('id_mot', 'profondeur'));
$description_type = type_plugin_lire($typologie, $type_plugin, ['id_mot', 'profondeur']);
$id_mot = $description_type['id_mot'];
// Recherche des affectations de plugin. Pour les catégories qui sont arborescentes, il faut distinguer :
@ -299,7 +297,7 @@ function type_plugin_compter_affectation($typologie, $type_plugin) {
// -- et les catégories feuille auxquelles sont attachés les plugins (auteur/extension)
if (!isset($compteurs[$id_mot])) {
// Initialisation de la condition sur le groupe de mots.
$where = array('id_groupe=' . intval($configurations_typologie[$typologie]['id_groupe']));
$where = ['id_groupe=' . (int) ($configurations_typologie[$typologie]['id_groupe'])];
// Déterminer le mode de recherche suivant que :
// - la typologie est arborescente ou pas
@ -330,10 +328,10 @@ function type_plugin_elaborer_condition($typologie, $type_plugin, $vue) {
if ($type_plugin) {
// Déterminer les informations de configuration de la typologie.
include_spip('inc/config');
if ($config_typologie = lire_config("svptype/typologies/${typologie}", array())) {
if ($config_typologie = lire_config("svptype/typologies/{$typologie}", [])) {
// On détermine l'id et la profondeur du type.
include_spip('inc/svptype_type_plugin');
if ($description_type_plugin = type_plugin_lire($typologie, $type_plugin, array('id_mot', 'profondeur', 'id_parent'))) {
if ($description_type_plugin = type_plugin_lire($typologie, $type_plugin, ['id_mot', 'profondeur', 'id_parent'])) {
// On détermine la profondeur du type qui est plus fiable que de tester l'existence d'un "/".
$id = $description_type_plugin['id_mot'];
$profondeur = $description_type_plugin['profondeur'];
@ -346,7 +344,7 @@ function type_plugin_elaborer_condition($typologie, $type_plugin, $vue) {
$filtre = 'id_mot=' . $id;
} elseif ($vue === 'navigation') {
$filtre = $config_typologie['est_arborescente']
? 'id_mot=' . intval($id_parent)
? 'id_mot=' . (int) $id_parent
: '';
} else {
$filtre = 'plugins_typologies.id_mot=' . $id;

150
inc/svptype_typologie.php

@ -17,40 +17,39 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @return array Le tableau de la configuration par défaut indexé par l'identifiant de chaque typologie.
*/
function typologie_plugin_configurer() {
// Deux typologies actuellement :
// - categorie : les catégories de plugin
// - tag : les tags de plugin
$configurations_typologie = array(
'categorie' => array(
$configurations_typologie = [
'categorie' => [
'est_arborescente' => true,
'id_groupe' => 0,
'max_affectations' => 1,
'max_profondeur' => 1,
'collection' => array(
'nom' => 'categories',
'module' => 'svptype',
'filtres' => array(
array(
'collection' => [
'nom' => 'categories',
'module' => 'svptype',
'filtres' => [
[
'critere' => 'profondeur',
'est_obligatoire' => false
)
),
]
],
'sans_condition' => true
)
),
'tag' => array(
]
],
'tag' => [
'est_arborescente' => false,
'id_groupe' => 0,
'max_affectations' => 0,
'max_profondeur' => 0,
'collection' => array(
'nom' => 'tags',
'module' => 'svptype',
'filtres' => array()
)
),
);
'collection' => [
'nom' => 'tags',
'module' => 'svptype',
'filtres' => []
]
],
];
return $configurations_typologie;
}
@ -65,7 +64,6 @@ function typologie_plugin_configurer() {
* @return void
*/
function typologie_plugin_creer_groupe() {
// Les groupes de typologie de plugin ont les caractéristiques communes suivantes :
// - groupe technique
// - sans tables liées
@ -73,7 +71,7 @@ function typologie_plugin_creer_groupe() {
// On acquiert la configuration déjà enregistrée pour le plugin.
include_spip('inc/config');
$configuration_plugin = lire_config('svptype', array());
$configuration_plugin = lire_config('svptype', []);
if (!empty($configuration_plugin['typologies'])) {
include_spip('action/editer_objet');
@ -81,21 +79,21 @@ function typologie_plugin_creer_groupe() {
foreach ($configuration_plugin['typologies'] as $_typologie => $_configuration_typologie) {
// On vérifie d'abord si le groupe existe déjà. Si oui, on ne fait rien.
if (!$_configuration_typologie['id_groupe']) {
$groupe = array(
'titre' => "typologie-${_typologie}-plugin",
$groupe = [
'titre' => "typologie-{$_typologie}-plugin",
'technique' => 'oui',
'mots_arborescents' => $_configuration_typologie['est_arborescente'] ? 'oui' : 'non',
'tables_liees' => '',
'minirezo' => 'oui',
'comite' => 'non',
'forum' => 'non',
);
];
if ($id_groupe = objet_inserer('groupe_mots', null, $groupe)) {
$configuration_plugin['typologies'][$_typologie]['id_groupe'] = $id_groupe;
$configuration_plugin_modifiee = true;
} else {
spip_log(
"Erreur lors de l'ajout du groupe pour la typologie ${_typologie}",
"Erreur lors de l'ajout du groupe pour la typologie {$_typologie}",
'svptype' . _LOG_ERREUR
);
}
@ -123,21 +121,20 @@ function typologie_plugin_creer_groupe() {
* @return bool True si le vidage s'est bien passé, false sinon.
*/
function typologie_plugin_vider($typologie, $vue = 'liste') {
// Initialisation du retour.
$retour = true;
// Déterminer l'id du groupe pour la typologie concernée.
include_spip('inc/config');
$id_groupe = lire_config("svptype/typologies/${typologie}/id_groupe", 0);
$id_groupe = lire_config("svptype/typologies/{$typologie}/id_groupe", 0);
// Déterminer la table en fonction de la nature des données à vider.
$from = ($vue == 'liste') ? 'spip_mots' : 'spip_plugins_typologies';
// Construction de la condition sur l'id du groupe qui permet de se limiter à la typologie concernée.
$where = array(
$where = [
'id_groupe=' . $id_groupe,
);
];
// Suppression des données de la base.
if (!sql_delete($from, $where)) {
@ -159,16 +156,15 @@ function typologie_plugin_vider($typologie, $vue = 'liste') {
* @return bool|int Nombre de catégories ajoutées.
*/
function typologie_plugin_importer($typologie, $types) {
// Initialisation du nombre de types ajoutés.
$types_ajoutes = 0;
if ($types) {
// Acquérir la configuration de la typologie.
include_spip('inc/config');
$config_typologie = lire_config("svptype/typologies/${typologie}", array());
$config_typologie = lire_config("svptype/typologies/{$typologie}", []);
if ($id_groupe = intval($config_typologie['id_groupe'])) {
if ($id_groupe = (int) ($config_typologie['id_groupe'])) {
// Identification des champs acceptables pour un type.
include_spip('base/objets');
$description_table = lister_tables_objets_sql('spip_mots');
@ -229,26 +225,25 @@ function typologie_plugin_importer($typologie, $types) {
* @return bool|string Le nom du fichier d'export ou false si erreur.
*/