Browse Source

Passage de php-cs-fixer et amélioration de certaines écritures et PHPDoc.

Ajout de l'autorisation d'institution d'une observation.
Typer les arguments des actions.
master
Eric Lupinacci 2 months ago
parent
commit
da126ab50c
  1. 21
      action/cloturer_observation.php
  2. 13
      action/executer_type_controle.php
  3. 30
      action/inverser_activite_type_controle.php
  4. 6
      action/recharger_dashboards.php
  5. 9
      action/recharger_types_controle.php
  6. 23
      action/supprimer_observations.php
  7. 143
      base/ezcheck_declarations.php
  8. 13
      ezcache/ezcheck.php
  9. 34
      ezcheck_administrations.php
  10. 46
      ezcheck_autorisations.php
  11. 39
      ezcheck_fonctions.php
  12. 10
      ezcheck_pipelines.php
  13. 45
      formulaires/parametrer_controle.php
  14. 74
      inc/ezcheck_dashboard.php
  15. 40
      inc/ezcheck_observation.php
  16. 143
      inc/ezcheck_type_controle.php
  17. 10
      lang/controle_fr.php
  18. 13
      lang/ezcheck_fr.php
  19. 26
      lang/observation_fr.php
  20. 9
      lang/paquet-ezcheck_fr.php
  21. 2
      paquet.xml

21
action/cloturer_observation.php

