Changeset 122376 in spip-zone


Ignore:
Timestamp:
Feb 11, 2020, 5:13:05 PM (8 days ago)
Author:
Cerdic
Message:

gestion de la modification d'un evenement avec repetition : avertissement, et propagation aux repetitions filles/soeurs ou non selon l'option qu'on choisit
Quand on edite une repetition et qu'on modifie les dates :

  • si on garde le lien (modifier toutes les occurences) ca ne propage pas les modifs de date (ca serait trop chaud a gerer), et donc une modif du master ou d'un autre evenement ecrasera a nouveau les modifs de date
  • si on casse le lien les modifs de date se font et seront conservees par la suite
Location:
_plugins_/agenda/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/agenda/trunk

    • Property subgit:lock:fb7bd22db5bbc304777ce866c345dd3deee688a1 deleted
    • Property subgit:lock:d3c9406bb33c6b8ebdea43244d529925c7411135 set to 2020-02-11T18:13:14.227
  • _plugins_/agenda/trunk/action/editer_evenement.php

    r122373 r122376  
    103103 * @param int $id_evenement
    104104 * @param array $set
     105 * @param bool $propagate
    105106 * @return bool|string
    106107 */
    107 function evenement_modifier($id_evenement, $set = null) {
     108function evenement_modifier($id_evenement, $set = null, $propagate=true) {
    108109
    109110        include_spip('inc/modifier');
     
    140141        }
    141142
    142         if (!is_null($repetitions = _request('repetitions', $set))) {
    143                 agenda_action_revision_evenement_repetitions($id_evenement, $repetitions);
    144         }
     143        if ($propagate) {
     144                if (!is_null($repetitions = _request('repetitions', $set))) {
     145                        evenement_modifier_repetitions_filles($id_evenement, $repetitions);
     146                }
     147                else {
     148                        evenement_modifier_repetitions_soeurs($id_evenement);
     149                }
     150        }
     151
    145152        // Modification de statut, changement de parent ?
    146153        $c = collecter_requests(array('statut', 'id_parent'), array(), $set);
     
    171178}
    172179
    173 function agenda_action_revision_evenement_repetitions($id_evenement, $repetitions = '') {
    174         $rep = agenda_recup_repetitions($repetitions);
    175         agenda_action_update_repetitions($id_evenement, $rep);
    176 }
    177 
    178 function agenda_action_update_repetitions($id_evenement, $repetitions) {
    179         // evenement source
    180         if ($row_source = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement))) {
     180/**
     181 * Propager les modifs d'un evenement a ses repetitions filles
     182 * @param int $id_evenement
     183 * @param string $repetitions
     184 */
     185function evenement_modifier_repetitions_filles($id_evenement, $repetitions = '') {
     186        if ($row_source = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement))){
    181187                // Si ce n'est pas un événement source, on n'a rien à faire ici
    182                 if ($row_source['id_evenement_source'] != 0) {
     188                if ($row_source['id_evenement_source']!=0){
    183189                        return;
    184190                }
    185 
    186                 // On ne garde que les données correctes pour une modification
     191                $reps = agenda_recup_repetitions($repetitions);
     192
     193                // On ne garde que les données correctes pour une modification à propager
    187194                $c = collecter_requests(
    188                         // white list
     195                // white list
    189196                        objet_info('evenement', 'champs_editables'),
    190197                        // black list
    191                         array('id_evenement', 'id_evenement_source'),
     198                        array('id_evenement', 'id_evenement_source', 'modif_synchro_source'),
    192199                        // donnees fournies
    193200                        $row_source
    194201                );
    195202
    196                 // Savoir si la source était publiée ou pas
    197                 $publie = ($row_source['statut'] == 'publie');
    198 
    199                 // On calcule la durée en secondes de l'événement source pour la reporter telle quelle aux répétitions
    200                 $date_debut = strtotime($row_source['date_debut']);
    201                 $date_fin = strtotime($row_source['date_fin']);
     203                agenda_action_update_repetitions($id_evenement, $row_source['modif_synchro_source'], $c , $reps);
     204        }
     205}
     206
     207/**
     208 * Propager les modifs d'un evenement a ses repetitions soeurs et a sa mere
     209 * @param int $id_evenement
     210 */
     211function evenement_modifier_repetitions_soeurs($id_evenement) {
     212        if ($row = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement))){
     213                // Si ce n'est pas une repetition, on n'a rien à faire ici
     214                if ($row['id_evenement_source']==0){
     215                        return;
     216                }
     217                // si on est plus synchro avec les autres, ne rien faire
     218                if ($row['modif_synchro_source']==0){
     219                        return;
     220                }
     221
     222                // On ne garde que les données correctes pour une modification à propager
     223                $c = collecter_requests(
     224                // white list
     225                        objet_info('evenement', 'champs_editables'),
     226                        // black list
     227                        array('id_evenement', 'id_evenement_source', 'modif_synchro_source', 'date_debut', 'date_fin', 'horaire', 'timezone_affiche'),
     228                        // donnees fournies
     229                        $row
     230                );
     231
     232                agenda_action_update_repetitions($row['id_evenement_source'], true, $c);
     233                $row_source = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($row['id_evenement_source']));
     234                if ($row_source['modif_synchro_source']) {
     235                        evenement_modifier($row_source['id_evenement'], $c, false);
     236                }
     237        }
     238}
     239
     240
     241function agenda_action_update_repetitions($id_evenement_source, $modif_flag, $set, $repetitions=null) {
     242
     243        $date_debut = $date_fin = $duree = null;
     244
     245        // On calcule la durée en secondes de l'événement source pour la reporter telle quelle aux répétitions
     246        if (isset($set['date_debut']) and isset($set['date_fin'])) {
     247                $date_debut = strtotime($set['date_debut']);
     248                $date_fin = strtotime($set['date_fin']);
    202249                $duree = $date_fin - $date_debut;
    203 
    204                 $repetitions_updated = array();
    205                 // mettre a jour toutes les repetitions *avec le flag modif_synchro_source=1* deja existantes ou les supprimer si il n'y a plus lieu
    206                 $res = sql_select('id_evenement,date_debut,modif_synchro_source', 'spip_evenements', 'id_evenement_source='.intval($id_evenement));
    207                 while ($row = sql_fetch($res)) {
    208                         $date = strtotime(date('Y-m-d', strtotime($row['date_debut'])));
    209                         if (in_array($date, $repetitions)) {
    210                                 // Cette répétition existe déjà
    211                                 $repetitions_updated[] = $date;
    212 
    213                                 // si besoin on la met a jour
    214                                 // cad si le flag modif_synchro_source vaut 1 sur l'evenement source ET destination
    215                                 if ($row_source['modif_synchro_source'] and $row['modif_synchro_source']){
     250        }
     251        unset($set['date_debut']);
     252        unset($set['date_fin']);
     253
     254        $repetitions_updated = array();
     255        // mettre a jour toutes les repetitions *avec le flag modif_synchro_source=1* deja existantes ou les supprimer si il n'y a plus lieu
     256        $res = sql_select('id_evenement,date_debut,modif_synchro_source', 'spip_evenements', 'id_evenement_source='.intval($id_evenement_source));
     257        while ($row = sql_fetch($res)) {
     258                $date = strtotime(date('Y-m-d', strtotime($row['date_debut'])));
     259                if (is_null($repetitions) or in_array($date, $repetitions)) {
     260                        // Cette répétition existe déjà
     261                        $repetitions_updated[] = $date;
     262
     263                        // si besoin on la met a jour
     264                        // cad si le flag modif_synchro_source vaut 1 sur l'evenement source ET destination
     265                        if ($modif_flag and $row['modif_synchro_source']){
     266                                if (!is_null($date_debut)) {
    216267                                        // On calcule les nouvelles dates/heures en reportant la durée de la source
    217268                                        $update_date_debut = date('Y-m-d', $date) . ' ' . date('H:i:s', $date_debut);
     
    219270
    220271                                        // Seules les dates sont changées dans les champs de la source
    221                                         $c['date_debut'] = $update_date_debut;
    222                                         $c['date_fin'] = $update_date_fin;
    223                                         // mettre a jour l'evenement
    224                                         evenement_modifier(
    225                                                 $row['id_evenement'],
    226                                                 $c
    227                                         );
     272                                        $set['date_debut'] = $update_date_debut;
     273                                        $set['date_fin'] = $update_date_fin;
    228274                                }
    229                         } else {
    230                                 // il est supprime *si* modif_synchro_source vaut 1
    231                                 if ($row['modif_synchro_source']) {
    232                                         sql_delete('spip_evenements', 'id_evenement='.intval($row['id_evenement']));
    233                                 }
     275                                // mettre a jour l'evenement
     276                                evenement_modifier($row['id_evenement'], $set, false);
    234277                        }
    235                 }
    236 
     278                } else {
     279                        // il est supprime *si* modif_synchro_source vaut 1
     280                        if ($row['modif_synchro_source']) {
     281                                sql_delete('spip_evenements', 'id_evenement='.intval($row['id_evenement']));
     282                        }
     283                }
     284        }
     285
     286        if (!is_null($repetitions)) {
    237287                // regarder les repetitions a ajouter qui sont du coup dupliquees depuis la source
    238288                foreach ($repetitions as $date) {
     
    245295                                $c['date_debut'] = $update_date_debut;
    246296                                $c['date_fin'] = $update_date_fin;
    247                                 $c['id_evenement_source'] = $id_evenement;
     297                                $c['id_evenement_source'] = $id_evenement_source;
    248298
    249299                                // On crée la nouvelle répétition
     
    252302                                        // En effet, sinon les documents insérés avant la création (0-id_auteur) ne seront pas dupliqués
    253303                                        include_spip('action/editer_liens');
    254                                         objet_dupliquer_liens('evenement', $id_evenement, $id_evenement_new);
     304                                        objet_dupliquer_liens('evenement', $id_evenement_source, $id_evenement_new);
    255305                                }
    256306                        }
  • _plugins_/agenda/trunk/base/agenda_evenements.php

    r122373 r122376  
    8484                'date' => 'date_debut',
    8585                'principale' => 'oui',
    86                 'champs_editables' => array('date_debut', 'date_fin', 'timezone_affiche', 'titre', 'descriptif','lieu', 'adresse', 'inscription', 'places', 'horaire'),
     86                'champs_editables' => array('date_debut', 'date_fin', 'timezone_affiche', 'titre', 'descriptif','lieu', 'adresse', 'inscription', 'places', 'horaire', 'modif_synchro_source'),
    8787                'field'=> array(
    8888                        'id_evenement'  => 'bigint(21) NOT NULL',
  • _plugins_/agenda/trunk/formulaires/editer_evenement.html

    r122375 r122376  
    111111                        </div>]
    112112                </div>
     113                [(#ENV{modif_synchro_source}|=={0}|oui)
     114                <div class="warning">
     115                        <:agenda:info_evenement_modif_synchro_source_non:>
     116                </div>
     117                ]
    113118                [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
    114119                <!--extra-->
  • _plugins_/agenda/trunk/lang/agenda_fr.php

    r122375 r122376  
    3333        'confirm_suppression_inscription_toutes' => 'Voulez-vous vraiment supprimer toutes les inscriptions ?',
    3434        'confirm_evenement_modifie_a_des_repetitions' => 'Vous avez modifié cet événement qui a des répétitions :',
    35         'confirm_evenement_modifie_est_une_repetition' => 'Vous avez modifié cet événement qui fait partie d\'une série répétitions :',
     35        'confirm_evenement_modifie_est_une_repetition' => 'Vous avez modifié cet événement qui fait partie d\'une série de répétitions :',
    3636        'connexion_necessaire_pour_inscription' => 'Merci de vous connecter pour pouvoir vous inscrire à cet événement.',
    3737        'creer_evenement' => 'Créer un événement',
     
    9999        'info_evenements_publie' => 'Publiés',
    100100        'info_evenement_repetition' => 'Cet événement est une répétition',
     101        'info_evenement_modif_synchro_source_non' => 'Les modifications de cet événement n\'impacteront pas les autres occurences',
    101102        'info_evenements_tout' => 'Tous les événements',
    102103        'info_inscription' => 'Inscription en ligne :',
Note: See TracChangeset for help on using the changeset viewer.