source: spip-zone/_plugins_/periodes/trunk/inc/periode_verifier.php @ 114048

Last change on this file since 114048 was 114048, checked in by abelass@…, 2 years ago

plugin qui permet de gérér des périodes, utilisé par exemple par prix_objets_periodes

File size: 4.8 KB
Line 
1<?php
2/**
3 * Fonctions relatives  au Plugin Périodes
4 *
5 * @plugin     Périodes
6 * @copyright  2019
7 * @author     Rainer Müller
8 * @licence    GNU/GPL v3
9 * @package    SPIP\Periodes\Fonctions
10 */
11
12// Sécurité
13if (!defined('_ECRIRE_INC_VERSION'))
14        return;
15
16/**
17 * Détermine si la date4_debut et la date_fin correspondent à une période
18 *
19 * @param integer $id_periode
20 * @param array $contexte
21 * @return boolean
22 */
23function inc_periode_verifier_dist($id_periode, $contexte = array()) {
24        $date = date('Y-m-d H:s:m', time());
25        $date_debut_contexte = isset($contexte['date_debut']) ?
26                $contexte['date_debut'] :
27                (_request('date_debut') ?
28                        _request('date_debut') :
29                        $date
30                );
31
32        $date_fin_contexte = isset($contexte['date_fin']) ?
33                $contexte['date_fin'] :
34                (
35                        _request('date_fin') ?
36                        _request('date_fin') :
37                        $date
38                );
39        $applicable = FALSE;
40
41        $donnees_periode = sql_fetsel('*', 'spip_periodes', 'id_periode=' . $id_periode);
42
43        $type = trim($donnees_periode['type']);
44        $criteres = $donnees_periode['criteres'];
45        $operateur = !empty($donnees_periode['operateur']) ? $donnees_periode['operateur'] : '==';
46        $operateur_2 = !empty($donnees_periode['operateur_2']) ? $donnees_periode['operateur_2'] : '==';
47
48        // Si date complète, on prend les dates tel que enrregistrés
49        if ($donnees_periode['date_complete'] == 'oui') {
50                $date_debut_periode = $donnees_periode['date_debut'];
51                $date_fin_periode = $donnees_periode['date_fin'];
52        }
53        // Sinon on complète les bouts manquants avec les données de la date actuelle.
54        else {
55                $date_debut_jour = $donnees_periode['date_debut_jour'] ? $donnees_periode['date_debut_jour'] : date('d');
56                $date_debut_mois = $donnees_periode['date_debut_mois'] ? $donnees_periode['date_debut_mois'] : date('m');
57                $date_debut_annee = $donnees_periode['date_debut_annee'] ? $donnees_periode['date_debut_annee'] : date('Y');
58                $date_fin_jour = $donnees_periode['date_fin_jour'] ? $donnees_periode['date_fin_jour'] : date('d');
59                $date_fin_mois = $donnees_periode['date_fin_mois'] ? $donnees_periode['date_fin_mois'] : date('m');
60                $date_fin_annee = $donnees_periode['date_fin_annee'] ? $donnees_periode['date_fin_annee'] : date('Y');
61                $date_debut_periode = date('Y-m-d H:i:s', strtotime("$date_debut_annee-$date_debut_mois-$date_debut_jour 00:00:00"));
62                $date_fin_periode = date('Y-m-d H:i:s', strtotime("$date_fin_annee-$date_fin_mois-$date_fin_jour 00:00:00"));
63        }
64
65        switch ($type) {
66                case 'date':
67                        switch ($criteres) {
68                                case 'coincide' :
69
70                                        if (($date_debut_contexte <= $date_fin_periode) and ($date_fin_contexte >= $date_debut_periode)) {
71                                                $applicable = TRUE;
72                                        }
73                                        break;
74                                case 'exclu' :
75                                        if (($date_debut_contexte > $date_fin_periode) or ($date_fin_contexte < $date_debut_periode)) {
76                                                $applicable = TRUE;
77                                        }
78                                        break;
79                                case 'specifique' :
80                                        if(periodes_condition($date_debut_contexte, $operateur, $date_debut_periode) and
81                                        periodes_condition($date_fin_contexte, $operateur_2, $date_fin_periode)) {
82                                                        $applicable = TRUE;
83                                                }
84                                        break;
85                        }
86                        break;
87                case 'jour_semaine':
88                        $jour_debut_periode = $donnees_periode['jour_debut'];
89                        $jour_fin_periode = $donnees_periode['jour_fin'];
90                        $jour_debut_contexte = date('w', strtotime($date_debut_contexte));
91                        $jour_fin_contexte = date('w', strtotime($date_fin_contexte));
92                        $dates_periode = [];//array($jour_debut_periode, $jour_fin_periode);
93                        if ($jour_fin_periode == 0) {
94                                $jour_fin_periode = 7;
95                        }
96
97                        $i = $jour_debut_periode;
98                        while ($i <= $jour_fin_periode) {
99                                $jour = $i;
100                                if ($jour == 7) {
101                                        $jour = 0;
102                                }
103                                $dates_periode[] = $jour;
104                                $i++;
105                        }
106                        $dates_intervalle = dates_intervalle($date_debut_contexte, $date_fin_contexte, 0, 0, FALSE, 'w');
107                        $coincidences = array_intersect($dates_periode, $dates_intervalle);
108                        switch ($criteres) {
109                                case 'coincide' :
110                                        if(count($coincidences) > 0) {
111                                                $applicable = TRUE;
112                                        }
113                                        break;
114                                case 'exclu' :
115                                        if(count($coincidences) == 0) {
116                                                $applicable = TRUE;
117                                        }
118                                        break;
119                                case 'specifique' :
120                                        if($jour_debut_contexte == $jour_debut_periode and
121                                                $jour_fin_contexte == $jour_fin_periode) {
122                                                $applicable = TRUE;
123                                        }
124                                        break;
125                        }
126                        break;
127                case 'jour_nombre':
128                        include_spip('filtres/dates_outils');
129                        $nombre_jours_contexte = dates_difference($date_debut_contexte, $date_fin_contexte, 'jour');
130                        if ($nombre_jours_contexte >= 0) {
131                                if (periodes_condition($nombre_jours_contexte, $operateur, $donnees_periode['jour_nombre'])) {
132                                        $applicable = TRUE;
133                                }
134                        }
135
136                        break;
137        }
138
139        return $applicable;
140}
141
142
143function periodes_condition($var1, $op, $var2) {
144
145        switch ($op) {
146                case "=":
147                        return $var1 == $var2;
148                case "!=":
149                        return $var1 != $var2;
150                case ">=":
151                        return $var1 >= $var2;
152                case "<=":
153                        return $var1 <= $var2;
154                case ">":
155                        return $var1 >  $var2;
156                case "<":
157                        return $var1 <  $var2;
158                default:
159                        return true;
160        }
161}
Note: See TracBrowser for help on using the repository browser.