Browse Source

Gestion du statut des repetitions : par defaut interdit de le modifier et c'est le statut de la repetition source qui s'applique, sauf si on desynchronise l'evenement, auquel cas on peut ensuite le publier/depublier independamment

pull/7/head
Cerdic 1 year ago
parent
commit
56a8f752a2
7 changed files with 77 additions and 15 deletions
  1. +15
    -2
      action/editer_evenement.php
  2. +26
    -0
      action/separer_evenement_repetition.php
  3. +17
    -7
      agenda_autoriser.php
  4. +10
    -4
      agenda_pipelines.php
  5. +1
    -0
      lang/agenda_fr.php
  6. +1
    -1
      paquet.xml
  7. +7
    -1
      prive/objets/infos/evenement.html

+ 15
- 2
action/editer_evenement.php View File

@ -326,6 +326,7 @@ function evenement_instituer($id_evenement, $c) {
$row = sql_fetsel('id_article, statut', 'spip_evenements', 'id_evenement='.intval($id_evenement));
$id_parent = $id_parent_ancien = $row['id_article'];
$statut = $statut_ancien = $row['statut'];
$propager_statut_toutes_repetitions = false;
$champs = array();
@ -360,11 +361,13 @@ function evenement_instituer($id_evenement, $c) {
case 'poubelle':
// si article a la poubelle, evenement aussi
$champs['statut'] = $statut = 'poubelle';
$propager_statut_toutes_repetitions = true;
break;
default:
// pas de publie ni 0 si article pas publie
if (in_array($statut, array('publie','0'))) {
$champs['statut'] = $statut = 'prop';
$propager_statut_toutes_repetitions = true;
}
break;
}
@ -374,6 +377,7 @@ function evenement_instituer($id_evenement, $c) {
// on met en propose
if ($statut=='0') {
$champs['statut'] = $statut = 'prop';
$propager_statut_toutes_repetitions = true;
}
if (isset($c['statut'])
@ -407,11 +411,20 @@ function evenement_instituer($id_evenement, $c) {
return;
}
// Envoyer les modifs sur l'evenement et toutes ses repetitons
$ids = array_map('reset', sql_allfetsel('id_evenement', 'spip_evenements', 'id_evenement_source='.intval($id_evenement)));
// Envoyer les modifs sur l'evenement et toutes ses repetitons synchro
$ids = sql_allfetsel('id_evenement', 'spip_evenements', 'modif_synchro_source=1 and id_evenement_source='.intval($id_evenement));
$ids = array_column($ids, 'id_evenement');
$ids[] = intval($id_evenement);
sql_updateq('spip_evenements', $champs, sql_in('id_evenement', $ids));
// et les eventuelles propagations aux repetitions non synchro
if (!empty($champs['id_article'])) {
sql_updateq('spip_evenements', ['id_article' => $champs['id_article']], 'modif_synchro_source=0 and id_evenement_source='.intval($id_evenement));
}
if (!empty($champs['statut']) and $propager_statut_toutes_repetitions) {
sql_updateq('spip_evenements', ['statut' => $champs['statut']], 'modif_synchro_source=0 and id_evenement_source='.intval($id_evenement));
}
// Invalider les caches
include_spip('inc/invalideur');
suivre_invalideur("id='id_article/$id_parent_ancien'");


+ 26
- 0
action/separer_evenement_repetition.php View File

@ -0,0 +1,26 @@
<?php
/**
* Plugin Agenda 4 pour Spip 3.0
* Licence GPL 3
*
* 2006-2011
* Auteurs : cf paquet.xml
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function action_separer_evenement_repetition_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$id_evenement = intval($securiser_action());
// A-t-on vraiment le droit de modifier la rubrique en question ?
if ($id_evenement
and autoriser('modifier', 'evenement', $id_evenement)) {
include_spip('action/editer_evenement');
evenement_modifier($id_evenement, array('modif_synchro_source' => 0));
}
}

+ 17
- 7
agenda_autoriser.php View File

@ -103,18 +103,28 @@ function autoriser_evenement_modifier_dist($faire, $quoi, $id, $qui, $options) {
* @return bool
*/
function autoriser_evenement_instituer_dist($faire, $quoi, $id, $qui, $options) {
$evenement = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id));
if (!$evenement) {
return false;
}
// on ne modifie pas independamment le statut d'un evenement repetition qui reste synchro sur l'evenement source
if ($evenement['id_evenement_source']!=0
and $evenement['modif_synchro_source']) {
return false;
}
if (!isset($options['id_article']) or !$id_article=$options['id_article']) {
$id_article = sql_getfetsel('id_article', 'spip_evenements', 'id_evenement='.intval($id));
$id_article = $evenement['id_article'];
}
if (!$id_article) {
return false;
}
$statut = sql_getfetsel('statut', 'spip_articles', 'id_article='.intval($id_article));
// interdit de publier un evenement sur un article non publie
if ($statut!=='publie'
and isset($options['statut'])
and $options['statut']=='publie') {
return false;
if (isset($options['statut'])) {
$statut = sql_getfetsel('statut', 'spip_articles', 'id_article='.intval($id_article));
// interdit de publier un evenement sur un article non publie
if ($statut!=='publie'
and $options['statut']=='publie') {
return false;
}
}
$options['id_article'] = $id_article;
return autoriser('modifier', 'evenement', $id, $qui, $options);


+ 10
- 4
agenda_pipelines.php View File

@ -180,32 +180,38 @@ function agenda_post_edition($flux) {
and $statut != $statut_ancien
and lire_config('agenda/synchro_statut', 1)) {
$set = array();
// les evenements principaux, associes a cet article
$where = array('id_article='.intval($id_article),'id_evenement_source=0');
// les evenements de cet article
$where = array('id_article='.intval($id_article));
switch ($statut) {
case 'poubelle':
// on passe aussi tous les evenements associes a la poubelle, sans distinction
$set['statut'] = 'poubelle';
break;
case 'publie':
// on passe aussi tous les evenements prop en publie
// on passe aussi tous les evenements principaux prop en publie
// (sera repercute sur les repetitions synchro automatiquement)
$set['statut'] = 'publie';
$where[] = "id_evenement_source=0";
$where[] = "statut='prop'";
break;
default:
if ($statut_ancien=='publie') {
// on depublie aussi tous les evenements publie
// on depublie aussi tous les evenements source publie
$set['statut'] = 'prop';
$where[] = "id_evenement_source=0";
$where[] = "statut='publie'";
}
break;
}
if (count($set)) {
include_spip('action/editer_evenement');
$res = sql_select('id_evenement', 'spip_evenements', $where);
// et on applique a tous les evenements lies a l'article
while ($row = sql_fetch($res)) {
autoriser_exception('instituer', 'evenement', $row['id_evenement']);
evenement_modifier($row['id_evenement'], $set);
autoriser_exception('instituer', 'evenement', $row['id_evenement'], false);
}
}
}


+ 1
- 0
lang/agenda_fr.php View File

@ -24,6 +24,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// B
'bouton_annuler' => 'Annuler',
'bouton_supprimer' => 'Supprimer',
'bouton_modifier_repetition' => 'Modifier cette répétition',
// C
'cal_par_jour' => 'jour',


+ 1
- 1
paquet.xml View File

@ -1,7 +1,7 @@
<paquet
prefix="agenda"
categorie="date"
version="4.0.5"
version="4.0.6"
etat="test"
compatibilite="[3.2.0;3.3.*]"
logo="prive/themes/spip/images/evenement-32.png"


+ 7
- 1
prive/objets/infos/evenement.html View File

@ -3,7 +3,13 @@
#SET{texte_objet,#VAL{evenement}|objet_info{texte_objet}|_T}
<div class='numero'><:titre_cadre_numero_objet{objet=#GET{texte_objet}}:><p>#ID_EVENEMENT</p></div>
[(#FORMULAIRE_INSTITUER_OBJET{evenement,#ID_EVENEMENT})]
[(#FORMULAIRE_INSTITUER_OBJET{evenement,#ID_EVENEMENT,'',#ID_EVENEMENT_SOURCE|non|ou{#MODIF_SYNCHRO_SOURCE|non}})]
[(#ID_EVENEMENT_SOURCE|et{#MODIF_SYNCHRO_SOURCE})
<div class="center">
[(#BOUTON_ACTION{<:agenda:bouton_modifier_repetition:>,#URL_ACTION_AUTEUR{separer_evenement_repetition,#ID_EVENEMENT,#SELF}})]
</div>
]
[(#REM)


Loading…
Cancel
Save