Changeset 122373 in spip-zone


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

ajout d'un flag modif_synchro_source en base pour pouvoir gerer la mise ajour synchro d'un evenement et de ses repetitions - le flag vaut 1 par defaut, donc rien ne change pour le moment
+ refactoring dans action/editer_evenement pour nettoyer le code et prendre en compte ce flag

Location:
_plugins_/agenda/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/agenda/trunk

    • Property subgit:lock:131d2341cf41b2d419f6534ec054201697434db3 deleted
    • Property subgit:lock:5b29bb5d808b3238a508e4f5278d9c592dbc56f0 set to 2020-02-11T18:13:11.576
  • _plugins_/agenda/trunk/action/editer_evenement.php

    r122361 r122373  
    2727        if (!$id_evenement = intval($arg)) {
    2828                $id_parent = _request('id_parent');
    29                 if (!$id_evenement = agenda_action_insert_evenement($id_parent)) {
     29                if (!$id_evenement = evenement_inserer($id_parent)) {
    3030                        return array(false,_L('echec'));
    3131                }
    3232        }
    3333
    34         $err = action_evenement_set($id_evenement);
     34        $err = evenement_modifier($id_evenement);
    3535        return array($id_evenement,$err);
    3636}
     
    4040 *
    4141 * @param int $id_article
    42  * @param int $id_evenement_source
     42 * @param array $set
    4343 * @return int
    4444 */
    45 function evenement_inserer($id_article, $id_evenement_source = 0) {
     45function evenement_inserer($id_article, $set=null) {
    4646        include_spip('inc/autoriser');
    4747        if (!autoriser('creerevenementdans', 'article', $id_article)) {
     
    5050        }
    5151
    52         $champs = array(
    53                 'id_evenement_source' => intval($id_evenement_source),
    54                 'id_article'=>intval($id_article),
    55                 'statut' => 'prop',
    56         );
     52        // support pour l'ancien format avec $id_evenement_source en second argument
     53        if (is_scalar($set) and intval($set)) {
     54                $set = array(
     55                        'id_evenement_source' => intval($set),
     56                );
     57        }
     58
     59        $champs = array();
     60        if ($set and is_array($set)) {
     61                $champs = $set;
     62        }
     63        $champs['id_article'] = intval($id_article);
     64        if (empty($champs['statut'])) {
     65                $champs['statut'] = 'prop';
     66        }
    5767
    5868        // Envoyer aux plugins
     
    168178function agenda_action_update_repetitions($id_evenement, $repetitions) {
    169179        // evenement source
    170         if ($row = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement))) {
     180        if ($row_source = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement))) {
    171181                // Si ce n'est pas un événement source, on n'a rien à faire ici
    172                 if ($row['id_evenement_source'] != 0) {
     182                if ($row_source['id_evenement_source'] != 0) {
    173183                        return;
    174184                }
     
    181191                        array('id_evenement', 'id_evenement_source'),
    182192                        // donnees fournies
    183                         $row
     193                        $row_source
    184194                );
    185195
    186196                // Savoir si la source était publiée ou pas
    187                 $publie = ($row['statut'] == 'publie');
     197                $publie = ($row_source['statut'] == 'publie');
    188198
    189199                // On calcule la durée en secondes de l'événement source pour la reporter telle quelle aux répétitions
    190                 $date_debut = strtotime($row['date_debut']);
    191                 $date_fin = strtotime($row['date_fin']);
     200                $date_debut = strtotime($row_source['date_debut']);
     201                $date_fin = strtotime($row_source['date_fin']);
    192202                $duree = $date_fin - $date_debut;
    193203
    194204                $repetitions_updated = array();
    195                 // mettre a jour toutes les repetitions deja existantes ou les supprimer si plus lieu
    196                 $res = sql_select('id_evenement,date_debut', 'spip_evenements', 'id_evenement_source='.intval($id_evenement));
     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));
    197207                while ($row = sql_fetch($res)) {
    198208                        $date = strtotime(date('Y-m-d', strtotime($row['date_debut'])));
    199209                        if (in_array($date, $repetitions)) {
    200                                 // Cette répétition existe déjà, on la met à jour
     210                                // Cette répétition existe déjà
    201211                                $repetitions_updated[] = $date;
    202212
    203                                 // On calcule les nouvelles dates/heures en reportant la durée de la source
    204                                 $update_date_debut = date('Y-m-d', $date).' '.date('H:i:s', $date_debut);
    205                                 $update_date_fin = date('Y-m-d H:i:s', strtotime($update_date_debut)+$duree);
    206 
    207                                 // Seules les dates sont changées dans les champs de la source
    208                                 // TODO : prendre en charge la mise a jour uniquement si conforme a l'original
    209                                 $c['date_debut'] = $update_date_debut;
    210                                 $c['date_fin'] = $update_date_fin;
    211                                 // mettre a jour l'evenement
    212                                 evenement_modifier(
    213                                         $row['id_evenement'],
    214                                         $c
    215                                 );
     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']){
     216                                        // On calcule les nouvelles dates/heures en reportant la durée de la source
     217                                        $update_date_debut = date('Y-m-d', $date) . ' ' . date('H:i:s', $date_debut);
     218                                        $update_date_fin = date('Y-m-d H:i:s', strtotime($update_date_debut)+$duree);
     219
     220                                        // 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                                        );
     228                                }
    216229                        } else {
    217                                 // il est supprime
    218                                 sql_delete('spip_evenements', 'id_evenement='.$row['id_evenement']);
     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                                }
    219234                        }
    220235                }
    221236
    222                 // regarder les repetitions a ajouter
     237                // regarder les repetitions a ajouter qui sont du coup dupliquees depuis la source
    223238                foreach ($repetitions as $date) {
    224239                        if (!in_array($date, $repetitions_updated)) {
     
    230245                                $c['date_debut'] = $update_date_debut;
    231246                                $c['date_fin'] = $update_date_fin;
     247                                $c['id_evenement_source'] = $id_evenement;
    232248
    233249                                // On crée la nouvelle répétition
    234                                 if ($id_evenement_new = agenda_action_insert_evenement($c['id_article'], $id_evenement)) {
    235                                         // Si c'est bon, on ajoute tous les champs
    236                                         sql_updateq(
    237                                                 'spip_evenements',
    238                                                 $c,
    239                                                 'id_evenement = '.$id_evenement_new
    240                                         );
    241 
     250                                if ($id_evenement_new = evenement_inserer($c['id_article'], $c)) {
    242251                                        // Pour les créations il ne faut pas oublier de dupliquer les liens
    243252                                        // En effet, sinon les documents insérés avant la création (0-id_auteur) ne seront pas dupliqués
     
    380389        return ''; // pas d'erreur
    381390}
    382 
    383 /*
    384 function agenda_action_supprime_repetitions($supp_evenement){
    385         $res = sql_select("id_evenement", "spip_evenements", "id_evenement_source=".intval($supp_evenement));
    386         while ($row = sql_fetch($res)){
    387                 $id_evenement = $row['id_evenement'];
    388                 sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
    389         }
    390 }
    391 */
    392 /*
    393 function agenda_action_supprime_evenement($id_article,$supp_evenement){
    394         $id_evenement = sql_getfetsel("id_evenement", "spip_evenements", array(
    395                 "id_article=" . intval($id_article),
    396                 "id_evenement=" . intval($supp_evenement)));
    397         if (intval($id_evenement) AND $id_evenement == $supp_evenement){
    398                 sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
    399                 agenda_action_supprime_repetitions($id_evenement);
    400         }
    401         include_spip('inc/invalideur');
    402         suivre_invalideur("article/$id_article");
    403         $id_evenement = 0;
    404         return $id_evenement;
    405 }*/
    406 
    407 
    408 function agenda_action_insert_evenement($id_article, $id_evenement_source = 0) {
    409         return evenement_inserer($id_article, $id_evenement_source);
    410 }
    411 function action_evenement_set($id_evenement, $set = null) {
    412         return evenement_modifier($id_evenement, $set);
    413 }
    414 function agenda_action_instituer_evenement($id_evenement, $c) {
    415         return evenement_instituer($id_evenement, $c);
    416 }
  • _plugins_/agenda/trunk/agenda_administrations.php

    r122372 r122373  
    9494                array('sql_alter', 'TABLE spip_evenements ADD timezone_affiche varchar(255) NOT NULL DEFAULT \'\''),
    9595        );
     96
    9697        $maj['1.0.1'] = array(
    9798                array('agenda_corrige_heure_evenements_journee'),
     99        );
     100
     101        $maj['1.0.2'] = array(
     102                array('sql_alter', 'TABLE spip_evenements ADD modif_synchro_source tinyint(1) DEFAULT 1 NOT NULL'),
    98103        );
    99104
  • _plugins_/agenda/trunk/base/agenda_evenements.php

    r122361 r122373  
    9999                        'horaire' => "varchar(3) DEFAULT 'oui' NOT NULL",
    100100                        'id_evenement_source'   => 'bigint(21) NOT NULL',
     101                        'modif_synchro_source'  => 'tinyint(1) DEFAULT 1 NOT NULL',
    101102                        'statut'        => "varchar(10) DEFAULT '0' NOT NULL",
    102103                        'maj'   => 'TIMESTAMP',
  • _plugins_/agenda/trunk/paquet.xml

    r122372 r122373  
    66        compatibilite="[3.2.0;3.3.*]"
    77        logo="prive/themes/spip/images/evenement-32.png"
    8         schema="1.0.1"
     8        schema="1.0.2"
    99        documentation="https://contrib.spip.net/article2858"
    1010>
Note: See TracChangeset for help on using the changeset viewer.