Mise en place de pipelines pour permettre à des plugins de compléter les traitements de peuplement ou de dépeuplement.

v0_spip32
Eric Lupinacci 3 years ago
parent 15b543d6c9
commit e5a6a3b064

@ -218,10 +218,31 @@ function territoire_peupler($type, $pays = '', $options = array()) {
// On rétablit les liens vers les territoires et les logos
// -- les liens avec les autres objets
lien_retablir('liens', $sauvegardes);
$config_lien = array(
'table' => 'spip_territoires_liens',
'id_table' => 'id_territoire'
);
territoire_retablir_lien('liens', $sauvegardes, $config_lien);
// -- les liens avec les logos
lien_retablir('logos', $sauvegardes);
$config_lien = array(
'table' => 'spip_documents_liens',
'id_table' => 'id_objet'
);
territoire_retablir_lien('logos', $sauvegardes, $config_lien);
// Permettre à d'autres plugins de compléter le peuplement.
// -- par exemple le plugin Contours rétablit les liens vers les contours GIS (spip_liens_gis),
// les objets GIS étant conservés si ils existent déjà.
$flux = array(
'args' => array(
'type' => $type,
'pays' => $pays,
'sauvegardes' => $sauvegardes
),
'data' => array()
);
pipeline('post_peupler_territoire', $flux);
// On stocke les informations de chargement dans une meta.
$contenu = array(
@ -313,6 +334,18 @@ function territoire_depeupler($type, $pays = '') {
// Vider les liens éventuels avec les autres objets (on gère pas d'erreur)
sql_delete('spip_territoires_liens', $where_lien);
// Permettre à d'autres plugins de compléter le dépeuplement.
// -- par exemple le plugin Contours supprime les liens vers les contours GIS (spip_liens_gis),
// Par contre, les objets GIS sont conservés si ils en existent.
$flux = array(
'args' => array(
'type' => $type,
'pays' => $pays,
),
'data' => array()
);
pipeline('post_depeupler_territoire', $flux);
// Supprimer la meta propre au pays même si le vidage des liens est en erreur.
$meta = 'territoires_peuplement';
peuplement_deconsigner($meta, $type, $pays);
@ -342,9 +375,9 @@ function territoire_depeupler($type, $pays = '') {
}
/**
* Extrait, pour un les régions, les pays ou les ubdivisions d'un pays, la liste des territoires ayant fait l'objet
* Extrait, pour un les régions, les pays ou les subdivisions d'un pays, la liste des territoires ayant fait l'objet
* d'une modification manuelle (descriptif ou logo) et la liste associations vers ses mêmes territoires.
* Les extras ne sont pas sauvegardés car il ne sont ni modifiables ni indexés par un id.
* Les extras ne sont pas sauvegardés car il ne sont ni modifiables ni indexés par un id mais par un code invariant.
*
* @api
*
@ -399,13 +432,24 @@ function territoire_preserver($type, $pays = '') {
// -- détermination de la liste des champs éditables.
include_spip('base/objets');
$description_table = lister_tables_objets_sql($from);
// -- pour le select, les champs éditables sont complétés par le code ISO et l'id qui servira aux liens.
// -- pour le select, les champs éditables sont complétés par le code ISO.
$select = array_merge($description_table['champs_editables'], array('iso_territoire'));
$where[] = 'edite=' . sql_quote('oui');
$editions = sql_allfetsel($select, $from, $where);
// -- indexer le tableau par le code iso de façon à simplifier la réintégration.
$territoires['editions'] = array_column($editions, null, 'iso_territoire');
// Permettre à d'autres plugins de compléter la sauvegarde (principalement pour les liens).
// -- par exemple le plugin Contours sauvegarde les liens vers les contours GIS (spip_liens_gis).
$flux = array(
'args' => array(
'type' => $type,
'pays' => $pays,
),
'data' => $territoires
);
$territoires = pipeline('post_preserver_territoire', $flux);
return $territoires;
}
@ -531,6 +575,42 @@ function territoire_extra_est_peuple($type_extra, $type, $pays = '') {
return $est_peuple;
}
/**
* Rétablit les liens d'un type d'objet avec les territoires peuplés ou repeuplés.
*
* @internal
*
* @param string $type_lien Type de liens à restaurer : `liens` ou `logos`.
* @param array $sauvegardes Tableau des sauvegardes dans lequel puiser les liens existants et les nouveaux id.
* @param array $config_lien Tableau de configuration de la table de liens concernée composé des index:
* - `table` : nom complet de la table spip
* - `id_table` : nom du champ id du territoire
*
* @return void
*/
function territoire_retablir_lien($type_lien, $sauvegardes, $config_lien) {
// On contruit la liste des enregistrements correspondant aux liens à rétablir.
$liens = array();
foreach ($sauvegardes[$type_lien] as $_lien) {
// identifier le code iso à partir de l'ancien id
$iso = array_search($_lien[$config_lien['id_table']], $sauvegardes['ids']);
// en déduire le nouvel id de la territoire et le mettre à jour dans le tableau
// -- si l'iso n'est pas trouvé dans les nouveaux c'est que la territoire n'existe plus
// et qu'il ne faut pas rétablir les liens
if (isset($ids[$iso])) {
$lien = $_lien;
$lien[$config_lien['id_table']] = $ids[$iso];
$liens[] = $lien;
}
}
// Insertion des liens en une seule requête
if ($liens) {
sql_insertq_multi($config_lien['table'], $liens);
}
}
/**
* Consigne le peuplement d'un type de territoire.
*
@ -725,51 +805,6 @@ function traduction_fusionner($multi_prioritaire, $multi_non_prioritaire) {
return $multi_merge;
}
/**
* Supprime la consignation du peuplement d'un type de territoire.
*
* @internal
*
* @param string $type_lien Type de liens à restaurer : `liens` ou `logos`.
* @param array $sauvegardes Tableau des sauvegardes dans lequel puiser les liens existants et les nouveaux id.
*
* @return void
*/
function lien_retablir($type_lien, $sauvegardes) {
// Configuration des tables de liens
static $tables = array(
'liens' => array(
'table' => 'spip_territoires_liens',
'id_table' => 'id_territoire'
),
'logos' => array(
'table' => 'spip_documents_liens',
'id_table' => 'id_objet'
)
);
// On contruit la liste des enregistrements correspondant aux liens à rétablir.
$liens = array();
foreach ($sauvegardes[$type_lien] as $_lien) {
// identifier le code iso à partir de l'ancien id
$iso = array_search($_lien[$tables[$type_lien]['id_table']], $sauvegardes['ids']);
// en déduire le nouvel id de la territoire et le mettre à jour dans le tableau
// -- si l'iso n'est pas trouvé dans les nouveaux c'est que la territoire n'existe plus
// et qu'il ne faut pas rétablir les liens
if (isset($ids[$iso])) {
$lien = $_lien;
$lien[$tables[$type_lien]['id_table']] = $ids[$iso];
$liens[] = $lien;
}
}
// Insertion des liens en une seule requête
if ($liens) {
sql_insertq_multi($tables[$type_lien]['table'], $liens);
}
}
/**
* @param $territoire
* @param $type

@ -20,12 +20,14 @@
<licence>GNU/GPL</licence>
<necessite nom="saisies" compatibilite="[3.23.2;]" />
<pipeline nom="post_peupler_territoire" action="" />
<pipeline nom="post_preserver_territoire" action="" />
<pipeline nom="post_depeupler_territoire" action="" />
<pipeline nom="autoriser" inclure="territoires_autorisations.php" />
<pipeline nom="declarer_tables_objets_sql" inclure="base/territoires.php" />
<pipeline nom="declarer_tables_objets_sql" inclure="base/territoires.php" />
<pipeline nom="declarer_tables_interfaces" inclure="base/territoires.php" />
<pipeline nom="declarer_tables_auxiliaires" inclure="base/territoires.php" />
<pipeline nom="autoriser" inclure="territoires_autorisations.php" />
<pipeline nom="pre_edition" inclure="territoires_pipelines.php" />
<pipeline nom="affiche_milieu" inclure="territoires_pipelines.php" />
<pipeline nom="affiche_gauche" inclure="territoires_pipelines.php" />

Loading…
Cancel
Save