Typage des fonctions, PHPDoc, PSr et quelques sécurité manquantes (encore...).

Passage en stable de la version.
master
Eric Lupinacci 3 months ago
parent b0b098759b
commit 5148cfc98a

@ -13,12 +13,13 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* Cette action est réservée aux webmestres. Elle accepte un argument optionnel pour forcer la mise à jour.
*
* @param null|string $arguments Arguments de l'action ou null si l'action est appelée par une URL
*
* @return void
*/
function action_rubrique_categorie_synchroniser_texte_dist($arguments = null) {
function action_rubrique_categorie_synchroniser_texte_dist(?string $arguments = null) : void {
// 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();
}
@ -44,7 +45,7 @@ function action_rubrique_categorie_synchroniser_texte_dist($arguments = null) {
// Récupération des catégories de regroupement (profondeur = 0). Les catégories sont déjà fournies avec
// un tri alphabétique sur l'identifiant.
include_spip('inc/svptype_type_plugin');
$categories_meres = type_plugin_repertorier('categorie', array('profondeur' => 0));
$categories_meres = type_plugin_repertorier('categorie', ['profondeur' => 0]);
// On synchronise les rubriques mère et filles dans la même boucle.
$rang_mere = 0;
@ -54,7 +55,7 @@ function action_rubrique_categorie_synchroniser_texte_dist($arguments = null) {
rubrique_categorie_synchroniser($_categorie_mere, $rang_mere, $forcer);
// Récupération des catégories filles
$categories_filles = type_plugin_repertorier('categorie', array('id_parent' => $_categorie_mere['id_mot']));
$categories_filles = type_plugin_repertorier('categorie', ['id_parent' => $_categorie_mere['id_mot']]);
// On synchronise les rubriques de filles selon la même heuristique.
$rang_fille = 0;
@ -68,23 +69,31 @@ function action_rubrique_categorie_synchroniser_texte_dist($arguments = null) {
rubrique_debloquer_edition($GLOBALS['visiteur_session']['id_auteur']);
}
function rubrique_categorie_synchroniser($categorie, $rang, $forcer = false) {
/**
* Synchronise le nom et la description des rubriques-catégorie avec le titre et la description de ladite catégorie.
*
* @param array $categorie Informations sur la catégorie
* @param int $rang Rang de la rubrique pour appliquer un numéro différent à chaque titre de rubrique
* @param null|bool $forcer Indique que la synchronisation doit être appliquée quelque soit le contexte
*
* @return bool `true` si la synchronisation est ok, `false` sinon.
*/
function rubrique_categorie_synchroniser(array $categorie, int $rang, ?bool $forcer = false) : bool {
// Initialiser la sortie de la fonction à false qui indique qu'aucune mise à jour n'a été faite.
$rubrique_synchronisee = false;
// On récupère la rubrique-catégorie correspondante, si elle existe.
$select = array('id_rubrique', 'titre', 'descriptif');
$select = ['id_rubrique', 'titre', 'descriptif'];
$from = 'spip_rubriques';
$where = array('categorie=' . sql_quote($categorie['identifiant']));
$where = ['categorie=' . sql_quote($categorie['identifiant'])];
if ($rubrique = sql_fetsel($select, $from, $where)) {
// La rubrique existe :
// - On traite le titre. Si la catégorie possède un titre différent de l'identifiant
// il est systématiquement utilisé.
$set = array();
$set = [];
if ($categorie['titre'] and ($categorie['titre'] != $categorie['identifiant'])) {
$numero = 10 * $rang;
$set['titre'] = "${numero}. {$categorie['titre']}";
$set['titre'] = "{$numero}. {$categorie['titre']}";
}
// - On traite le descriptif :
@ -104,7 +113,7 @@ function rubrique_categorie_synchroniser($categorie, $rang, $forcer = false) {
// Si il y a un champ à modifier, on met à jour la rubrique.
if ($set) {
include_spip('action/editer_objet');
objet_modifier('rubrique', intval($rubrique['id_rubrique']), $set);
objet_modifier('rubrique', (int) ($rubrique['id_rubrique']), $set);
$rubrique_synchronisee = true;
}
}

@ -15,8 +15,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @return void
*/
function action_rubrique_plugin_generer_prefixe_dist() {
function action_rubrique_plugin_generer_prefixe_dist() : void {
// Securisation: aucun argument attendu.
// Verification des autorisations
@ -36,7 +35,7 @@ function action_rubrique_plugin_generer_prefixe_dist() {
foreach ($secteurs_plugin as $_id_secteur) {
// -- on récupère les rubriques-plugin
$from = 'spip_rubriques';
$where = array('id_secteur=' . intval($_id_secteur));
$where = ['id_secteur=' . (int) $_id_secteur];
$rubriques_plugin = sql_allfetsel('id_rubrique', $from, $where);
if ($rubriques_plugin) {
// Pour chaque rubrique-plugin on identifie si il existe un article possédant une url_site
@ -44,15 +43,15 @@ function action_rubrique_plugin_generer_prefixe_dist() {
include_spip('action/editer_objet');
foreach ($rubriques_plugin as $_rubrique) {
$from = 'spip_articles';
$where = array('id_rubrique=' . intval($_rubrique['id_rubrique']));
if ($urls = sql_allfetsel(array('url_site', 'id_article'), $from, $where)) {
$where = ['id_rubrique=' . (int) ($_rubrique['id_rubrique'])];
if ($urls = sql_allfetsel(['url_site', 'id_article'], $from, $where)) {
foreach ($urls as $_url) {
$set = array();
$set = [];
if ($_url['url_site']
and ((stripos($_url['url_site'], 'https://plugins.spip.net/') === 0)
or (stripos($_url['url_site'], 'http://plugins.spip.net/') === 0))) {
$set['prefixe'] = basename($_url['url_site'], '.html');
objet_modifier('rubrique', intval($_rubrique['id_rubrique']), $set);
objet_modifier('rubrique', (int) ($_rubrique['id_rubrique']), $set);
}
}
}

@ -13,12 +13,13 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* Cette action est réservée aux webmestres. Elle accepte un argument optionnel pour forcer la mise à jour.
*
* @param null|string $arguments Arguments de l'action ou null si l'action est appelée par une URL
*
* @return void
*/
function action_rubrique_plugin_synchroniser_texte_dist($arguments = null) {
function action_rubrique_plugin_synchroniser_texte_dist(?string $arguments = null) : void {
// 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();
}
@ -38,10 +39,10 @@ function action_rubrique_plugin_synchroniser_texte_dist($arguments = null) {
// Récupération des rubriques-plugin idenfiées parce que leur préfixe est initialisé.
include_spip('inc/contrib_rubrique');
$filtres = array(
$filtres = [
'categorie' => '',
'prefixe' => '!'
);
];
$rubriques_plugin = rubrique_repertorier($filtres);
// Pour chaque rubrique on recherche le titre et le slogan du plugin associé pour remplir respectivement
@ -52,7 +53,7 @@ function action_rubrique_plugin_synchroniser_texte_dist($arguments = null) {
// Récupération des champs du plugin
if ($plugin = plugin_lire($_rubrique['prefixe'])) {
// Identification des modifications
$set = array();
$set = [];
// -- On traite le titre. Si le plugin possède un nom il est systématiquement utilisé.
if ($plugin['nom']) {
$set['titre'] = $plugin['nom'];
@ -74,7 +75,7 @@ function action_rubrique_plugin_synchroniser_texte_dist($arguments = null) {
// Si il y a un champ à modifier, on met à jour la rubrique.
if ($set) {
objet_modifier('rubrique', intval($_rubrique['id_rubrique']), $set);
objet_modifier('rubrique', (int) ($_rubrique['id_rubrique']), $set);
}
}
}

@ -1,91 +1,93 @@
<?php
/**
* Utilisation de l'action supprimer pour l'objet inscription
* Utilisation de l'action supprimer pour l'objet inscription.
*
* @plugin Maintenance de Contrib
*
* @copyright 2021
* @author Eric Lupinacci
*
* @licence GNU/GPL
*
* @package SPIP\Contrib\Action
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Action pour supprimer un·e inscription
* Action pour supprimer une inscription.
*
* Cette action est réservée aux utilisateurs pouvant supprimer une inscription.
* Elle nécessite en argument l'id de l'inscription.
*
* Vérifier l'autorisation avant d'appeler l'action.
* @param null|string $arguments Arguments de l'action ou null si l'action est appelée par une URL
*
* @param null|int $arg
* Identifiant à supprimer.
* En absence de id utilise l'argument de l'action sécurisée.
* @return void
**/
function action_supprimer_inscription_dist($arg=null) {
function action_supprimer_inscription_dist($arguments = null) : void {
$need_confirm = false;
if (is_null($arg)){
if (null === $arguments) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$arguments = $securiser_action();
$need_confirm = true;
}
$arg = intval($arg);
$id_inscription = (int) $arguments;
if ($need_confirm){
$ok = confirmer_supprimer_inscription_avant_action(_T('inscription:confirmer_supprimer_inscription'), _T('item_oui') . '! ' . _T('inscription:supprimer_inscription'));
if ($need_confirm) {
confirmer_supprimer_inscription_avant_action(
_T('inscription:confirmer_supprimer_inscription'),
_T('item_oui') . '! ' . _T('inscription:supprimer_inscription')
);
}
// cas suppression
if (autoriser('supprimer', 'inscription', $arg)) {
if ($arg) {
$objet = sql_fetsel('*', 'spip_inscriptions', 'id_inscription=' . sql_quote($arg));
if (autoriser('supprimer', 'inscription', $id_inscription)) {
if ($id_inscription) {
$objet = sql_fetsel('*', 'spip_inscriptions', 'id_inscription=' . sql_quote($id_inscription));
$qui = (!empty($GLOBALS['visiteur_session']['id_auteur']) ? 'auteur #' . $GLOBALS['visiteur_session']['id_auteur'] : 'IP ' . $GLOBALS['ip']);
spip_log("SUPPRESSION inscription#$arg par $qui : " . json_encode($objet), "suppressions" . _LOG_INFO_IMPORTANTE);
spip_log("SUPPRESSION inscription#{$id_inscription} par {$qui} : " . json_encode($objet), 'suppressions' . _LOG_INFO_IMPORTANTE);
sql_delete('spip_inscriptions', 'id_inscription=' . sql_quote($arg));
sql_delete('spip_inscriptions', 'id_inscription=' . sql_quote($id_inscription));
// invalider le cache
include_spip('inc/invalideur');
suivre_invalideur("id='inscription/$arg'");
}
else {
spip_log("action_supprimer_inscription_dist $arg pas compris");
suivre_invalideur("id='inscription/{$id_inscription}'");
} else {
spip_log("action_supprimer_inscription_dist {$id_inscription} pas compris");
}
}
}
/**
* Confirmer avant suppression si on arrive par un bouton action
* @param string $titre
* @param string $titre_bouton
* @param string|null $url_action
* Confirmer avant suppression si on arrive par un bouton d'action.
*
* @param string $titre
* @param string $titre_bouton
* @param null|string $url_action
*
* @return bool
*/
function confirmer_supprimer_inscription_avant_action($titre, $titre_bouton, $url_action=null) {
function confirmer_supprimer_inscription_avant_action($titre, $titre_bouton, $url_action = null) {
if (!$url_action) {
$url_action = self();
$action = _request('action');
$url_action = parametre_url($url_action, 'action', $action, '&');
}
else {
} else {
$action = parametre_url($url_action, 'action');
}
$arg = parametre_url($url_action, 'arg');
$confirm = md5("$action:$arg:".realpath(__FILE__));
$arguments = parametre_url($url_action, 'arg');
$confirm = md5("{$action}:{$arguments}:" . realpath(__FILE__));
if (_request('confirm_action') === $confirm) {
return true;
}
$url_confirm = parametre_url($url_action, "confirm_action", $confirm, '&');
include_spip("inc/filtres");
$url_confirm = parametre_url($url_action, 'confirm_action', $confirm, '&');
include_spip('inc/filtres');
$bouton_action = bouton_action($titre_bouton, $url_confirm);
$corps = "<div style='text-align:center;'>$bouton_action</div>";
$corps = "<div style='text-align:center;'>{$bouton_action}</div>";
include_spip("inc/minipres");
echo minipres($titre,$corps);
include_spip('inc/minipres');
echo minipres($titre, $corps);
exit;
}

@ -1,4 +1,5 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -8,86 +9,85 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* Declarer les champs categorie et préfixe pour les rubriques.
*
* @param array $champs La définition des objets SPIP
* @param null|array $champs La définition des objets SPIP
*
* @return array La définition des objets SPIP modifiés
*/
function contrib_declarer_champs_extras($champs = array()) {
function contrib_declarer_champs_extras(?array $champs = []) {
// Table : spip_rubriques, on initialise les champs extras de la table.
// Ajout de la catégorie de plugin. La saisie est une sélection particulière.
$champs['spip_rubriques']['categorie'] = array(
$champs['spip_rubriques']['categorie'] = [
'saisie' => 'rubrique_categorie',
'options' => array(
'options' => [
'nom' => 'categorie',
'label' => '<:svptype:categorie_identifiant_label:>',
'option_intro' => '<:contrib:categorie_vide_label:>',
'env' => true,
'restrictions' => array(
'modifier' => array(
'restrictions' => [
'modifier' => [
'auteur' => 'webmestre',
),
],
'voir' => false,
),
],
'sql' => "varchar(100) DEFAULT '' NOT NULL",
'rechercher' => true,
'rechercher_ponderation' => 2,
'versionner' => false,
),
'verifier' => array(
),
);
],
'verifier' => [
],
];
// Ajout du préfixe de plugin. La saisie est un input simple.
$champs['spip_rubriques']['prefixe'] = array(
$champs['spip_rubriques']['prefixe'] = [
'saisie' => 'input',
'options' => array(
'options' => [
'nom' => 'prefixe',
'label' => '<:svp:label_prefixe:>',
'restrictions' => array(
'modifier' => array(
'restrictions' => [
'modifier' => [
'auteur' => 'webmestre',
),
],
'voir' => false,
),
],
'sql' => "varchar(30) DEFAULT '' NOT NULL",
'rechercher' => true,
'rechercher_ponderation' => 10,
'versionner' => false,
),
'verifier' => array(
),
);
],
'verifier' => [
],
];
// Table : spip_rubriques, on initialise les champs extras de la table.
// Ajout de la catégorie de plugin. La saisie est une sélection particulière.
$champs['spip_articles']['type_article'] = array(
$champs['spip_articles']['type_article'] = [
'saisie' => 'article_type',
'options' => array(
'options' => [
'nom' => 'type_article',
'label' => '<:contrib:type_article_label:>',
'data' => array(
'data' => [
'' => '<:contrib:type_article_utilisation_label:>',
'conception' => '<:contrib:type_article_conception_label:>',
'actualite' => '<:contrib:type_article_actualite_label:>'
),
'exclusions' => array(
'' => array(),
'conception' => array('apropos'),
'actualite' => array('apropos', 'carnet')
),
],
'exclusions' => [
'' => [],
'conception' => ['apropos'],
'actualite' => ['apropos', 'carnet']
],
'env' => true,
'restrictions' => array(
'modifier' => array(
'restrictions' => [
'modifier' => [
'auteur' => 'webmestre',
),
),
],
],
'sql' => "varchar(16) DEFAULT '' NOT NULL",
'versionner' => false,
),
'verifier' => array(
),
);
],
'verifier' => [
],
];
return $champs;
}
@ -97,20 +97,18 @@ function contrib_declarer_champs_extras($champs = array()) {
*
* @pipeline declarer_tables_interfaces
*
* @param array $interfaces
* Déclarations d'interface pour le compilateur
* @param array $interfaces Déclarations d'interface pour le compilateur
*
* @return array
* Déclarations d'interface pour le compilateur
* @return array Déclarations d'interface pour le compilateur
*/
function contrib_declarer_tables_interfaces($interfaces) {
function contrib_declarer_tables_interfaces(array $interfaces) : array {
// Les tables : permet d'appeler une boucle avec le *type* de la table uniquement
$interfaces['table_des_tables']['inscriptions'] = 'inscriptions';
// Les traitements
// - on desérialise les tableaux
$interface['table_des_traitements']['PARAMETRES']['inscriptions'] = 'unserialize(%s)';
$interface['table_des_traitements']['DESCRIPTIF']['inscriptions'] = 'typo(%s)';
$interfaces['table_des_traitements']['PARAMETRES']['inscriptions'] = 'unserialize(%s)';
$interfaces['table_des_traitements']['DESCRIPTIF']['inscriptions'] = 'typo(%s)';
return $interfaces;
}
@ -120,61 +118,58 @@ function contrib_declarer_tables_interfaces($interfaces) {
*
* @pipeline declarer_tables_objets_sql
*
* @param array $tables
* Description des tables
* @param array $tables Description des tables
*
* @return array
* Description complétée des tables
* @return array Description complétée des tables
*/
function contrib_declarer_tables_objets_sql($tables) {
$tables['spip_inscriptions'] = array(
'type' => 'inscription',
function contrib_declarer_tables_objets_sql(array $tables) : array {
$tables['spip_inscriptions'] = [
'type' => 'inscription',
'principale' => 'oui',
'field'=> array(
'id_inscription' => 'bigint(21) NOT NULL',
'username' => 'varchar(100) DEFAULT "" NOT NULL',
'email' => 'tinytext DEFAULT "" NOT NULL',
'descriptif' => 'tinytext DEFAULT "" NOT NULL',
'charte_approuvee' => 'varchar(3) DEFAULT "non" NOT NULL',
'parametres' => 'text DEFAULT "" NOT NULL',
'topic_id' => 'bigint(21) DEFAULT 0 NOT NULL',
'date' => 'datetime DEFAULT "0000-00-00 00:00:00" NOT NULL',
'statut' => 'varchar(20) DEFAULT "0" NOT NULL',
'maj' => 'timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'
),
'key' => array(
'PRIMARY KEY' => 'id_inscription',
'KEY statut' => 'statut',
),
'titre' => "CONCAT(username,'-',id_inscription) AS titre, '' AS lang",
'champs_editables' => array('username', 'email'),
'champs_versionnes' => array(),
'rechercher_champs' => array("username" => 10, "email" => 10),
'tables_jointures' => array(),
'statut_titres' => array(
'field' => [
'id_inscription' => 'bigint(21) NOT NULL',
'username' => 'varchar(100) DEFAULT "" NOT NULL',
'email' => 'tinytext DEFAULT "" NOT NULL',
'descriptif' => 'tinytext DEFAULT "" NOT NULL',
'charte_approuvee' => 'varchar(3) DEFAULT "non" NOT NULL',
'parametres' => 'text DEFAULT "" NOT NULL',
'topic_id' => 'bigint(21) DEFAULT 0 NOT NULL',
'date' => 'datetime DEFAULT "0000-00-00 00:00:00" NOT NULL',
'statut' => 'varchar(20) DEFAULT "0" NOT NULL',
'maj' => 'timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'
],
'key' => [
'PRIMARY KEY' => 'id_inscription',
'KEY statut' => 'statut',
],
'titre' => "CONCAT(username,'-',id_inscription) AS titre, '' AS lang",
'champs_editables' => ['username', 'email'],
'champs_versionnes' => [],
'rechercher_champs' => ['username' => 10, 'email' => 10],
'tables_jointures' => [],
'statut_titres' => [
'prop' => 'inscription:titre_statut_demandee',
'publie' => 'inscription:titre_statut_acceptee',
'refuse' => 'inscription:titre_statut_refusee',
'poubelle' => 'inscription:titre_statut_poubelle',
),
'statut_textes_instituer' => array(
],
'statut_textes_instituer' => [
'prop' => 'inscription:texte_statut_demandee',
'publie' => 'inscription:texte_statut_acceptee',
'refuse' => 'inscription:texte_statut_refusee',
'poubelle' => 'inscription:texte_statut_poubelle',
),
'statut'=> array(
array(
],
'statut' => [
[
'champ' => 'statut',
'publie' => 'publie',
'previsu' => 'publie,prop',
'post_date' => 'date',
'exception' => array('statut','tout')
)
),
'exception' => ['statut','tout']
]
],
'texte_changer_statut' => 'inscription:texte_changer_statut_inscription',
);
];
return $tables;
}

@ -1,4 +1,5 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -8,12 +9,13 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* Crée les champs categorie et préfixe pour les rubriques
*
* @param string $nom_meta_base_version
* @param string $version_cible
* @param string $nom_meta_base_version Nom de la meta dans laquelle sera rangée la version du schéma
* @param string $version_cible Version du schéma de données en fin d'upgrade
*
* @return void
*/
function contrib_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
function contrib_upgrade(string $nom_meta_base_version, string $version_cible) : void {
$maj = [];
// Ajout des colonnes supplémentaires dans les tables spip_rubriques et spip_articles.
include_spip('inc/cextras');
@ -21,19 +23,19 @@ function contrib_upgrade($nom_meta_base_version, $version_cible) {
cextras_api_upgrade(contrib_declarer_champs_extras(), $maj['create']);
// Ajout de la tables des demandes d'inscription
$maj['2'] = array(
array('maj_tables', array('spip_inscriptions'))
);
$maj['2'] = [
['maj_tables', ['spip_inscriptions']]
];
// Ajout de la tables des demandes d'inscription
$maj['3'] = array(
array('sql_alter', 'TABLE spip_inscriptions ADD topic_id bigint(21) DEFAULT 0 NOT NULL AFTER parametres')
);
$maj['3'] = [
['sql_alter', 'TABLE spip_inscriptions ADD topic_id bigint(21) DEFAULT 0 NOT NULL AFTER parametres']
];
// Ajout de la tables des demandes d'inscription
$maj['4'] = array(
array('sql_alter', 'TABLE spip_inscriptions ADD descriptif tinytext DEFAULT "" NOT NULL AFTER email')
);
$maj['4'] = [
['sql_alter', 'TABLE spip_inscriptions ADD descriptif tinytext DEFAULT "" NOT NULL AFTER email']
];
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
@ -44,10 +46,11 @@ function contrib_upgrade($nom_meta_base_version, $version_cible) {
*
* Supprime les champs categorie et préfixe pour les rubriques
*
* @param string $nom_meta_base_version
* @param string $nom_meta_base_version Nom de la meta dans laquelle sera rangée la version du schéma
*
* @return void
*/
function contrib_vider_tables($nom_meta_base_version) {
function contrib_vider_tables(string $nom_meta_base_version) : void {
// Suppression des colonnes ajoutées à l'installation.
include_spip('inc/cextras');
include_spip('base/contrib_declarations');

@ -1,4 +1,5 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -36,7 +37,6 @@ function autoriser_contrib_dist($faire, $type, $id, $qui, $options) {
* -- que son secteur ne soit ni un secteur-carnet, ni un secteur-apropos, ni un secteur-galaxie.
* -- et qu'il ait déjà sa catégorie remplie.
*
*
* @param $faire
* L'action se nomme modifierextra
* @param $type
@ -52,18 +52,17 @@ function autoriser_contrib_dist($faire, $type, $id, $qui, $options) {
* @return bool
*/
function autoriser_rubrique_modifierextra_categorie($faire, $type, $id, $qui, $opt) {
// Par défaut la modification est interdite.
$autoriser = false;
// Seuls les webmestres peuvent configurer la catégorie d'une rubrique.
if (autoriser('webmestre')) {
include_spip('inc/contrib_rubrique');
$id_parent = isset($opt['contexte']['id_parent']) ? intval($opt['contexte']['id_parent']) : null;
if (!is_null($id_parent)) {
$id_parent = isset($opt['contexte']['id_parent']) ? (int) ($opt['contexte']['id_parent']) : null;
if (null !== $id_parent) {
if (!$id_parent) {
// La rubrique parent est nulle: la rubrique en cours de création ou de modification est un secteur.
$id_rubrique = intval($id);
$id_rubrique = (int) $id;
if (!$id_rubrique) {
// Création d'un secteur: on autorise car c'est plus surement un secteur plugin.
$autoriser = true;
@ -89,7 +88,7 @@ function autoriser_rubrique_modifierextra_categorie($faire, $type, $id, $qui, $o
// On vérifie la profondeur de la rubrique parent est un secteur et qu'elle a une catégorie
// non vide.
$parent = rubrique_lire($id_parent);
$profondeur = intval($parent['profondeur']);
$profondeur = (int) ($parent['profondeur']);
if (($profondeur == 0)
and ($parent['categorie'])) {
$autoriser = true;
@ -127,19 +126,18 @@ function autoriser_rubrique_modifierextra_categorie($faire, $type, $id, $qui, $o
* @return bool
*/
function autoriser_rubrique_modifierextra_prefixe($faire, $type, $id, $qui, $opt) {
// Par défaut la modification est interdite.
$autoriser = false;
// Seuls les webmestres peuvent configurer le préfixe d'une rubrique-plugin.
if (autoriser('webmestre')) {
$id_parent = isset($opt['contexte']['id_parent']) ? intval($opt['contexte']['id_parent']) : 0;
$id_parent = isset($opt['contexte']['id_parent']) ? (int) ($opt['contexte']['id_parent']) : 0;
if ($id_parent) {
// On vérifie la profondeur de la rubrique parent qui ne peut-être que 2 et le remplissage de sa
// catégorie.
include_spip('inc/contrib_rubrique');
$parent = rubrique_lire($id_parent);
$profondeur = intval($parent['profondeur']);
$profondeur = (int) ($parent['profondeur']);
if (($profondeur == 1)
and $parent['categorie']) {
$autoriser = true;
@ -163,7 +161,6 @@ function autoriser_rubrique_modifierextra_prefixe($faire, $type, $id, $qui, $opt
* @return bool
*/
function autoriser_contrib_menu_dist($faire, $type, $id, $qui, $options) {
// Initialisation de l'autorisation
$autoriser = autoriser('defaut');
@ -171,13 +168,14 @@ function autoriser_contrib_menu_dist($faire, $type, $id, $qui, $options) {
}
/**
* Autorisation de voir (inscriptions)
* Autorisation de voir (inscriptions).
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
*
* @return bool true s'il a le droit, false sinon
**/
function autoriser_inscriptions_voir_dist($faire, $type, $id, $qui, $opt) {
@ -185,13 +183,14 @@ function autoriser_inscriptions_voir_dist($faire, $type, $id, $qui, $opt) {
}
/**
* Autorisation de voir (inscription)
* Autorisation de voir (inscription).
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
*
* @return bool true s'il a le droit, false sinon
**/
function autoriser_inscription_voir_dist($faire, $type, $id, $qui, $opt) {
@ -199,70 +198,75 @@ function autoriser_inscription_voir_dist($faire, $type, $id, $qui, $opt) {
}
/**
* Autorisation de créer (inscription)
* Autorisation de créer (inscription).
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
* @return bool true s'il a le droit, false sinon
**/
function autoriser_inscription_creer_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de mettre un icone (inscription)
* Autorisation de mettre un icone (inscription).
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
* @return bool true s'il a le droit, false sinon
**/
function autoriser_inscription_iconifier_dist($faire, $type, $id, $qui, $opt) {
return false;
}
/**
* Autorisation de modification du statut (inscription)
* Autorisation de modification du statut (inscription).
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
*
* @return bool true s'il a le droit, false sinon
**/
function autoriser_inscription_instituer_dist($faire, $type, $id, $qui, $opt) {
return autoriser('webmestre');
}
/**
* Autorisation de modifier (inscription)
* Autorisation de modifier (inscription).
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
* @return bool true s'il a le droit, false sinon
**/
function autoriser_inscription_modifier_dist($faire, $type, $id, $qui, $opt) {
return autoriser('webmestre');
}
/**
* Autorisation de supprimer (inscription)
* Autorisation de supprimer (inscription).
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
* @return bool true s'il a le droit, false sinon
**/
function autoriser_inscription_supprimer_dist($faire, $type, $id, $qui, $opt) {
return autoriser('webmestre');

@ -1,4 +1,7 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Compile la balise `#GITEA_USER_INFOS` qui fournit un champ ou tous les champs descriptifs d'un user Gitea.
@ -11,35 +14,34 @@
* #GITEA_USER_INFOS{email}, renvoie tous les champs descriptifs du user Gitea désigné par son email
* #GITEA_USER_INFOS{email, existe}, indique si le user existe déjà dans la base Gitea
* ```
* @param Champ $p
* Pile au niveau de la balise.
*
* @return Champ
* Pile complétée par le code à générer.
* @param Champ $p Pile au niveau de la balise.
*
* @return Champ Pile complétée par le code à générer.
**/
function balise_GITEA_USER_INFOS_dist($p) {
function balise_GITEA_USER_INFOS_dist(Champ $p) : Champ {
// Deux arguments : l'email obligatoire pour désigner le user et éventuellement une information précise sur le user
$email = interprete_argument_balise(1, $p);
$email = str_replace('\'', '"', $email);
$information = interprete_argument_balise(2, $p);
$information = isset($information) ? str_replace('\'', '"', $information) : '""';
$p->code = "gitea_user_informer($email, $information)";
$p->code = "gitea_user_informer({$email}, {$information})";
return $p;
}
/**
* Renvoie des informations sur un utilisateur connu par son email.
*
* @internal
*
* @param string $bloc
* @param string $information
* @param string $email Email identifiant l'utilisateur
* @param null|string $information Information demandée sur l'utilisateur ou vide pour toutes les informations
*
* @return array|string|bool
* @return array|bool|string Information ou toutes les informations disponibles sur l'utilisateur.
*/
function gitea_user_informer($email, $information = '') {
function gitea_user_informer(string $email, ?string $information = '') {
// Initialisation du retour en fonction de la demande
$retour = !$information ? [] : ($information === 'existe' ? false : '');
@ -62,7 +64,6 @@ function gitea_user_informer($email, $information = '') {
return $retour;
}
/**
* Compile la balise `#GITEA_USER_LISTE` qui renvoie la liste des users de la forge Gitea filtrée selon
* les critères fournis. Chaque objet est fourni avec sa description complète.
@ -70,31 +71,32 @@ function gitea_user_informer($email, $information = '') {
*
* @balise
*
* @param Champ $p
* Pile au niveau de la balise.
* @param Champ $p Pile au niveau de la balise.
*
* @return Champ
* Pile complétée par le code à générer.
* @return Champ Pile complétée par le code à générer.
**/
function balise_GITEA_USER_LISTE_dist($p) {
function balise_GITEA_USER_LISTE_dist(Champ $p) : Champ {
// Les filtres sont optionnels
$filtres = interprete_argument_balise(1, $p);
$filtres = isset($filtres) ? str_replace('\'', '"', $filtres) : 'array()';
// Aucun argument à la balise.
$p->code = "gitea_user_lister(${filtres})";
$p->code = "gitea_user_lister({$filtres})";
return $p;
}
/**
* Renvoie la liste des utilisateurs éventuellement filtrée.
*
* @internal
*
* @return array|string
* @param null|array $filtres Liste des filtres
*
* @return array Liste des utilisateurs
*/
function gitea_user_lister($filtres = array()) {
function gitea_user_lister(?array $filtres = []) : array {
include_spip('services/gitea');
return gitea_user_repertorier($filtres);
}

@ -2,39 +2,50 @@
// On force le mode d'utilisation de SVP a non runtime car on veut presenter tous les
// plugins contenus dans les depots quelque soit leur compatibilite spip
if (!defined('_SVP_MODE_RUNTIME'))
if (!defined('_SVP_MODE_RUNTIME')) {
define('_SVP_MODE_RUNTIME', false);
}
// Liste des pages publiques d'objet supportees par le squelette (depot, plugin).
// Permet d'afficher le bouton voir en ligne dans la page d'edition de l'objet
if (!defined('_SVP_PAGES_OBJET_PUBLIQUES'))
if (!defined('_SVP_PAGES_OBJET_PUBLIQUES')) {
define('_SVP_PAGES_OBJET_PUBLIQUES', 'depot:plugin');
}
// Taille des listes et pas de pagination de la page sommaire
if (!defined('_PLUGINSPIP_TAILLE_SELECTION_PLUGINS'))
define('_PLUGINSPIP_TAILLE_SELECTION_PLUGINS', 10);
if (!defined('_PLUGINSPIP_TAILLE_TOP_PLUGINS'))
define('_PLUGINSPIP_TAILLE_TOP_PLUGINS', 30);
if (!defined('_PLUGINSPIP_TAILLE_MAJ_PLUGINS'))
define('_PLUGINSPIP_TAILLE_MAJ_PLUGINS', 30);
if (!defined('_PLUGINSPIP_PAS_TOP_PLUGINS'))
define('_PLUGINSPIP_PAS_TOP_PLUGINS', 5);
if (!defined('_PLUGINSPIP_PAS_MAJ_PLUGINS'))
define('_PLUGINSPIP_PAS_MAJ_PLUGINS', 5);
if (!defined('_SVP_PERIODE_ACTUALISATION_DEPOTS'))
define('_SVP_PERIODE_ACTUALISATION_DEPOTS', 1);
if (!defined('_PLUGINSPIP_TAILLE_SELECTION_PLUGINS')) {
define('_PLUGINSPIP_TAILLE_SELECTION_PLUGINS', 10);
}
if (!defined('_PLUGINSPIP_TAILLE_TOP_PLUGINS')) {
define('_PLUGINSPIP_TAILLE_TOP_PLUGINS', 30);
}
if (!defined('_PLUGINSPIP_TAILLE_MAJ_PLUGINS')) {
define('_PLUGINSPIP_TAILLE_MAJ_PLUGINS', 30);
}
if (!defined('_PLUGINSPIP_PAS_TOP_PLUGINS')) {
define('_PLUGINSPIP_PAS_TOP_PLUGINS', 5);
}
if (!defined('_PLUGINSPIP_PAS_MAJ_PLUGINS')) {
define('_PLUGINSPIP_PAS_MAJ_PLUGINS', 5);
}
if (!defined('_SVP_PERIODE_ACTUALISATION_DEPOTS')) {
define('_SVP_PERIODE_ACTUALISATION_DEPOTS', 1);
}
// Branche SPIP stable
if (!defined('_PLUGINSPIP_BRANCHE_STABLE'))
define('_PLUGINSPIP_BRANCHE_STABLE', '4.1');
if (!defined('_PLUGINSPIP_BRANCHE_STABLE')) {
define('_PLUGINSPIP_BRANCHE_STABLE', '4.2');
}
// Branches SPIP maintenues
if (!defined('_PLUGINSPIP_BRANCHES_MAINTENUES'))
define('_PLUGINSPIP_BRANCHES_MAINTENUES', '4.1,4.0,3.2');
if (!defined('_PLUGINSPIP_BRANCHES_MAINTENUES')) {
define('_PLUGINSPIP_BRANCHES_MAINTENUES', '4.2,4.1,4.0,3.2');
}
// Période de rafaichissement du cache autodoc
if (!defined('_PLUGINSPIP_TIMEOUT_AUTODOC'))
define('_PLUGINSPIP_TIMEOUT_AUTODOC', 3600*24);
if (!defined('_PLUGINSPIP_TIMEOUT_AUTODOC')) {
define('_PLUGINSPIP_TIMEOUT_AUTODOC', 3600 * 24);
}
// Forcer l'utilisation de la langue du visiteur
$GLOBALS['forcer_lang'] = true;

@ -1,15 +1,24 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function contrib_formulaire_charger($flux) {
/**
* Surcharge de la fonction charger des formulaires concernés, a savoir :
* - editer_article_accueil.
*
* @param array $flux Flux d'entrée
*
* @return array Flux mis à jour
*
**/
function contrib_formulaire_charger(array $flux) : array {
// Personnalisation du formulaire de choix de l'article d'accueil
if ($flux['args']['form'] == 'editer_article_accueil') {
if ($flux['args']['form'] === 'editer_article_accueil') {
// Choisir la liste des statuts autorisés, le filtre sur le type d'article
// et le titre du bloc
$flux['data']['_statuts'] = array('prepa', 'prop', 'publie');
$flux['data']['_statuts'] = ['prepa', 'prop', 'publie'];
$flux['data']['_where'] = "type_article=''";
$flux['data']['_titre'] = _T('contrib:article_accueil_titre');
}
@ -17,37 +26,46 @@ function contrib_formulaire_charger($flux) {
return $flux;
}
function contrib_affiche_droite($flux) {
/**
* Ajouter du contenu dans la colonne de droite (extra).
*
* Page d'un mot "type de plugin" représentant une catégorie de niveau 0 :
* - ajout du formulaire de choix de la couleur de la rubrique
*
* @param array $flux Flux d'entrée contenant la chaine affichée
*
* @return array Flux complété
*/
function contrib_affiche_droite(array $flux) : array {
// Identification de la page et de l'objet
$exec = $flux['args']['exec'];
// Récupérer la liste des objets qui supporte une couleur
include_spip('inc/config');
$objets_config = lire_config('couleur_objet/objets', array());
$objets_config = lire_config('couleur_objet/objets', []);
include_spip('inc/svptype_type_plugin');
if (
in_array('spip_mots', $objets_config) // si configuration objets ok
and ($exec == 'type_plugin') // page d'un objet éditorial
and ($id_objet = intval($flux['args']['id_mot']))
and ($exec === 'type_plugin') // page d'un objet éditorial
and ($id_objet = (int) ($flux['args']['id_mot']))
and ($typologie = _request('typologie'))
and ($typologie == 'categorie')
and ($typologie === 'categorie')
and (type_plugin_lire($typologie, $id_objet, 'profondeur') == 0)
) {
$couleur = sql_getfetsel(
'couleur_objet',
'spip_couleur_objet_liens',
array(
[
'objet=' . sql_quote('mot'),
'id_objet=' . $id_objet
)
]
);
$contexte = array(
$contexte = [
'objet' => 'mot',
'id_objet' => $id_objet,
'couleur_objet' => $couleur
);
];
$flux['data'] .= recuperer_fond('inclure/couleur_objet', $contexte);
}
@ -55,18 +73,18 @@ function contrib_affiche_droite($flux) {
}
/**
* Insertion dans le pipeline boite_infos (SPIP).
* Insertion dans le pipeline boite_infos.
* - Fiche objet d'un plugin :
* - Rajouter un lien privé vers la rubrique associée si elle existe.
* - Enrichir le préfixe avec la couleur de la catégorie du plugin.
*
* @pipeline boite_infos
*
* @param $flux array Le contexte du pipeline
* @param array $flux Le contexte du pipeline
*
* @return $flux array Le contexte du pipeline modifié
* @return array Le contexte du pipeline modifié
*/
function contrib_boite_infos($flux) {
function contrib_boite_infos(array $flux) : array {
if (isset($flux['args']['type'])) {
// Initialisation du type d'objet concerné.
$objet = $flux['args']['type'];
@ -74,8 +92,8 @@ function contrib_boite_infos($flux) {
if (
($objet_exec = trouver_objet_exec($objet))
and !$objet_exec['edition']
and ($objet == 'plugin')
and ($id_plugin = intval($flux['args']['id']))
and ($objet === 'plugin')
and ($id_plugin = (int) ($flux['args']['id']))
) {
// Page d'un plugin.
@ -85,10 +103,10 @@ function contrib_boite_infos($flux) {
$prefixe = plugin_lire($id_plugin, 'prefixe');
// -- Inclure le bouton "voir la rubrique" si elle existe
$contexte = array(
$contexte = [
'id_plugin' => $id_plugin,
'prefixe' => $prefixe,
);
];
if ($bouton = recuperer_fond('prive/squelettes/inclure/inc-bouton_voir_rubrique_plugin', $contexte)) {
$flux['data'] .= $bouton;
}
@ -101,10 +119,10 @@ function contrib_boite_infos($flux) {
if ($categorie) {
// -- on ajoute au span une class décrivant la couleur de la catégorie
$cherche = "/(<p[^>]*class=(?:'|\")prefixe[^>]*>\s*)(<span>)/is";
if (preg_match($cherche, $flux['data'], $m)) {
if (preg_match($cherche, $flux['data'])) {
$flux['data'] = preg_replace(
$cherche,
'$1' . "<span class=\"couleur_${categorie}\">",
'$1' . "<span class=\"couleur_{$categorie}\">",
$flux['data'],
1
);
@ -116,8 +134,19 @@ function contrib_boite_infos($flux) {
return $flux;
}
function contrib_pre_edition($flux) {
/**
* Insère des modifications lors de l'édition de mots.
*
* Lors de l'édition d'une inscription :
* - suivant le statut, poste une notification ou cloture l'inscription
*
* @pipeline pre_edition
*
* @param array $flux Données du pipeline
*
* @return array Données du pipeline complétées
**/
function contrib_pre_edition(array $flux) : array {
if (
($flux['args']['table'] === 'spip_inscriptions')
and ($flux['args']['action'] === 'instituer')
@ -129,7 +158,7 @@ function contrib_pre_edition($flux) {
// On récupère les informations sur l'inscription
include_spip('action/editer_objet');
$id = intval($flux['args']['id_objet']);
$id = (int) ($flux['args']['id_objet']);
$inscription = objet_lire('inscription', $id);
if ($inscription) {
// Accepter une demande d'inscription : passage au statut publie
@ -137,9 +166,9 @@ function contrib_pre_edition($flux) {
include_spip('services/discourse');
if ($statut_nouveau === 'publie') {
// -- on crée le compte user demandé via l'API de Gitea, c'est Gitea qui préviendra le user
if (!gitea_user_creer($inscription['username'], $inscription['email'], $inscription['parametres'])) {
if (!gitea_user_creer($inscription['username'], $inscription['email'], unserialize($inscription['parametres']))) {
// -- on fait en sorte que l'institution ne se fasse pas en mettant à vide l'index data
$flux['data'] = array();
$flux['data'] = [];
}
} elseif ($statut_nouveau === 'poubelle') {
discourse_cloturer_inscription($inscription['topic_id']);
@ -159,8 +188,16 @@ function contrib_pre_edition($flux) {
return $flux;
}
function contrib_nospam_lister_formulaires($flux) {
/**
* Insertion dans le pipeline nospam_lister_formulaires (Plugin nospam).
*
* Déclare le formulaire de contribution_inscrire comme utilisant le plugin nospam
*
* @param array $flux Liste des formulaires protégés par NoSpam
*
* @return array Liste mise à jour
*/
function contrib_nospam_lister_formulaires(array $flux) : array {
// Protéger le formulaire d'inscription au développement
$flux[] = 'contribution_inscrire';

@ -14,37 +14,49 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @return array Tableau de la configuration brute du plugin.
*/
function contrib_cache_configurer($plugin) {
function contrib_cache_configurer(string $plugin) :array {
// Initialisation du tableau de configuration avec les valeurs par défaut du plugin Check Factory.
$configuration = array(
'repo' => array(
$configuration = [
'repo' => [
'racine' => '_DIR_TMP',
'sous_dossier' => false,
'nom_prefixe' => 'repo',
'nom_obligatoire' => array('organisation', 'contenu'),
'nom_facultatif' => array(),
'nom_obligatoire' => ['organisation', 'contenu'],
'nom_facultatif' => [],
'extension' => '.json',
'securisation' => false,
'serialisation' => false,
'decodage' => true,
'separateur' => '_',
'conservation' => 3600 * 6
),
'user' => array(
],
'user' => [
'racine' => '_DIR_TMP',
'sous_dossier' => false,
'nom_prefixe' => 'user',
'nom_obligatoire' => array('liste'),
'nom_facultatif' => array(),
'nom_obligatoire' => ['liste'],
'nom_facultatif' => [],
'extension' => '.json',
'securisation' => false,
'serialisation' => false,
'decodage' => true,
'separateur' => '_',
'conservation' => 3600 * 6
),
);
],
'readme' => [
'racine' => '_DIR_TMP',
'sous_dossier' => false,
'nom_prefixe' => 'readme',
'nom_obligatoire' => ['prefixe'],
'nom_facultatif' => [],
'extension' => '.sha',
'securisation' => false,
'serialisation' => false,
'decodage' => false,
'separateur' => '-',
'conservation' => 0
],
];
return $configuration;
}

@ -1,4 +1,5 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -7,14 +8,13 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* Ce contrôle permet d'identifier les rubriques-plugin dont le préfixe est erroné (non référencé par SVP) ou celles
* qui sont mal positionnées dans l'arborescence (la catégorie de la rubrique parent n'est pas celle du plugin).
*
* @param $id_controle
* @param $id_auteur
* @param $options
* @param int $id_controle Identifiant du contrôle relatif à l'exécution de la fonction
* @param int $id_auteur Identifiant de l'auteur ayant lancé le contrôle ou 0 si c'est un CRON
* @param array $options Paramètres nécessaires à l'exécution du contrôle
*
* @return string
* @return string Erreur sous la forme d'une chaine (de type mot) ou vide si aucune erreur.
*/
function contrib_rubrique_plugin($id_controle, $id_auteur, $options) {
function contrib_rubrique_plugin(int $id_controle, int $id_auteur, array $options) : string {
// Initialisation de l'erreur à chaine vide soit 'aucune erreur'.
$erreur = '';
@ -30,20 +30,20 @@ function contrib_rubrique_plugin($id_controle, $id_auteur, $options) {
foreach ($secteurs_plugin as $_id_secteur) {
// -- on récupère les rubriques-plugin en excluant les rubriques-plugin sans préfixe qui peuvent exister
// sans être une erreur.
$filtres = array(
'id_secteur' => intval($_id_secteur),
$filtres = [
'id_secteur' => (int) $_id_secteur,
'prefixe' => '!',
'profondeur' => 2
);
$informations = array('id_rubrique', 'id_parent', 'prefixe');
];
$informations = ['id_rubrique', 'id_parent', 'prefixe'];
$rubriques_plugin = rubrique_repertorier($filtres, $informations);
if ($rubriques_plugin) {
foreach ($rubriques_plugin as $_rubrique) {
if ($_rubrique['prefixe']) {
// Initialisation par défaut d'une anomalie pour le type de contrôle
$anomalie = array(
$anomalie = [
'type_controle' => 'contrib_rubrique_plugin'
);
];
// Pour chaque rubrique-plugin on vérifie que :
// - le préfixe est bien référencé dans SVP
@ -67,11 +67,11 @@ function contrib_rubrique_plugin($id_controle, $id_auteur, $options) {
// On en profite pour stocker dans les paramètres de l'anomalie la rubrique
// auquel elle devrait être rattachée (elle est forcément unique).
$where = array(
$where = [
'categorie=' . sql_quote($categorie_plugin)
);
];
if ($id_rubrique = sql_getfetsel('id_rubrique', 'spip_rubriques', $where)) {
$anomalie['parametres'] = array('id_parent' => $id_rubrique);
$anomalie['parametres'] = ['id_parent' => $id_rubrique];
}
}
}
@ -96,8 +96,15 @@ function contrib_rubrique_plugin($id_controle, $id_auteur, $options) {
return $erreur;
}
function contrib_rubrique_plugin_rubplug_loc($id_observation, $id_auteur) {
/**
* Corrige la localisation d'une rubrique plugin (anomalie rubplug_loc).
*
* @param int $id_observation Identifiant de l'observation (anomalie) à corriger
* @param int $id_auteur Identifiant de l'auteur ayant lancé la correction automatique
*
* @return string Erreur sous la forme d'une chaine (de type mot) ou vide si aucune erreur.
*/
function contrib_rubrique_plugin_rubplug_loc(int $id_observation, int $id_auteur) : string {
// Initialisation de l'erreur à chaine vide soit 'aucune erreur'.
$erreur = '';
@ -110,10 +117,10 @@ function contrib_rubrique_plugin_rubplug_loc($id_observation, $id_auteur) {
// - on fait la modification automatiquement.
$parametres = unserialize($observation['parametres']);
if (!empty($parametres['id_parent'])) {
$maj_rubrique = array(
$maj_rubrique = [
'id_parent' => $parametres['id_parent']
);
objet_modifier('rubrique', intval($observation['id_objet']), $maj_rubrique);
];
objet_modifier('rubrique', (int) ($observation['id_objet']), $maj_rubrique);
} else {
$erreur = 'corr_nok';
}
@ -125,14 +132,13 @@ function contrib_rubrique_plugin_rubplug_loc($id_observation, $id_auteur) {
* Ce contrôle permet d'identifier les catégories racine ou feuille qui ne possèdent pas de rubrique
* correspondante dans le site.
*
* @param $id_controle
* @param $id_auteur
* @param $options
* @param int $id_controle Identifiant du contrôle relatif à l'exécution de la fonction
* @param int $id_auteur Identifiant de l'auteur ayant lancé le contrôle ou 0 si c'est un CRON
* @param array $options Paramètres nécessaires à l'exécution du contrôle
*
* @return string
* @return string Erreur sous la forme d'une chaine (de type mot) ou vide si aucune erreur.
*/
function contrib_rubrique_categorie($id_controle, $id_auteur, $options) {
function contrib_rubrique_categorie(int $id_controle, int $id_auteur, array $options) : string {
// Initialisation de l'erreur à chaine vide soit 'aucune erreur'.
$erreur = '';
@ -142,8 +148,8 @@ function contrib_rubrique_categorie($id_controle, $id_auteur, $options) {
include_spip('inc/svptype_type_plugin');
$categories = type_plugin_repertorier(
$typologie,
array(),
array('identifiant', 'profondeur', 'id_mot')
[],
['identifiant', 'profondeur', 'id_mot']
);
// On boucle sur chacune des catégories en recherchant dans les rubriques si il en existe une dont le champ
@ -152,15 +158,15 @@ function contrib_rubrique_categorie($id_controle, $id_auteur, $options) {
include_spip('inc/ezcheck_observation');
foreach ($categories as $_categorie) {
// Initialisation par défaut d'une anomalie pour le type de contrôle
$anomalie = array(
$anomalie = [
'type_controle' => 'contrib_rubrique_categorie'
);
];
// On cherche si il existe une ou plusieurs rubriques associées à la catégorie. Le retour est toujours un
// tableau.
$rubriques = rubrique_repertorier(
array('categorie' => $_categorie['identifiant']),
array('id_rubrique')
['categorie' => $_categorie['identifiant']],
['id_rubrique']
);
$rubriques = array_column($rubriques, 'id_rubrique');
@ -188,7 +194,7 @@ function contrib_rubrique_categorie($id_controle, $id_auteur, $options) {
$_categorie['id_mot']
);
if ($rubriques) {
$anomalie['parametres'] = array('rubriques' => implode(', ', $rubriques));
$anomalie['parametres'] = ['rubriques' => implode(', ', $rubriques)];
}
observation_ajouter(true, $id_controle, $anomalie);
}
@ -197,8 +203,16 @@ function contrib_rubrique_categorie($id_controle, $id_auteur, $options) {
return $erreur;
}
function contrib_rubrique_plugin_synchro($id_controle, $id_auteur, $options) {
/**
* Ce contrôle permet de lancer la synchronisation des titres et descriptions des rubriques-plugin.
*
* @param int $id_controle Identifiant du contrôle relatif à l'exécution de la fonction
* @param int $id_auteur Identifiant de l'auteur ayant lancé le contrôle ou 0 si c'est un CRON
* @param array $options Paramètres nécessaires à l'exécution du contrôle
*
* @return string Erreur sous la forme d'une chaine (de type mot) ou vide si aucune erreur.
*/
function contrib_rubrique_plugin_synchro(int $id_controle, int $id_auteur, array $options) : string {
// Initialisation de l'erreur à chaine vide soit 'aucune erreur'.
$erreur = '';
@ -209,8 +223,16 @@ function contrib_rubrique_plugin_synchro($id_controle, $id_auteur, $options) {
return $erreur;
}
function contrib_rubrique_categorie_synchro($id_controle, $id_auteur, $options) {
/**
* Ce contrôle permet de lancer la synchronisation des titres et descriptions des rubriques-catégorie.
*
* @param int $id_controle Identifiant du contrôle relatif à l'exécution de la fonction
* @param int $id_auteur Identifiant de l'auteur ayant lancé le contrôle ou 0 si c'est un CRON
* @param array $options Paramètres nécessaires à l'exécution du contrôle
*
* @return string Erreur sous la forme d'une chaine (de type mot) ou vide si aucune erreur.
*/
function contrib_rubrique_categorie_synchro(int $id_controle, int $id_auteur, array $options) : string {
// Initialisation de l'erreur à chaine vide soit 'aucune erreur'.
$erreur = '';
@ -225,22 +247,21 @@ function contrib_rubrique_categorie_synchro($id_controle, $id_auteur, $options)
* Ce contrôle permet d'identifier les affectations plugin-catégorie pour lesquelles le préfixe de plugin
* est erroné (c'est le cas si celui-ci a été changé ou si le plugin a été retiré du référentiel).
*
* @param $id_controle
* @param $id_auteur
* @param $options
* @param int $id_controle Identifiant du contrôle relatif à l'exécution de la fonction
* @param int $id_auteur Identifiant de l'auteur ayant lancé le contrôle ou 0 si c'est un CRON
* @param array $options Paramètres nécessaires à l'exécution du contrôle
*
* @return string
*/
function contrib_plugin_affectation($id_controle, $id_auteur, $options) {
* @return string Erreur sous la forme d'une chaine (de type mot) ou vide si aucune erreur.
*/
function contrib_plugin_affectation(int $id_controle, int $id_auteur, array $options) : string {
// Initialisation de l'erreur à chaine vide soit 'aucune erreur'.
$erreur = '';
// Récupération des plugins du référentiel 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');
@ -256,12 +277,12 @@ function contrib_plugin_affectation($id_controle, $id_auteur, $options) {
// On ajoute une anomalie pour chaque affectation erronée
foreach ($affectations_erronees as $_prefixe => $_affectation) {
// Initialisation de l'anomalie plugaff_pfx.
$anomalie = array(
$anomalie = [
'type_controle' => 'contrib_plugin_affectation',
'code' => 'plugpfx_nok',
'parametres' => $_affectation,
'objet' => "${_prefixe}-{$_affectation['identifiant_mot']}"
);
'objet' => "{$_prefixe}-{$_affectation['identifiant_mot']}"
];
// Création de l'anomalie
observation_ajouter(true, $id_controle, $anomalie);
@ -272,8 +293,15 @@ function contrib_plugin_affectation($id_controle, $id_auteur, $options) {
return $erreur;
}
function contrib_plugin_affectation_plugpfx_nok($id_observation, $id_auteur) {
/**
* Corrige une affectation de catégorie à un plugin dont le préfixe est erronné en la supprimant.
*
* @param int $id_observation Identifiant de l'observation (anomalie) à corriger
* @param int $id_auteur Identifiant de l'auteur ayant lancé la correction automatique
*
* @return string Erreur sous la forme d'une chaine (de type mot) ou vide si aucune erreur.
*/
function contrib_plugin_affectation_plugpfx_nok(int $id_observation, int $id_auteur) : string {
// Initialisation de l'erreur à chaine vide soit 'aucune erreur'.
$erreur = '';
@ -289,11 +317,11 @@ function contrib_plugin_affectation_plugpfx_nok($id_observation, $id_auteur) {
and !empty($parametres['id_mot'])
and !empty($parametres['prefixe'])
) {
$where = array(
'id_groupe=' . intval($parametres['id_groupe']),
'id_mot=' . intval($parametres['id_mot']),
$where = [
'id_groupe=' . (int) ($parametres['id_groupe']),
'id_mot=' . (int) ($parametres['id_mot']),
'prefixe=' . sql_quote($parametres['prefixe'])
);
];
sql_delete('spip_plugins_typologies', $where);
} else {
$erreur = 'corr_nok';

@ -1,4 +1,5 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}

@ -1,17 +1,20 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* @param int $id_controle
* @param int $id_auteur
* @param array $options
* Ce contrôle permet de créer les listings des repos pour chaque organisation de la forge.
* Les listings sont des fichiers JSON.
*
* @param int $id_controle Identifiant du contrôle relatif à l'exécution de la fonction
* @param int $id_auteur Identifiant de l'auteur ayant lancé le contrôle ou 0 si c'