Refactoring de l'edition des mots arborescents : il n'etait pas possible de gerer proprement via les pipeline car id_parent notamment n'arrivait jamais dans les pipeline.

Le code fonctionnait a base de _request() ce qui marchait sur le formulaire edition du prive, mais aucunement quand on utilise les fonction objet_modifier() en batch
On gere donc tout ca proprement dans action/editer_mot.php
issue4
Cerdic 2 years ago
parent 505004de46
commit 249329803b

@ -92,8 +92,33 @@ function mot_inserer($id_groupe, $set = null) {
)
);
// Specifique MOTSAR
// si il y a un id_parent dans le meme groupe, affecter ainsi que niveau et profondeur
if (!empty($champs['id_parent'])
and $mot_parent = sql_fetsel('profondeur, id_mot_racine', 'spip_mots', 'id_mot='.intval($champs['id_parent'])." AND id_groupe=".intval($id_groupe))) {
$champs['profondeur'] = $mot_parent['profondeur'] + 1;
$champs['id_mot_racine'] = $mot_parent['id_mot_racine'];
}
// sinon tout laisser par defaut
else {
if (isset($champs['profondeur'])) {
unset($champs['profondeur']);
}
if (isset($champs['id_mot_racine'])) {
unset($champs['id_mot_racine']);
}
}
// /FIN Specifique MOTSAR
$id_mot = sql_insertq('spip_mots', $champs);
// Specifique MOTSAR
if (empty($champs['id_mot_racine'])) {
sql_updateq('spip_mots', ['id_mot_racine' => $id_mot], 'id_mot='.intval($id_mot));
$champs['id_mot_racine'] = $id_mot;
}
// /FIN Specifique MOTSAR
pipeline(
'post_insertion',
array(
@ -128,7 +153,11 @@ function mot_modifier($id_mot, $set = null) {
// white list
objet_info('mot', 'champs_editables'),
// black list
array('id_groupe'),
array('id_groupe',
// Specifique MOTSAR
'id_parent', 'profondeur', 'id_mot_racine'
// /FIN Specifique MOTSAR
),
// donnees eventuellement fournies
$set
);
@ -145,7 +174,11 @@ function mot_modifier($id_mot, $set = null) {
return $err;
}
$c = collecter_requests(array('id_groupe', 'type'), array(), $set);
$c = collecter_requests(array('id_groupe', 'type',
// Specifique MOTSAR
'id_parent', 'profondeur', 'id_mot_racine'
// /FIN Specifique MOTSAR
), array(), $set);
$err = mot_instituer($id_mot, $c);
return $err;
@ -175,6 +208,43 @@ function mot_instituer($id_mot, $c) {
}
}
// Specifique MOTSAR
if (isset($c['id_parent'])) {
$ancien = sql_fetsel('id_parent, profondeur, id_mot_racine, id_groupe', 'spip_mots', 'id_mot=' . intval($id_mot));
$id_groupe = $champs['id_groupe'] ?? $ancien['id_groupe'];
$id_parent_ancien = $ancien['id_parent'];
$id_parent_nouveau = $c['id_parent'];
// uniquement s'ils sont différents
if ($id_parent_ancien!=$id_parent_nouveau
// que le nouveau parent n'est pas notre mot !
and $id_mot!=$id_parent_nouveau
// et que le mot parent n'est pas un de nos enfants
and include_spip('motsar_fonctions') // calcul_branche_mot_in
and !in_array($id_parent_nouveau, explode(',', calcul_branche_mot_in($id_mot)))
){
// si c'est un mot connu dans le bon groupe
if ($id_parent_nouveau
and $parent = sql_fetsel('profondeur, id_mot_racine', 'spip_mots', 'id_mot=' . intval($id_parent_nouveau)." AND id_groupe=".intval($id_groupe))){
$champs['id_parent'] = $id_parent_nouveau;
// si le id_parent change, on mets toujours profondeur et id_mot_racine, meme si ils ne changent pas
// par coherence et pour simplifier la vie de tout le monde
$champs['id_mot_racine'] = $parent['id_mot_racine'];
$champs['profondeur'] = $parent['profondeur']+1;
}
}
}
// si on a change de groupe, mais aucun parent definit, il faut le reset
if (!empty($champs['id_groupe']) and empty($champs['id_parent'])) {
$champs['id_parent'] = 0;
$champs['id_mot_racine'] = $id_mot;
$champs['profondeur'] = 0;
}
// /FIN Specifique MOTSAR
// Envoyer aux plugins
$champs = pipeline(
'pre_edition',
@ -198,6 +268,23 @@ function mot_instituer($id_mot, $c) {
// Post-modifications
//
// Specifique MOTSAR
if (isset($champs['id_parent'])) {
include_spip('motsar_fonctions');
motsar_definir_heritages_mot($id_mot);
propager_les_mots_arborescents();
}
elseif (isset($champs['id_groupe'])) {
include_spip('motsar_fonctions');
// redifinir les id_groupe de tous ses enfants
motsar_definir_heritages_mot($id_mot);
// peut être applatir les enfants, si le groupe n'autorise pas les mots arborescents
motsar_definir_heritages($id_groupe);
// recalculer les profondeurs et racines…
propager_les_mots_arborescents();
}
// /FIN Specifique MOTSAR
// Invalider les caches
include_spip('inc/invalideur');
suivre_invalideur("id='mot/$id_mot'");
@ -217,9 +304,7 @@ function mot_instituer($id_mot, $c) {
// Notifications
if ($notifications = charger_fonction('notifications', 'inc')) {
$notifications('instituermot', $id_mot,
array('id_groupe' => $champs['id_groupe'])
);
$notifications('instituermot', $id_mot, $champs);
}
return ''; // pas d'erreur
@ -234,7 +319,21 @@ function mot_instituer($id_mot, $c) {
* Identifiant du mot clé à supprimer
* @return void
*/
function mot_supprimer($id_mot) {
function mot_supprimer($id_mot, $avec_les_enfants = false) {
// Specifique MOTSAR
$id_mots_enfants = calcul_branche_mot_in($id_mot);
if ($avec_les_enfants) {
sql_delete('spip_mots', sql_in('id_mot', $id_mots_enfants));
}
else {
$id_parent = sql_fetsel('id_parent', 'spip_mots', 'id_mot='.intval($id_mot));
// tous les enfants remontent sur le parent de ce mot
sql_updateq('spip_mots', ['id_parent' => $id_parent], 'id_parent='.intval($id_mot));
// toute la branche remonte d'un niveau
sql_update('spip_mots', ['profondeur' => 'profondeur-1'], sql_in('id_mot', $id_mots_enfants));
}
// /FIN Specifique MOTSAR
sql_delete('spip_mots', 'id_mot=' . intval($id_mot));
mot_dissocier($id_mot, '*');
pipeline(

@ -267,23 +267,6 @@ function motsar_formulaire_fond_avec_querypath($flux) {
**/
function motsar_pre_insertion($flux) {
// Lors de la création d'un mot
if ($flux['args']['table'] == 'spip_mots') {
// On teste l'id_parent qui est soit :
// - posté car le pipeline est appelé via le formulaire d'édition
// - passé dans le flux car le pipeline est appelé via la fonction mot_inserer sans passer par le formulaire.
if (($id_parent = _request('id_parent'))
or (isset($flux['data']['id_parent']) and ($id_parent = $flux['data']['id_parent']))) {
$parent = sql_fetsel('id_mot_racine, profondeur', 'spip_mots', 'id_mot=' . sql_quote($id_parent));
// si et seulement si le parent demandé existe
if ($parent) {
$flux['data']['id_parent'] = $id_parent;
$flux['data']['id_mot_racine'] = $parent['id_mot_racine'];
$flux['data']['profondeur'] = $parent['profondeur'] + 1;
}
}
}
// Lors de la création d'un groupe de mot
if ($flux['args']['table'] == 'spip_groupes_mots') {
// On teste l'option mots arborescents soit dans les variables postées soit dans le flux.
@ -292,6 +275,7 @@ function motsar_pre_insertion($flux) {
$flux['data']['mots_arborescents'] = $mots_arborescents;
}
}
return $flux;
}
@ -310,17 +294,6 @@ function motsar_pre_insertion($flux) {
* Données du pipeline complétées
**/
function motsar_post_insertion($flux) {
// lors de la création d'un groupe
if ($flux['args']['table'] == 'spip_mots') {
$id_mot = $flux['args']['id_objet'];
// si le mot est à la racine,
// c'est a dire que 'id_mot_racine' n'est pas défini ou nul
// c'est que nous avons créé un mot racine. Il faut mettre
// id_mot_racine sur id_mot, maintenant qu'on le connait.
if (empty($flux['data']['id_mot_racine'])) {
sql_updateq('spip_mots', array('id_mot_racine' => $id_mot), 'id_mot=' . sql_quote($id_mot));
}
}
return $flux;
}
@ -342,68 +315,19 @@ function motsar_post_insertion($flux) {
* Données du pipeline complétées
**/
function motsar_pre_edition($flux) {
// lors de l'édition d'un mot
$table = 'spip_mots';
if ($flux['args']['table'] == $table
and $flux['args']['action'] == 'modifier')
{
$id_mot = $flux['args']['id_objet'];
$ancien = sql_fetsel(array('id_groupe', 'id_parent'), $table, 'id_mot=' . sql_quote($id_mot));
$id_parent_ancien = $ancien['id_parent'];
$id_parent_nouveau = _request('id_parent');
// uniquement s'ils sont différents
if ($id_parent_ancien != $id_parent_nouveau
// que le nouveau parent n'est pas notre groupe !
and $id_mot != $id_parent_nouveau
// et que le mot parent n'est pas un de nos enfants
and include_spip('motsar_fonctions') // calcul_branche_mot_in
and !in_array($id_parent_nouveau, explode(',', calcul_branche_mot_in($id_mot)))
) {
$id_racine = '';
$profondeur = 0;
// soit c'est la racine
if (!$id_parent_nouveau) {
// auquel cas l'identifiant racine est le meme que notre mot, qui migre à la racine
$id_racine = $id_mot;
// soit le groupe existe
} else {
$parent = sql_fetsel(array('profondeur', 'id_mot_racine'), $table, 'id_mot=' . sql_quote($id_parent_nouveau));
if ($parent) {
$id_racine = $parent['id_mot_racine'];
$profondeur = $parent['profondeur'] + 1;
}
}
if ($id_racine) {
$flux['data']['id_parent'] = $id_parent_nouveau;
$flux['data']['id_mot_racine'] = $id_racine;
$flux['data']['profondeur'] = $profondeur;
// pour le pipeline de post_edition. Permet entre autre de savoir
// qu'il faudra actualiser les mots de la branche
set_request('motsar_definir_heritages', true);
}
}
$id_groupe_ancien = $ancien['id_groupe'];
$id_groupe_nouveau = _request('id_groupe');
if ($id_groupe_ancien != $id_groupe_nouveau) {
// pour le pipeline de post_edition. Permet entre autre de savoir
// qu'il faudra actualiser tout le groupe
set_request('motsar_definir_heritages_groupe', $id_groupe_nouveau);
}
}
// lors de l'édition d'un groupe de mot
if ($flux['args']['table'] == 'spip_groupes_mots'
and $flux['args']['action'] == 'modifier')
{
$id_groupe = $flux['args']['id_objet'];
if ($mots_arborescents = _request('mots_arborescents')) {
$mots_arborescents_ancien = sql_getfetsel('mots_arborescents', 'spip_groupes_mots', 'id_groupe=' . sql_quote($flux['args']['id_objet']));
$mots_arborescents_ancien = sql_getfetsel('mots_arborescents', 'spip_groupes_mots', 'id_groupe=' . intval($id_groupe));
$flux['data']['mots_arborescents'] = $mots_arborescents;
if ($mots_arborescents_ancien != $mots_arborescents) {
// pour le pipeline de post_edition. Permet entre autre de savoir
// qu'il faudra actualiser les mots de la branche
set_request('motsar_definir_heritages', true);
set_request('motsar_definir_heritages', $id_groupe);
}
}
}
@ -430,38 +354,11 @@ function motsar_post_edition($flux) {
return $flux;
}
// lors de l'édition d'un mot
if ($flux['args']['table'] == 'spip_mots' and $flux['args']['action'] == 'modifier') {
$id_mot = $flux['args']['id_objet'];
// soit le parent a change, soit le mot racine est modifie
if (_request('motsar_definir_heritages') OR empty($flux['data']['id_parent'])) {
include_spip('motsar_fonctions');
motsar_definir_heritages_mot($id_mot);
propager_les_mots_arborescents();
}
}
// lors de l'institution d'un mot (définition du groupe de mot)
elseif ($flux['args']['table'] == 'spip_mots' and $flux['args']['action'] == 'instituer') {
// si le groupe de mot d'appartenance a changé
if ($id_groupe = _request('motsar_definir_heritages_groupe')) {
$id_mot = $flux['args']['id_objet'];
include_spip('motsar_fonctions');
// redifinir les id_groupe de tous ses enfants
motsar_definir_heritages_mot($id_mot);
// peut être applatir les enfants, si le groupe n'autorise pas les mots arborescents
motsar_definir_heritages($id_groupe);
// recalculer les profondeurs et racines…
propager_les_mots_arborescents();
}
}
// lors de l'édition d'un groupe de mot
elseif ($flux['args']['table'] == 'spip_groupes_mots' and $flux['args']['action'] == 'modifier'
if ($flux['args']['table'] == 'spip_groupes_mots'
// si la configuration mots_arborescents a été modifiée
and _request('motsar_definir_heritages'))
{
and _request('motsar_definir_heritages') == $flux['args']['id_objet']) {
$id_groupe = $flux['args']['id_objet'];
include_spip('motsar_fonctions');
motsar_definir_heritages($id_groupe);

@ -18,7 +18,7 @@
<licence>GNU/GPL</licence>
<necessite nom="saisies" compatibilite="[3.54.10;]" />
<necessite nom="mots" compatibilite="[2.8.10;]" />
<necessite nom="mots" compatibilite="[3.0.0;]" />
<!-- necessite nom="querypath" compatibilite="[1.1.1;]" / -->
<pipeline nom="autoriser" inclure="motsar_autorisations.php" />

Loading…
Cancel
Save