@ -1,40 +1,39 @@
<?php
/**
* Ce fichier contient l'action `cloturer_observation` lancée par un utilisateur autorisé pour
* corriger automatiquement ou acquitter une anomalie qui passe alors au statut fermé.
* corriger, acquitter ou supprimer une observation.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Cette action permet à l'utilisateur de corriger ou d'acquitter, de façon sécurisée,
* une anomalie ou de supprimer toute observation déjà fermée.
* Cette action permet à l'utilisateur de corriger ou d'acquitter de façon sécurisée
* une anomalie ou, de supprimer toute observation déjà fermée.
*
* Cette action est réservée aux utilisateurs pouvant instituer une observation.
* Elle nécessite l'action proprement dite, à savoir, acquitter, corriger ou supprimer, l'id de l'observation et
* celui de l'auteur.
*
* @param string $arguments Arguments de l'action ou null si l'action est appelée par une URL
* @param null|string $arguments Arguments de l'action ou null si l'action est appelée par une URL
*
* @return void
*/
function action_cloturer_observation_dist($arguments = null) {
function action_cloturer_observation_dist(?string $arguments = null): void {
// Sécurisation.
// Arguments attendus :
// - le nom de l'action corriger ou acquitter
// - l'identifiant de l'observation
// - et l'id de l'auteur
// 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();
}
list($action, $id_observation, $id_auteur) = explode(':', $arguments);
[$action, $id_observation, $id_auteur] = explode(':', $arguments);
// Verification des autorisations :
if (!autoriser('instituer', 'observation', $id_observation, $id_auteur, array('action' => $action))) {
// Verification des autorisations
if (!autoriser('instituer', 'observation', $id_observation, $id_auteur, ['action' => $action])) {
include_spip('inc/minipres');
echo minipres();
exit();
@ -42,5 +41,5 @@ function action_cloturer_observation_dist($arguments = null) {
// On lance la fonction d'acquittement ou de correction.
include_spip('inc/ezcheck_observation');
observation_cloturer($action, intval($id_observation), intval($id_auteur));
observation_cloturer($action, (int) $id_observation, (int) $id_auteur);
}

13
action/executer_type_controle.php

@ -16,25 +16,24 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* Quand elle est appelée via un formulaire de choix de paramètres additionnels à fournir à la fonction de contrôle
* elle possède un argument options supplémentaires.
*
* @param string $arguments Arguments de l'action ou null si l'action est appelée par une URL
* @param null|string $arguments Arguments de l'action ou null si l'action est appelée par une URL
*
* @return void
*/
function action_executer_type_controle_dist($arguments = null) {
function action_executer_type_controle_dist(?string $arguments = null): void {
// Sécurisation.
// Arguments attendus :
// - l'identifiant du type de contrôle
// - l'auteur ou 0 si l'exécution est du au génie
// - les options fournies par le formulaire de saisie ou vide sinon.
// 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();
}
list($type_controle, $id_auteur, $options) = explode(':', $arguments);
[$type_controle, $id_auteur, $options] = explode(':', $arguments);
// Verification des autorisations :
// Verification des autorisations
if (!autoriser('executer', 'typecontrole', $type_controle)) {
include_spip('inc/minipres');
echo minipres();
@ -43,5 +42,5 @@ function action_executer_type_controle_dist($arguments = null) {
// On lance la fonction gérant l'exécution du contrôle
include_spip('inc/ezcheck_type_controle');
type_controle_executer($type_controle, intval($id_auteur), $options);
type_controle_executer($type_controle, (int) $id_auteur, $options);
}

30
action/inverser_activite_type_controle.php

@ -1,31 +1,35 @@
<?php
/**
* Ce fichier contient l'action `recharger_controles` lancée par un utilisateur pour
* recharger le fichier de configuration de chaque contrôle de façon sécurisée.
* Ce fichier contient l'action `inverser_activite_type_controle` lancée par un utilisateur pour
* activer ou désactiver un type de contrôle de façon sécurisée.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Cette action permet à l'utilisateur de recharger en base de données, de façon sécurisée,
* les types de noisette à partir de leur fichier JSON.
* Cette action permet à l'utilisateur d'activer ou de désactiver, de façon sécurisée,
* un type de contrôle donné.
*
* Cette action est réservée aux utilisateurs pouvant modifier un type de contrôle.
* Elle nécessite l'identifiant du type de contrôle et son indicateur d'activité.
*
* Cette action est réservée aux utilisateurs pouvant utiliser le noiZetier.
* Elle ne nécessite aucun argument.
* @param null|string $arguments Arguments de l'action ou null si l'action est appelée par une URL
*
* @return void
*/
function action_inverser_activite_type_controle_dist() {
function action_inverser_activite_type_controle_dist(?string $arguments = null): void {
// Sécurisation.
// Arguments attendus :
// - l'identifiant du type de contrôle
// - l'état d'activité courant
$securiser_action = charger_fonction('securiser_action', 'inc');
$arguments = $securiser_action();
if (null === $arguments) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arguments = $securiser_action();
}
// Récupération des arguments
list($type_controle, $est_actif) = explode(':', $arguments);
[$type_controle, $est_actif] = explode(':', $arguments);
// Verification des autorisations :
if (!autoriser('modifier', 'typecontrole', $type_controle)) {
@ -39,9 +43,9 @@ function action_inverser_activite_type_controle_dist() {
$type_controle
and $est_actif
) {
$set = array(
$set = [
'actif' => $est_actif === 'oui' ? 'non' : 'oui'
);
];
sql_updateq('spip_types_controles', $set, 'identifiant=' . sql_quote($type_controle));
}
}

6
action/recharger_dashboards.php

@ -16,11 +16,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @return void
*/
function action_recharger_dashboards_dist() {
// Sécurisation.
// -- Aucun argument attendu.
function action_recharger_dashboards_dist(): void {
// Verification des autorisations : pour recharger les types de contrôle il suffit
// d'avoir l'autorisation minimale d'accéder au contrôles de contrib.
if (!autoriser('ezcheck')) {

9
action/recharger_types_controle.php

@ -1,11 +1,12 @@
<?php
/**
* Ce fichier contient l'action `recharger_controles` lancée par un utilisateur pour
* Ce fichier contient l'action `recharger_types_controle` lancée par un utilisateur pour
* recharger le fichier de configuration de chaque contrôle de façon sécurisée.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Cette action permet à l'utilisateur de recharger en base de données, de façon sécurisée,
* les types de contrôle à partir de leur fichier YAML.
@ -15,11 +16,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @return void
*/
function action_recharger_types_controle_dist() {
// Sécurisation.
// -- Aucun argument attendu.
function action_recharger_types_controle_dist(): void {
// Verification des autorisations : pour recharger les types de contrôle il suffit
// d'avoir l'autorisation minimale de Check Factory.
if (!autoriser('ezcheck')) {

23
action/supprimer_observations.php

@ -11,29 +11,28 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* Cette action permet à l'utilisateur de passer à l'état poubelle, de façon sécurisée,
* toutes les observations ou les anomalies fermées.
*
* Cette action est réservée aux utilisateurs pouvant instituer une observation.
* Elle nécessite l'identifiant du type de contrôle et l'indicateur d'anomalie (oui/non).
* Cette action est réservée aux utilisateurs pouvant vider les observations d'un type de contrôle.
* Elle nécessite l'identifiant du type de contrôle, l'indicateur d'anomalie (oui/non) et l'id de l'auteur.
*
* @param string $arguments Arguments de l'action ou null si l'action est appelée par une URL
* @param null|string $arguments Arguments de l'action ou null si l'action est appelée par une URL
*
* @return void
*/
function action_supprimer_observations_dist($arguments = null) {
function action_supprimer_observations_dist(?string $arguments = null): void {
// Sécurisation.
// Arguments attendus :
// - l'identifiant du type de contrôle
// - l'indicateur d'anomalie
// - et l'id de l'auteur
// 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();
}
list($type_controle, $est_anomalie, $id_auteur) = explode(':', $arguments);
[$type_controle, $est_anomalie, $id_auteur] = explode(':', $arguments);
// Verification des autorisations :
if (!autoriser('supprimer', 'observations')) {
if (!autoriser('vider', 'typecontrole', $type_controle)) {
include_spip('inc/minipres');
echo minipres();
exit();
@ -42,15 +41,17 @@ function action_supprimer_observations_dist($arguments = null) {
// On recherche toutes les observations ou anomalies déjà corrigées ou acquittées et associées
// au type de contrôle.
include_spip('inc/ezcheck_observation');
$filtres = array(
$filtres = [
'type_controle' => $type_controle,
'est_anomalie' => $est_anomalie,
'statut' => 'fermee'
);
];
$ids = observation_repertorier($filtres, 'id_observation');
// On boucle sur chaque observation et on la met à la poubelle.
foreach ($ids as $_id_observation) {
observation_cloturer('supprimer', $_id_observation, intval($id_auteur));
if (autoriser('instituer', 'observation', (int) $_id_observation, (int) $id_auteur, ['action' => 'supprimer'])) {
observation_cloturer('supprimer', $_id_observation, (int) $id_auteur);
}
}
}

143
base/ezcheck_declarations.php

@ -1,5 +1,7 @@
<?php
/**
* Ce fichier contient les fonctions déclaration des tables nécessaires au plugin.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -17,35 +19,34 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @return array Tableau fourni en entrée et mis à jour avec les nouvelles déclarations
*/
function ezcheck_declarer_tables_principales($tables_principales) {
// Table spip_types_noisettes
$types_controles = array(
'identifiant' => "varchar(255) DEFAULT '' NOT NULL", // Identifiant du type de contrôle
'nom' => "text DEFAULT '' NOT NULL", // Nom littéral du contrôle
'description' => "text DEFAULT '' NOT NULL", // Description du contrôle
'icone' => "varchar(255) DEFAULT '' NOT NULL", // Fichier image sans chemin représentatif du type de contrôle
'necessite' => "text DEFAULT '' NOT NULL", // Liste des préfixes des plugins nécessités par le type de contrôle
'est_etat' => "varchar(3) DEFAULT 'non' NOT NULL", // Indique si le contrôle est un état (uniquement un squelette pas de fonction PHP)
'include' => "varchar(255) DEFAULT '' NOT NULL", // Chemin relatif du fichier contenant la fonction de contrôle
'fonction' => "varchar(255) DEFAULT '' NOT NULL", // Nom de la fonction d'exécution (défaut = identifiant du type de contrôle)
'parametres' => "text DEFAULT '' NOT NULL", // Paramètres à fournir en entrée de la fonction et/ou du squelette sous forme de saisies
'anomalies' => "text DEFAULT '' NOT NULL", // Liste des identifiants d'anomalies rangée suivant les actions acquitter ou corriger et chemin de l'include des fonctions de correction
'squelette' => "varchar(255) DEFAULT '' NOT NULL", // Chemin relatif du squelette HTML permettant un affichage complémentaire spécifique au contrôle
'contexte' => "text DEFAULT '' NOT NULL", // Tableau de contexte spécifique au squelette
'actif' => "varchar(3) DEFAULT 'oui' NOT NULL", // Indicateur d'activité du contrôle. Si 'non', aucun contrôle de ce type ne peut être réalisé. Permet aussi de remonter des erreurs (nok, nof)
'signature' => "varchar(32) DEFAULT '' NOT NULL", // MD5 du fichier de configuration du contrôle
'maj' => 'timestamp DEFAULT current_timestamp ON UPDATE current_timestamp',
);
$types_controles_cles = array(
$types_controles = [
'identifiant' => "varchar(255) DEFAULT '' NOT NULL", // Identifiant du type de contrôle
'nom' => "text DEFAULT '' NOT NULL", // Nom littéral du contrôle
'description' => "text DEFAULT '' NOT NULL", // Description du contrôle
'icone' => "varchar(255) DEFAULT '' NOT NULL", // Fichier image sans chemin représentatif du type de contrôle
'necessite' => "text DEFAULT '' NOT NULL", // Liste des préfixes des plugins nécessités par le type de contrôle
'est_etat' => "varchar(3) DEFAULT 'non' NOT NULL", // Indique si le contrôle est un état (uniquement un squelette pas de fonction PHP)
'include' => "varchar(255) DEFAULT '' NOT NULL", // Chemin relatif du fichier contenant la fonction de contrôle
'fonction' => "varchar(255) DEFAULT '' NOT NULL", // Nom de la fonction d'exécution (défaut = identifiant du type de contrôle)
'parametres' => "text DEFAULT '' NOT NULL", // Paramètres à fournir en entrée de la fonction et/ou du squelette sous forme de saisies
'anomalies' => "text DEFAULT '' NOT NULL", // Liste des identifiants d'anomalies rangée suivant les actions acquitter ou corriger et chemin de l'include des fonctions de correction
'squelette' => "varchar(255) DEFAULT '' NOT NULL", // Chemin relatif du squelette HTML permettant un affichage complémentaire spécifique au contrôle
'contexte' => "text DEFAULT '' NOT NULL", // Tableau de contexte spécifique au squelette
'actif' => "varchar(3) DEFAULT 'oui' NOT NULL", // Indicateur d'activité du contrôle. Si 'non', aucun contrôle de ce type ne peut être réalisé. Permet aussi de remonter des erreurs (nok, nof)
'signature' => "varchar(32) DEFAULT '' NOT NULL", // MD5 du fichier de configuration du contrôle
'maj' => 'timestamp DEFAULT current_timestamp ON UPDATE current_timestamp',
];
$types_controles_cles = [
'PRIMARY KEY' => 'identifiant',
'KEY actif' => 'actif',
);
];
$tables_principales['spip_types_controles'] = array(
$tables_principales['spip_types_controles'] = [
'field' => &$types_controles,
'key' => &$types_controles_cles,
);
];
return $tables_principales;
}
@ -64,12 +65,11 @@ function ezcheck_declarer_tables_principales($tables_principales) {
* @return array Description des tables de la base complétée par celles du plugin.
*/
function ezcheck_declarer_tables_objets_sql($tables_objet_sql) {
// Table spip_controles, description des contrôles manuels ou périodiques, instances d'un type de contrôle.
$tables_objet_sql['spip_controles'] = array(
$tables_objet_sql['spip_controles'] = [
'type' => 'controle',
'principale' => 'oui',
'field' => array(
'field' => [
'id_controle' => 'bigint(21) NOT NULL',
'type_controle' => "varchar(255) DEFAULT '' NOT NULL", // Type de contrôle réalisé
'parametres' => "text DEFAULT '' NOT NULL", // Paramètres valorisés d'exécution du contrôle (saisies)
@ -78,21 +78,21 @@ function ezcheck_declarer_tables_objets_sql($tables_objet_sql) {
'id_auteur' => 'bigint(21) NOT NULL', // Si activation 'user' id de l'admin sinon 0
'nb_anomalies' => 'smallint DEFAULT 0 NOT NULL', // Nombre d'anomalies ouvertes
'maj' => 'timestamp DEFAULT current_timestamp ON UPDATE current_timestamp',
),
'key' => array(
],
'key' => [
'PRIMARY KEY' => 'id_controle',
'KEY type_controle' => 'type_controle',
),
],
'titre' => '',
// Edition, affichage et recherche
'page' => '',
'url_voir' => '',
'editable' => 'non',
'champs_editables' => array(),
'champs_versionnes' => array(),
'rechercher_champs' => array(),
'tables_jointures' => array(),
'champs_editables' => [],
'champs_versionnes' => [],
'rechercher_champs' => [],
'tables_jointures' => [],
// Textes standard
'texte_retour' => '',
@ -106,75 +106,75 @@ function ezcheck_declarer_tables_objets_sql($tables_objet_sql) {
'info_1_objet' => 'controle:info_1_controle',
'info_nb_objets' => 'controle:info_nb_controle',
'texte_logo_objet' => '',
);
];
// Table spip_observations, les résultats des contrôles (anomalies ou logs)
$tables_objet_sql['spip_observations'] = array(
$tables_objet_sql['spip_observations'] = [
'type' => 'observation',
'principale' => 'oui',
// Déclaration des champs
'field' => array(
'id_observation' => 'bigint(21) NOT NULL',
'id_controle' => 'bigint(21) NOT NULL', // Id du contrôle ayant détecté l'anomalie
'type_controle' => "varchar(255) DEFAULT '' NOT NULL", // Type de contrôle pour simplifier les boucles
'objet' => "varchar(255) NOT NULL default ''", // Type d'objet spip ou nom qui sera affiché pour l'objet qui n'est pas forcément un objet spip
'id_objet' => 'bigint(21) NOT NULL default 0', // Id de l'objet sur lequel porte l'anomalie si c'est un objet spip : permet de calculer l'url
'url_objet' => "varchar(255) DEFAULT '' NOT NULL", // Url de l'objet de l'anomalie dans le cas où ce n'est pas un objet spip
'est_anomalie' => "varchar(3) DEFAULT 'oui' NOT NULL", // Indicateur d'anomalie 'oui' ou 'non'
'gravite' => "varchar(1) DEFAULT 'e' NOT NULL", // Gravité de l'anomalie : 'e' pour erreur, 'a' pour avertissement et 'i' pour info
'code' => "varchar(127) DEFAULT '' NOT NULL", // Identifiant relatif d'une observation
'statut' => "varchar(10) DEFAULT 'publie' NOT NULL", // Statut de l'anomalie : 'ouverte', 'fermee', 'poubelle'
'parametres' => "text DEFAULT '' NOT NULL", // Paramètres permettant d'expliquer l'observation
'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // Date correspondant au statut courant
'maj' => 'timestamp DEFAULT current_timestamp ON UPDATE current_timestamp',
),
'key' => array(
'field' => [
'id_observation' => 'bigint(21) NOT NULL',
'id_controle' => 'bigint(21) NOT NULL', // Id du contrôle ayant détecté l'anomalie
'type_controle' => "varchar(255) DEFAULT '' NOT NULL", // Type de contrôle pour simplifier les boucles
'objet' => "varchar(255) NOT NULL default ''", // Type d'objet spip ou nom qui sera affiché pour l'objet qui n'est pas forcément un objet spip
'id_objet' => 'bigint(21) NOT NULL default 0', // Id de l'objet sur lequel porte l'anomalie si c'est un objet spip : permet de calculer l'url
'url_objet' => "varchar(255) DEFAULT '' NOT NULL", // Url de l'objet de l'anomalie dans le cas où ce n'est pas un objet spip
'est_anomalie' => "varchar(3) DEFAULT 'oui' NOT NULL", // Indicateur d'anomalie 'oui' ou 'non'
'gravite' => "varchar(1) DEFAULT 'e' NOT NULL", // Gravité de l'anomalie : 'e' pour erreur, 'a' pour avertissement et 'i' pour info
'code' => "varchar(127) DEFAULT '' NOT NULL", // Identifiant relatif d'une observation
'statut' => "varchar(10) DEFAULT 'publie' NOT NULL", // Statut de l'anomalie : 'ouverte', 'fermee', 'poubelle'
'parametres' => "text DEFAULT '' NOT NULL", // Paramètres permettant d'expliquer l'observation
'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // Date correspondant au statut courant
'maj' => 'timestamp DEFAULT current_timestamp ON UPDATE current_timestamp',
],
'key' => [
'PRIMARY KEY' => 'id_observation',
'KEY id_controle' => 'id_controle',
'KEY objet' => 'objet',
'KEY id_objet' => 'id_objet',
'KEY est_anomalie' => 'est_anomalie',
'KEY code' => 'code',
),
'join' => array(
],
'join' => [
'id_observation' => 'id_observation',
'id_controle' => 'id_controle',
),
],
'titre' => '',
// Edition, affichage et recherche
'page' => '',
'url_voir' => '',
'editable' => 'non',
'champs_editables' => array(),
'champs_versionnes' => array(),
'rechercher_champs' => array(),
'tables_jointures' => array(),
'champs_editables' => [],
'champs_versionnes' => [],
'rechercher_champs' => [],
'tables_jointures' => [],
// Statuts
'statut' => array(
array(
'statut' => [
[
'champ' => 'statut',
'publie' => 'ouverte',
'previsu' => '',
'exception' => array('statut', 'tout')
)
),
'statut_titres' => array(
'exception' => ['statut', 'tout']
]
],
'statut_titres' => [
'ouverte' => 'observation:titre_observation_ouverte',
'fermee' => 'observation:titre_observation_fermee',
'poubelle' => 'observation:titre_observation_poubelle'
),
'statut_images' => array(
],
'statut_images' => [
'ouverte' => 'puce-proposer-8.png',
'fermee' => 'puce-publier-8.png',
'poubelle' => 'puce-supprimer-8.png',
),
'statut_textes_instituer' => array(
],
'statut_textes_instituer' => [
'ouverte' => 'observation:texte_observation_ouverte',
'fermee' => 'observation:texte_observation_fermee',
'poubelle' => 'observation:texte_observation_poubelle',
),
],
'texte_changer_statut' => '',
// Textes standard
@ -189,7 +189,7 @@ function ezcheck_declarer_tables_objets_sql($tables_objet_sql) {
'info_1_objet' => 'observation:info_1_observation',
'info_nb_objets' => 'observation:info_nb_observation',
'texte_logo_objet' => '',
);
];
return $tables_objet_sql;
}
@ -207,7 +207,6 @@ function ezcheck_declarer_tables_objets_sql($tables_objet_sql) {
* @return array Tableau fourni en entrée et mis à jour avec les nouvelles informations
*/
function ezcheck_declarer_tables_interfaces($interface) {
// Les tables : permet d'appeler une boucle avec le *type* de la table uniquement
$interface['table_des_tables']['types_controles'] = 'types_controles';
$interface['table_des_tables']['controles'] = 'controles';

13
ezcache/ezcheck.php vendored

@ -15,22 +15,21 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @return array Tableau de la configuration brute du plugin Check Factory.
*/
function ezcheck_cache_configurer($plugin) {
// Initialisation du tableau de configuration avec les valeurs par défaut du plugin Check Factory.
$configuration = array(
'dashboard' => array(
$configuration = [
'dashboard' => [
'racine' => '_DIR_TMP',
'sous_dossier' => false,
'nom_obligatoire' => array('nom'),
'nom_facultatif' => array(),
'nom_obligatoire' => ['nom'],
'nom_facultatif' => [],
'extension' => '.php',
'securisation' => true,
'serialisation' => true,
'decodage' => false,
'separateur' => '-',
'conservation' => 0
)
);
]
];
return $configuration;
}

34
ezcheck_administrations.php

@ -6,6 +6,7 @@
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Installation du schéma de données propre au plugin et gestion des migrations suivant
* les évolutions du schéma.
@ -20,27 +21,27 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @return void
*/
function ezcheck_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
$maj = [];
// Création des tables
$maj['create'] = array(
array('maj_tables', array('spip_types_controles', 'spip_controles', 'spip_observations')),
);
$maj['create'] = [
['maj_tables', ['spip_types_controles', 'spip_controles', 'spip_observations']],
];
$maj['2'] = array(
array('sql_alter', "TABLE spip_types_controles ADD fonction varchar(255) DEFAULT '' NOT NULL AFTER include"),
array('sql_alter', "TABLE spip_types_controles ADD squelette varchar(255) DEFAULT '' NOT NULL BEFORE actif"),
array('sql_alter', "TABLE spip_types_controles ADD contexte text DEFAULT '' NOT NULL BEFORE actif"),
array('sql_alter', "TABLE spip_types_controles CHANGE actions anomalies text DEFAULT '' NOT NULL"),
);
$maj['2'] = [
['sql_alter', "TABLE spip_types_controles ADD fonction varchar(255) DEFAULT '' NOT NULL AFTER include"],
['sql_alter', "TABLE spip_types_controles ADD squelette varchar(255) DEFAULT '' NOT NULL BEFORE actif"],
['sql_alter', "TABLE spip_types_controles ADD contexte text DEFAULT '' NOT NULL BEFORE actif"],
['sql_alter', "TABLE spip_types_controles CHANGE actions anomalies text DEFAULT '' NOT NULL"],
];
$maj['3'] = array(
array('sql_alter', "TABLE spip_types_controles ADD necessite text DEFAULT '' NOT NULL AFTER icone"),
);
$maj['3'] = [
['sql_alter', "TABLE spip_types_controles ADD necessite text DEFAULT '' NOT NULL AFTER icone"],
];
$maj['4'] = array(
array('sql_alter', "TABLE spip_controles ADD maj timestamp DEFAULT current_timestamp ON UPDATE current_timestamp"),
);
$maj['4'] = [
['sql_alter', 'TABLE spip_controles ADD maj timestamp DEFAULT current_timestamp ON UPDATE current_timestamp'],
];
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
@ -57,7 +58,6 @@ function ezcheck_upgrade($nom_meta_base_version, $version_cible) {
* @return void
*/
function ezcheck_vider_tables($nom_meta_base_version) {
// On efface les tables des contrôles et anomalies
sql_drop_table('spip_types_controles');
sql_drop_table('spip_controles');

46
ezcheck_autorisations.php

@ -1,5 +1,7 @@
<?php
// Sécurité
/**
* Ce fichier contient les fonctions d'autorisations du plugin.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -90,7 +92,6 @@ function autoriser_ezcheck_configurer_dist($faire, $type, $id, $qui, $options) {
* @return bool `true`si l'auteur est autorisée à exécuter l'action, `false` sinon.
*/
function autoriser_dashboard_voir_dist($faire, $type, $id, $qui, $options) {
// Initialisation de l'autorisation à non autorisé par défaut.
$autoriser = false;
@ -129,7 +130,6 @@ function autoriser_dashboard_voir_dist($faire, $type, $id, $qui, $options) {
* @return bool `true`si l'auteur est autorisée à exécuter l'action, `false` sinon.
*/
function autoriser_typecontrole_modifier_dist($faire, $type, $id, $qui, $options) {
// Initialisation de l'autorisation à non autorisé par défaut.
$autoriser = false;
@ -167,7 +167,6 @@ function autoriser_typecontrole_modifier_dist($faire, $type, $id, $qui, $options
* @return bool `true`si l'auteur est autorisée à exécuter l'action, `false` sinon.
*/
function autoriser_typecontrole_executer_dist($faire, $type, $id, $qui, $options) {
// Initialisation de l'autorisation à non autorisé par défaut.
$autoriser = false;
@ -192,8 +191,7 @@ function autoriser_typecontrole_executer_dist($faire, $type, $id, $qui, $options
/**
* Autorisation de mise à poubelle des observations fermées d'un type de contrôle.
* Il faut :
* - être autorisé à modifier le type de contrôle
* - et que la fonction de contrôle existe.
* - être autorisé à exécuter le type de contrôle.
*
* @param string $faire L'action : `vider`
* @param string $type Le type d'objet ou nom de table : `typecontrole` (ce n'est pas un objet au sens SPIP)
@ -208,11 +206,45 @@ function autoriser_typecontrole_executer_dist($faire, $type, $id, $qui, $options
* @return bool `true`si l'auteur est autorisée à exécuter l'action, `false` sinon.
*/
function autoriser_typecontrole_vider_dist($faire, $type, $id, $qui, $options) {
// Initialisation de l'autorisation à non autorisé par défaut.
$autoriser = false;
if (autoriser('executer', 'typecontrole', $id)) {
$autoriser = true;
}
return $autoriser;
}
/**
* Autorisation de changement de statut d'une observation.
* Il faut :
* - être autorisé à utiliser Check Factory,
* - que l'observation existe,
* - que l'action soit fournie et corresponde à `corriger`, `acquitter` ou `supprimer`.
*
* @param string $faire L'action : `vider`
* @param string $type Le type d'objet ou nom de table : `typecontrole` (ce n'est pas un objet au sens SPIP)
* @param int|string $id Id de l'objet sur lequel on veut agir : identifiant du type de contrôle sous forme d'une chaine.
* C'est un détournement de l'utilisation habituelle pour un objet.
* @param null|array|int $qui L'initiateur de l'action:
* - si null on prend alors visiteur_session
* - un id_auteur (on regarde dans la base)
* - un tableau auteur complet, y compris [restreint]
* @param null|array $options Tableau d'options sous forme de tableau associatif : `null`, inutilisé
*
* @return bool `true`si l'auteur est autorisée à exécuter l'action, `false` sinon.
*/
function autoriser_observation_instituer_dist($faire, $type, $id, $qui, $options) {
// Initialisation de l'autorisation à non autorisé par défaut.
$autoriser = false;
if (autoriser( 'modifier', 'typecontrole', $id)) {
if (
autoriser('ezcheck')
and include_spip('action/editer_objet')
and objet_lire('observation', (int) $id)
and isset($options['action'])
and in_array($options['action'], ['corriger', 'acquitter', 'supprimer'])) {
$autoriser = true;
}

39
ezcheck_fonctions.php

@ -1,6 +1,7 @@
<?php
// Sécurité
/**
* Ce fichier contient les filtres et les balises du plugin.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -22,7 +23,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @return Champ Pile complétée par le code à générer.
**/
function balise_DASHBOARD_dist($p) {
// Récupération des arguments de la balise.
// -- Identifiant du dashboard uniquement.
$dashboard_id = interprete_argument_balise(1, $p);
@ -30,8 +30,8 @@ function balise_DASHBOARD_dist($p) {
// Calcul de la balise
$p->code = "(include_spip('inc/ezcheck_dashboard')
? ($dashboard_id
? dashboard_lire($dashboard_id)
? ({$dashboard_id}
? dashboard_lire({$dashboard_id})
: dashboard_repertorier())
: [])";
@ -60,7 +60,6 @@ function balise_DASHBOARD_dist($p) {
* ```
*/
function balise_DASHBOARD_CONTEXTE_dist($p) {
// Récupération des arguments de la balise.
// -- Tous les arguments sont obligatoires.
$dashboard_id = interprete_argument_balise(1, $p);
@ -72,13 +71,12 @@ function balise_DASHBOARD_CONTEXTE_dist($p) {
// Calcul de la balise
$p->code = "(include_spip('inc/ezcheck_dashboard')
? dashboard_contextualiser($dashboard_id, $groupe_id, $type_controle)
? dashboard_contextualiser({$dashboard_id}, {$groupe_id}, {$type_controle})
: [])";
return $p;
}
/**
* Compile la balise `#TYPE_CONTROLE_DASHBOARD` qui renvoie l'identifiant du dashboard auquel le type de contrôle est
* rattaché.
@ -91,7 +89,6 @@ function balise_DASHBOARD_CONTEXTE_dist($p) {
* @return Champ Pile complétée par le code à générer.
*/
function balise_TYPE_CONTROLE_DASHBOARD_dist($p) {
// Récupération des arguments.
// -- l'identifiant du type de contrôle unoiquement
$type_controle = interprete_argument_balise(1, $p);
@ -99,25 +96,23 @@ function balise_TYPE_CONTROLE_DASHBOARD_dist($p) {
// On calcule la balise
$p->code = "(include_spip('inc/ezcheck_type_controle')
? type_controle_identifier_dashboard($type_controle)
? type_controle_identifier_dashboard({$type_controle})
: '')";
return $p;
}
/**
* Construit le titre d'un contrôle.
*
* @param int $id_objet
* @param array $champs
* @param int $id_objet Identifiant du contrôle
* @param array $champs Liste des champs de l'objet concerné
*
* @return string
*/
function generer_titre_controle($id_objet, $champs) {
// Le titre d'un contrôle est de la forme type_controle:id
$titre = "{$champs['type_controle']}:${id_objet}";
$titre = "{$champs['type_controle']}:{$id_objet}";
return $titre;
}
@ -125,15 +120,14 @@ function generer_titre_controle($id_objet, $champs) {
/**
* Construit le titre d'une observation.
*
* @param int $id_objet
* @param array $champs
* @param int $id_objet Identifiant de l'observation
* @param array $champs Liste des champs de l'objet concerné
*
* @return string
*/
function generer_titre_observation($id_objet, $champs) {
// Le titre d'une observation est de la forme code:id
$titre = "{$champs['code']}:{$champs['id_controle']}-${id_objet}";
$titre = "{$champs['code']}:{$champs['id_controle']}-{$id_objet}";
return $titre;
}
@ -142,17 +136,16 @@ function generer_titre_observation($id_objet, $champs) {
* Passe la fonction `typo()` si la valeur du paramètre est un idiome, sinon ne rien faire.
* Cette fonction est nécessaire pour passer le paramètre dans l'environnement.
*
* @param mixed $valeur
* @param mixed $valeur Chaine représentant une valeur à afficher
*
* @return mixed
* @return mixed Chaine à afficher
*/
function parametre_preparer_pour_env($valeur) {
// Si la variable est un idiome spip <:modute:item:> on passe typo
if (
is_string($valeur)
and (strpos($valeur, '<:') !== false)
and preg_match('/^\<:([^>]*?):\>$/', $valeur, $match)
and preg_match('/^\<:([^>]*?):\>$/', $valeur)
) {
$valeur = typo($valeur);
}

10
ezcheck_pipelines.php

@ -1,6 +1,7 @@
<?php
// Sécurité
/**
* Ce fichier contient les fonctions d'instanciation des pipelines utiles au plugin.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -12,12 +13,11 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* - on recharge les types de contrôle.
* - on recharge les dashboards
*
* @param $flux
* @param mixed $flux Flux d'entrée contenant la chaine affichée
*
* @return mixed
* @return mixed Flux complétée par Check Factory
*/
function ezcheck_affiche_milieu($flux) {
if (isset($flux['args']['exec'])) {
// Initialisation de la page du privé
$exec = $flux['args']['exec'];

45
formulaires/parametrer_controle.php

@ -1,20 +1,29 @@
<?php
/**
* Ce fichier contient les fonctions de gestion du formulaire CVT de paramétrage d'un contrôle.
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* @param $type_controle
* @param $id_auteur
* @param $redirect
*
* @return array
*/
function formulaires_parametrer_controle_charger_dist($type_controle, $id_auteur, $redirect = '') {
// Initialisation des valeurs à passer au formulaire
$valeurs = array(
$valeurs = [
'editable' => false,
'type_controle' => $type_controle,
'_description' => '',
'_message_inactif' => false,
'_champs_fonction' => array(),
'_champs_squelette' => array(),
'_champs_fonction' => [],
'_champs_squelette' => [],
'_bouton_execution' => false
);
];
// Récupération des informations sur la type de contrôle
include_spip('inc/ezcheck_type_controle');
@ -40,11 +49,11 @@ function formulaires_parametrer_controle_charger_dist($type_controle, $id_auteur
// Déterminer le nombre d'anomalies encore ouvertes pour le type de contrôle
include_spip('inc/ezcheck_observation');
$filtres = array(
$filtres = [
'type_controle' => $type_controle,
'est_anomalie' => 'oui',
'statut' => 'ouverte',
);
];
$observations = observation_repertorier($filtres, 'id_observation');
$valeurs['_bouton_execution'] = (count($observations) === 0);
@ -55,8 +64,15 @@ function formulaires_parametrer_controle_charger_dist($type_controle, $id_auteur
return $valeurs;
}
/**
* @param $type_controle
* @param $id_auteur
* @param $redirect
*
* @return array
*/
function formulaires_parametrer_controle_verifier_dist($type_controle, $id_auteur, $redirect = '') {
$erreurs = array();
$erreurs = [];
// Vérifier les champs correspondant aux paramètres spécifiques du type de contrôle
include_spip('inc/ezcheck_type_controle');
@ -71,8 +87,15 @@ function formulaires_parametrer_controle_verifier_dist($type_controle, $id_auteu
return $erreurs;
}
/**
* @param $type_controle
* @param $id_auteur
* @param $redirect
*
* @return array
*/
function formulaires_parametrer_controle_traiter_dist($type_controle, $id_auteur, $redirect = '') {
$retour = array();
$retour = [];
if (autoriser('executer', 'typecontrole', $type_controle)) {
// On constitue le tableau des valeurs des paramètres spécifiques du type de contrôle
@ -80,7 +103,7 @@ function formulaires_parametrer_controle_traiter_dist($type_controle, $id_auteur
$champs = type_controle_lire($type_controle, 'parametres');
include_spip('inc/saisies_lister');
$parametres = array();
$parametres = [];
if ($champs['fonction']) {
foreach (saisies_lister_champs($champs['fonction'], false) as $_champ) {
$parametres['fonction'][$_champ] = _request($_champ);
@ -94,7 +117,7 @@ function formulaires_parametrer_controle_traiter_dist($type_controle, $id_auteur
// Exécution du type de contrôle avec les paramètres éventuellement saisis
include_spip('action/executer_type_controle');
if (type_controle_executer($type_controle, intval($id_auteur), $parametres)) {
if (type_controle_executer($type_controle, (int) $id_auteur, $parametres)) {
$retour['redirect'] = $redirect;
} else {
$retour['message_erreur'] = _T('ezcheck:type_controle_execution_message_erreur');

74
inc/ezcheck_dashboard.php

@ -12,41 +12,40 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* Etant donné que le nombre de dashboards est en général assez faible, l'ensemble du cache est systématiquement
* recalculé.
*
* @return bool `false` si une erreur s'est produite, `true` sinon.
*@api
* @api
*
* @return bool `false` si une erreur s'est produite, `true` sinon.
*/
function dashboard_charger() {
// Retour de la fonction
$retour = true;
// On recherche les dashboards:
// -- par leur fichier YAML ou JSON de configuration. La recherche s'effectue dans le path en utilisant le dossier
// relatif fourni.
$dashboards = array();
$dashboards = [];
$fichiers = find_all_in_path('ezcheck/dashboards/', '.+[.](yaml|json)$');
foreach ($fichiers as $_nom_fichier => $_chemin) {
// Détermination de l'extension du fichier json ou yaml.
$extension = pathinfo($_nom_fichier, PATHINFO_EXTENSION);
// L'identifiant du dashboard est son nom de fichier sans extension
$id_dashboard = basename($_nom_fichier, ".$extension");
$id_dashboard = basename($_nom_fichier, ".{$extension}");
// on constitue un tableau unifié dont les clés sont les identifiants de dashboard
$dashboards[$id_dashboard] = array(
$dashboards[$id_dashboard] = [
'est_fichier' => true,
'extension' => $extension,
'chemin' => $_chemin,
);
];
}
// -- par l'intermédiaire d'un pipeline qui permet à des plugins de fournir leurs propres type de contrôle. Le
// tableau est au même format que le fichier YAML ou JSON décodé.
// Attention, si on utilise le même identifiant dans le pipeline, le dashboard fichier disparaitra.
$flux = array(
'args' => array(),
$flux = [
'args' => [],
'data' => $dashboards
);
];
$dashboards = pipeline('eztypecontrole_declarer', $flux);
// On recherche les dashboards directement par leur fichier YAML de configuration car il est
@ -54,13 +53,13 @@ function dashboard_charger() {
if ($dashboards) {
foreach ($dashboards as $_id_dashboard => $_description) {
// Initialisation de la description par défaut du type de contrôle
$description_defaut = array(
'identifiant' => $_id_dashboard,
'nom' => $_id_dashboard,
'description' => '',
'icone' => 'dashboard_defaut-24.svg',
'groupes' => array(),
);
$description_defaut = [
'identifiant' => $_id_dashboard,
'nom' => $_id_dashboard,
'description' => '',
'icone' => 'dashboard_defaut-24.svg',
'groupes' => [],
];
// Si le dashboard est issu d'un fichier de configuration YAML ou JSON on le lit et le décode en structure
// de données PHP.
@ -69,10 +68,9 @@ function dashboard_charger() {
include_spip('inc/flock');
lire_fichier($_description['chemin'], $dashboard_contenu);
$description = json_decode($dashboard_contenu, true);
}
else {
} else {
include_spip('inc/yaml');
$description = yaml_decode_file($_description['chemin'], array('include' => false));
$description = yaml_decode_file($_description['chemin'], ['include' => false]);
}
} else {
$description = $_description;
@ -82,7 +80,7 @@ function dashboard_charger() {
$description = array_merge($description_defaut, $description);
// On reformate le tableau des groupes pour que l'index soit l'identifiant
$groupes = array();
$groupes = [];
foreach ($description['groupes'] as $_groupe) {
$groupes[$_groupe['identifiant']] = $_groupe;
}
@ -90,12 +88,12 @@ function dashboard_charger() {
// Permettre à des plugins de compléter la description du dashboard, en particulier, d'ajouter
// des groupes et/ou des types de contrôle à un groupe.
$flux = array(
'args' => array(
'dashboard' => $_id_dashboard,
),
$flux = [
'args' => [
'dashboard' => $_id_dashboard,
],
'data' => $description
);
];
$description = pipeline('ezdashboard_declarer', $flux);
// On ajoute le dashboard nouveau ou modifié
@ -105,9 +103,9 @@ function dashboard_charger() {
// Etant donné que le nombre dashboard est réduit tout comme les informations qui le compose on choisit
// de l'écrire systématiquement.
// -- Initialisation de l'identifiant du cache des dashboards
$cache = array(
$cache = [
'nom' => 'dashboards',
);
];
// -- Ecriture du cache
include_spip('inc/ezcache_cache');
cache_ecrire('ezcheck', 'dashboard', $cache, $dashboards);
@ -129,16 +127,15 @@ function dashboard_charger() {
* @return array La description complète. Si demandé, les champs textuels peuvent être traités avec la fonction typo().
*/
function dashboard_lire($id_dashboard, $traiter_typo = false) {
// On met en cache mémoire statique les dashboards déjà lus.
static $dashboards_charges = array();
static $dashboards_charges = [];
// On vérifie si le dashboard demandé n'est pas déjà stocké : si oui, la description est renvoyée immédiatement
if (isset($dashboards_charges[$traiter_typo][$id_dashboard])) {
$dashboard = $dashboards_charges[$traiter_typo][$id_dashboard];
} else {
// Il faut charger le dashboard depuis le cache. On initialise avec le tableau qui est indique une erreur.
$dashboard = array();
$dashboard = [];
// Chargement de tous les dashboards connus à partir du fichier cache.
$dashboards_caches = dashboard_repertorier();
@ -163,7 +160,7 @@ function dashboard_lire($id_dashboard, $traiter_typo = false) {
$dashboards_charges[$traiter_typo][$id_dashboard] = $dashboard;
} else {
// En cas d'erreur stocker un dashboard vide
$dashboards_charges[$traiter_typo][$id_dashboard] = array();
$dashboards_charges[$traiter_typo][$id_dashboard] = [];
}
}
@ -174,6 +171,8 @@ function dashboard_lire($id_dashboard, $traiter_typo = false) {
* Renvoie l'information brute demandée pour l'ensemble des dashboards utilisés
* ou toute les descriptions si aucune information n'est explicitement demandée.
*
* @api
*
* @param string $information Identifiant d'un champ de la description d'un dashboard.
* Si l'argument est vide, la fonction renvoie les descriptions complètes et si l'argument est
* un champ invalide la fonction renvoie un tableau vide.
@ -182,15 +181,14 @@ function dashboard_lire($id_dashboard, $traiter_typo = false) {
* sont retournés en l'état, le timestamp `maj n'est pas fourni.
*/
function dashboard_repertorier($information = '') {
// Initialiser le tableau de sortie en cas d'erreur
$dashboards = $information ? '' : array();
$dashboards = $information ? '' : [];
// Les dashboards sont stockées dans un cache sécurisé géré par Cache Factory.
// -- Initialisation de l'identifiant du cache des dashboards
$cache = array(
$cache = [
'nom' => 'dashboards',
);
];
include_spip('inc/ezcache_cache');
if ($descriptions = cache_lire('ezcheck', 'dashboard', $cache)) {
@ -207,7 +205,6 @@ function dashboard_repertorier($information = '') {
return $dashboards;
}
/**
* Renvoie la configuration complète d’un dashboard ainsi que ainsi que des informations supplémentaires provenant
* de l'environnement de la page dashboard (groupe et type de contrôle à afficher par défaut).
@ -219,9 +216,8 @@ function dashboard_repertorier($information = '') {
* @return array
*/
function dashboard_contextualiser($id_dashboard, $id_groupe, $type_controle) {
// On initialise le contexte à vide en cas d'erreur
$contexte = array();
$contexte = [];
// On récupère la description du dashboard désigné par son identifiant
include_spip('inc/ezcheck_dashboard');

40
inc/ezcheck_observation.php

@ -15,8 +15,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* @return bool
*/
function observation_ajouter($est_anomalie, $id_controle, $valeurs = array()) {
function observation_ajouter($est_anomalie, $id_controle, $valeurs = []) {
// Lecture pour le contrôle concerné de son type et du nombre d'anomalies ouvertes.
// - on utilise le forcage de lecture pour by-passer le cache statique de la fonction objet_lire() car sinon
// le nombre d'anomalies mis à jour lors de l'ajout de l'observation ne serait pas à jour.
@ -24,14 +23,14 @@ function observation_ajouter($est_anomalie, $id_controle, $valeurs = array()) {
$controle = objet_lire(
'controle',
$id_controle,
array(
'champs' => array('type_controle', 'nb_anomalies'),
[
'champs' => ['type_controle', 'nb_anomalies'],
'force' => true
)
]
);
// Initialisation par défaut des champs de l'observation
$observation = array(
$observation = [
'id_controle' => $id_controle,
'type_controle' => $controle['type_controle'],
'objet' => '',
@ -42,8 +41,8 @@ function observation_ajouter($est_anomalie, $id_controle, $valeurs = array()) {
'code' => '',
'statut' => $est_anomalie ? 'ouverte' : 'fermee',
'date' => date('Y-m-d H:i:s'),
'parametres' => array()
);
'parametres' => []
];
// Prise en compte des champs fournis par l'appelant.
$observation = array_merge($observation, array_intersect_key($valeurs, $observation));
@ -55,7 +54,7 @@ function observation_ajouter($est_anomalie, $id_controle, $valeurs = array()) {
if ($id_observation = objet_inserer('observation', null, $observation)) {
if ($est_anomalie) {
// On incrémente le nombre d'anomalies ouvertes du contrôle si on vient d'en rajouter une.
$maj_controle = array('nb_anomalies' => $controle['nb_anomalies'] + 1);
$maj_controle = ['nb_anomalies' => $controle['nb_anomalies'] + 1];
objet_modifier('controle', $id_controle, $maj_controle);
}
} else {
@ -79,10 +78,9 @@ function observation_ajouter($est_anomalie, $id_controle, $valeurs = array()) {
* @return array Tableau de la forme `[id_observation] = champ ou description complète`. Les champs textuels
* et les tableaux sérialisés sont retournés en l'état.
*/
function observation_repertorier($filtres = array(), $champ = '') {
function observation_repertorier($filtres = [], $champ = '') {
// On calcule le where à partir des filtres sachant que tous les champs sont des chaines.
$where = array();
$where = [];
if ($filtres) {
foreach ($filtres as $_champ => $_critere) {
$operateur = '=';
@ -105,13 +103,12 @@ function observation_repertorier($filtres = array(), $champ = '') {
$retour = array_column($observations, null, 'id_observation');
}
} else {
$retour = array();
$retour = [];
}
return $retour;
}
/**
* Effectue les traitements adéquats pour clore une observation : acquitte une anomalie, corrige une anomalie ou
* supprime une observation.
@ -125,7 +122,6 @@ function observation_repertorier($filtres = array(), $champ = '') {
* @return bool
*/
function observation_cloturer($action, $id_observation, $id_auteur) {
// Initialisation du retour de la fonction
$retour = true;
@ -137,7 +133,7 @@ function observation_cloturer($action, $id_observation, $id_auteur) {
// Récupération des informations nécessaires sur le contrôle
$controle = objet_lire('controle', $id_controle);
// Récupération des informations nécessaires le type de contrôle
// Récupération des informations nécessaires sur le type de contrôle
include_spip('inc/ezcheck_type_controle');
$type_controle = type_controle_lire($controle['type_controle']);
@ -150,29 +146,29 @@ function observation_cloturer($action, $id_observation, $id_auteur) {
// La fonction de correction doit retourner '' si ok et un identifiant d'erreur non vide sinon.
if ($erreur = $corriger($id_observation, $id_auteur)) {
$pre_traitement_ok = false;
spip_log("Fonction de correction : `$corriger` en erreur ($erreur)", 'ezcheck' . _LOG_ERREUR);
spip_log("Fonction de correction : `{$corriger}` en erreur ({$erreur})", 'ezcheck' . _LOG_ERREUR);
}
}
if ($pre_traitement_ok) {
// Initialisation du statut final en fonction de l'action.
$maj_observation = array(
$maj_observation = [
'statut' => ($action === 'supprimer' ? 'poubelle' : 'fermee'),
);
];
// Changement de statut
if ($erreur = objet_modifier('observation', $id_observation, $maj_observation)) {
$retour = false;
spip_log("Modification de l'observation `$id_observation` en erreur ($erreur)", 'ezcheck' . _LOG_ERREUR);
spip_log("Modification de l'observation `{$id_observation}` en erreur ({$erreur})", 'ezcheck' . _LOG_ERREUR);
} elseif (
($action !== 'supprimer')
and ($observation['est_anomalie'] === 'oui')
) {
// Traitements post changement de statut :
// - il faut décrémenter le nombre d'anomalies ouvertes du contrôle associé.
$maj_controle = array(
$maj_controle = [
'nb_anomalies' => $controle['nb_anomalies'] - 1
);
];
objet_modifier('controle', $id_controle, $maj_controle);
}
} else {

143
inc/ezcheck_type_controle.php

@ -13,57 +13,56 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* en fonction des modifications, ajouts et suppressions des contrôles identifiés
* en comparant les md5 des descriptions.
*
* @api
*
* @param bool $recharger Si `true` force le rechargement de tous les types de contrôles sinon le chargement se base
* sur le md5 des fichiers YAML. Par défaut vaut `false`.
*
* @return bool `false` si une erreur s'est produite, `true` sinon.
*@api
*
*/
function type_controle_charger($recharger = false) {
// Retour de la fonction
$retour = true;
// On recherche les types de contrôle:
// -- par leur fichier YAML de configuration. La recherche s'effectue dans le path en utilisant le dossier
// relatif fourni.
$types_controle = array();
$types_controle = [];
$fichiers = find_all_in_path('ezcheck/controles/', '.+[.]yaml$');
foreach ($fichiers as $_nom_fichier => $_chemin) {
// L'identifiant du type de contrôle est son nom de fichier sans extension
$id_type_controle = basename($_nom_fichier, '.yaml');
// on constitue un tableau unifié dont les clés sont les identifiants de type de contrôle
$types_controle[$id_type_controle] = array(
$types_controle[$id_type_controle] = [
'est_fichier' => true,
'chemin' => $_chemin,
);
];
}
// -- par l'intermédiaire d'un pipeline qui permet à des plugins de fournir leurs propres type de contrôle. Le
// tableau est au même format que le fichier YAML décodé.
// Attention, si on utilise le même identifiant dans le pipeline, le type de contrôle fichier disparaitra.
$flux = array(
'args' => array(),
$flux = [
'args' => [],
'data' => $types_controle
);
];
$types_controle = pipeline('eztypecontrole_declarer', $flux);
if ($types_controle) {
// Initialisation des tableaux de types de contrôle.
$types_controle_a_ajouter = $types_controle_a_changer = $types_controle_a_effacer = array();
$types_controle_a_ajouter = $types_controle_a_changer = $types_controle_a_effacer = [];
// Récupération de la description complète des contrôles déjà enregistrés de façon :
// - à gérer l'activité des types en fin de chargement
// - de comparer les signatures md5 des noisettes déjà enregistrées. Si on force le rechargement il est inutile
// de gérer les signatures et les contrôles modifiés ou obsolètes.
$types_controle_existants = type_controle_repertorier();
$signatures = array();
$signatures = [];
if (!$recharger) {
$signatures = array_column($types_controle_existants, 'signature', 'identifiant');
// On initialise la liste des contrôles à supprimer avec l'ensemble des contrôles déjà stockés.
$types_controle_a_effacer = $signatures ? array_keys($signatures) : array();
$types_controle_a_effacer = $signatures ? array_keys($signatures) : [];
}
foreach ($types_controle as $id_type_controle => $_description) {
@ -76,20 +75,20 @@ function type_controle_charger($recharger = false) {
// Initialisation de la description par défaut du type de contrôle
$description_defaut = [
'identifiant' => $id_type_controle,
'nom' => $id_type_controle,
'description' => '',
'icone' => 'controle_defaut-24.svg',
'necessite' => [],
'est_etat' => 'non',
'include' => '',
'fonction' => $id_type_controle,
'parametres' => [],
'anomalies' => [],
'squelette' => '',
'contexte' => [],
'actif' => 'oui',
'signature' => '',
'identifiant' => $id_type_controle,
'nom' => $id_type_controle,
'description' => '',
'icone' => 'controle_defaut-24.svg',
'necessite' => [],
'est_etat' => 'non',
'include' => '',
'fonction' => $id_type_controle,
'parametres' => [],
'anomalies' => [],
'squelette' => '',
'contexte' => [],
'actif' => 'oui',
'signature' => '',
];
// On vérifie que le md5 du fichier YAML ou du tableau issu du pipeline est bien différent de celui stocké
@ -102,7 +101,7 @@ function type_controle_charger($recharger = false) {
// tel que si elle provient du pipeline.
include_spip('inc/yaml');
$description = (!empty($_description['est_fichier']))
? yaml_decode_file($_description['chemin'], array('include' => true))
? yaml_decode_file($_description['chemin'], ['include' => true])
: $_description;
// Ajout de la signature
@ -134,10 +133,10 @@ function type_controle_charger($recharger = false) {
}
$description = array_merge($description, $affichage);
}
$parametres_defaut = array(
'fonction' => array(),
'squelette' => array()
);
$parametres_defaut = [
'fonction' => [],
'squelette' => []
];
$description['parametres'] = array_merge($parametres_defaut, $description['parametres']);
// Normalisation des champs relatifs à la fonction d'exécution:
@ -146,8 +145,8 @@ function type_controle_charger($recharger = false) {
// - '/nom_fichier' indique que le fichier est dans le répertoire relatif par défaut, soit 'ezcheck/controles/'.
// - '[dir_relatif/]nom_fichier' indique qu'il faut utiliser le chemin relatif fourni tel que.
$nom_fichier = basename($description['include']);
if ($description['include'] === "/${nom_fichier}") {
$description['include'] = "ezcheck/controles/${nom_fichier}";
if ($description['include'] === "/{$nom_fichier}") {
$description['include'] = "ezcheck/controles/{$nom_fichier}";
}
// Vérification de l'existence de la fonction PHP
@ -159,11 +158,11 @@ function type_controle_charger($recharger = false) {
// Normalisation du bloc anomalies qui doit toujours contenir un tableau 'acquitter' et un autre
// 'corriger'.
$actions_defaut = array(
$actions_defaut = [
'include' => '',
'acquitter' => array(),
'corriger' => array()
);
'acquitter' => [],
'corriger' => []
];
$description['anomalies'] = array_merge($actions_defaut, $description['anomalies']);
if ($description['anomalies']['corriger']) {
// Identification de l'include dans lequel on ira chercher les actions. Il peut être différent
@ -173,8 +172,8 @@ function type_controle_charger($recharger = false) {
$description['anomalies']['include'] = $description['include'];
} else {
$nom_fichier = basename($description['anomalies']['include']);
if ($description['anomalies']['include'] === "/${nom_fichier}") {
$description['anomalies']['include'] = "ezcheck/controles/${nom_fichier}";
if ($description['anomalies']['include'] === "/{$nom_fichier}") {