[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / inc / drapeau_edition.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 // Drapeau d'edition : on regarde qui a ouvert quel objet editorial en
16 // edition, et on le signale aux autres redacteurs pour eviter de se marcher
17 // sur les pieds
18
19 // Le format est une meta drapeau_edition qui contient un tableau
20 // serialise
21 // type_objet => (id_objet => (id_auteur => (nom_auteur => (date_modif))))
22
23 // a chaque mise a jour de ce tableau on oublie les enregistrements datant
24 // de plus d'une heure
25
26 // Attention ce n'est pas un verrou "bloquant", juste un drapeau qui signale
27 // que l'on bosse sur cet objet editorial ; les autres peuvent passer outre
28 // (en cas de communication orale c'est plus pratique)
29
30
31 // http://doc.spip.org/@lire_tableau_edition
32 function lire_tableau_edition () {
33 $edition = @unserialize($GLOBALS['meta']['drapeau_edition']);
34 if (!$edition) return array();
35 $changed = false;
36
37 $bon_pour_le_service = time()-3600;
38 // parcourir le tableau et virer les vieux
39 foreach ($edition as $objet => $data) {
40 if (!is_array($data))
41 unset ($edition[$objet]); // vieille version
42 else foreach ($data as $id => $tab) {
43 if (!is_array($tab))
44 unset ($edition[$objet][$tab]); // vieille version
45 else foreach ($tab as $n => $duo) {
46 if (current($duo) < $bon_pour_le_service) {
47 unset($edition[$objet][$id][$n]);
48 $changed = true;
49 }
50 }
51 if (!$edition[$objet][$id])
52 unset($edition[$objet][$id]);
53 }
54 if (!$edition[$objet])
55 unset($edition[$objet]);
56 }
57
58 if ($changed)
59 ecrire_tableau_edition($edition);
60
61 return $edition;
62 }
63
64 // http://doc.spip.org/@ecrire_tableau_edition
65 function ecrire_tableau_edition($edition) {
66 ecrire_meta('drapeau_edition', serialize($edition));
67 }
68
69 /**
70 * J'edite tel objet
71 * si l'objet est non editable dans l'espace prive, ne pas retenir le signalement
72 * qui correspond a un process unique
73 *
74 * http://doc.spip.org/@signale_edition
75 *
76 * @param int $id
77 * @param $auteur
78 * @param string $type
79 * @return mixed
80 */
81 function signale_edition ($id, $auteur, $type='article') {
82 include_spip('base/objets');
83 include_spip('inc/filtres');
84 if (objet_info($type,'editable')!=='oui')
85 return;
86
87 $edition = lire_tableau_edition();
88 if (isset($auteur['id_auteur']) and $id_a = $auteur['id_auteur'])
89 $nom = $auteur['nom'];
90 else
91 $nom = $id_a = $GLOBALS['ip'];
92 if (!is_array($edition[$type][$id]))
93 $edition[$type][$id] = array();
94 $edition[$type][$id][$id_a][$nom] = time();
95 ecrire_tableau_edition($edition);
96 }
97
98 // Qui edite mon objet ?
99 // http://doc.spip.org/@qui_edite
100 function qui_edite ($id, $type='article') {
101
102 $edition = lire_tableau_edition();
103
104 return $edition ? $edition[$type][$id] : array();
105 }
106
107 // http://doc.spip.org/@mention_qui_edite
108 function mention_qui_edite ($id, $type='article') {
109 $modif = qui_edite($id, $type);
110 unset($modif[$GLOBALS['visiteur_session']['id_auteur']]);
111
112 if ($modif) {
113 $quand = 0;
114 foreach ($modif as $duo) {
115 $auteurs[] = typo(key($duo));
116 $quand = max($quand, current($duo));
117 }
118 // format lie a la chaine de langue 'avis_article_modifie'
119 return array(
120 'nom_auteur_modif' => join(' | ', $auteurs),
121 'date_diff' => ceil((time()-$quand) / 60)
122 );
123 }
124 }
125
126 /**
127 * Quels sont les objets en cours d'edition par X ?
128 *
129 * http://doc.spip.org/@liste_drapeau_edition
130 *
131 * @param $id_auteur
132 * @return array
133 */
134 function liste_drapeau_edition ($id_auteur) {
135 $edition = lire_tableau_edition();
136 $objets_ouverts = array();
137
138 foreach ($edition as $objet => $data)
139 foreach ($data as $id => $auteurs)
140 {
141 if (isset($auteurs[$id_auteur])
142 AND is_array($auteurs[$id_auteur]) // precaution
143 AND (array_pop($auteurs[$id_auteur]) > time()-3600)) {
144 $objets_ouverts[] = array(
145 'objet'=>$objet,
146 'id_objet' => $id,
147 );
148 }
149 }
150 return $objets_ouverts;
151 }
152
153 // Quand l'auteur veut liberer tous ses objets (tous types)
154 // http://doc.spip.org/@debloquer_tous
155 function debloquer_tous($id_auteur) {
156 $edition = lire_tableau_edition();
157 foreach ($edition as $objet => $data) {
158 foreach ($data as $id => $auteurs)
159 {
160 if (isset($auteurs[$id_auteur])) {
161 unset ($edition[$objet][$id][$id_auteur]);
162 ecrire_tableau_edition($edition);
163 }
164 }
165 }
166 }
167
168 // quand l'auteur libere un objet precis
169 // http://doc.spip.org/@debloquer_edition
170 function debloquer_edition($id_auteur, $id_objet, $type='article') {
171 $edition = lire_tableau_edition();
172
173 foreach ($edition as $objet => $data){
174 if ($objet == $type) {
175 foreach ($data as $id => $auteurs)
176 {
177 if ($id == $id_objet
178 AND isset($auteurs[$id_auteur])) {
179 unset ($edition[$objet][$id][$id_auteur]);
180 ecrire_tableau_edition($edition);
181 }
182 }
183 }
184 }
185 }
186 ?>