6e51ffaf9c15c63d436a594048ec17ec910cdfe4
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2017 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
14 * Gestion des drapeaux d'édition
16 * Drapeau d'edition : on regarde qui a ouvert quel objet éditorial en
17 * édition, et on le signale aux autres redacteurs pour éviter de se marcher
20 * Le format est une meta drapeau_edition qui contient un tableau sérialisé
21 * `type_objet => (id_objet => (id_auteur => (nom_auteur => (date_modif))))`
23 * À chaque mise à jour de ce tableau on oublie les enregistrements datant
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)
30 * @package SPIP\Core\Drapeaux\Edition
32 if (!defined('_ECRIRE_INC_VERSION')) {
38 * Retourne le tableau des éléments édités en cours après avoir supprimé
39 * les éléments trop vieux (de plus d'une heure) du tableau.
41 * @uses ecrire_tableau_edition()
44 * Tableau des éléments édités actuellement, par objet et auteur, du type :
45 * `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()`
47 function lire_tableau_edition() {
48 $edition = @unserialize
($GLOBALS['meta']['drapeau_edition']);
54 $bon_pour_le_service = time() - 3600;
55 // parcourir le tableau et virer les vieux
56 foreach ($edition as $objet => $data) {
57 if (!is_array($data)) {
58 unset($edition[$objet]);
61 foreach ($data as $id => $tab) {
62 if (!is_array($tab)) {
63 unset($edition[$objet][$tab]);
66 foreach ($tab as $n => $duo) {
67 if (current($duo) < $bon_pour_le_service) {
68 unset($edition[$objet][$id][$n]);
73 if (!$edition[$objet][$id]) {
74 unset($edition[$objet][$id]);
78 if (!$edition[$objet]) {
79 unset($edition[$objet]);
84 ecrire_tableau_edition($edition);
91 * Enregistre la liste des éléments édités
95 * @param array $edition
96 * Tableau des éléments édités actuellement, par objet et auteur, du type :
97 * `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()`
99 function ecrire_tableau_edition($edition) {
100 ecrire_meta('drapeau_edition', serialize($edition));
104 * Signale qu'un auteur édite tel objet
106 * Si l'objet est non éditable dans l'espace privé, ne pas retenir le signalement
107 * qui correspond à un process unique.
109 * @see lire_tableau_edition()
110 * @see ecrire_tableau_edition()
113 * Identifiant de l'objet
114 * @param array $auteur
115 * Session de l'auteur
116 * @param string $type
119 function signale_edition($id, $auteur, $type = 'article') {
120 include_spip('base/objets');
121 include_spip('inc/filtres');
122 if (objet_info($type, 'editable') !== 'oui') {
126 $edition = lire_tableau_edition();
127 if (isset($auteur['id_auteur']) and $id_a = $auteur['id_auteur']) {
128 $nom = $auteur['nom'];
130 $nom = $id_a = $GLOBALS['ip'];
133 if (!isset($edition[$type][$id]) or !is_array($edition[$type][$id])) {
134 $edition[$type][$id] = array();
136 $edition[$type][$id][$id_a][$nom] = time();
137 ecrire_tableau_edition($edition);
141 * Qui édite mon objet ?
143 * @see lire_tableau_edition()
146 * Identifiant de l'objet
147 * @param string $type
150 * Tableau sous la forme `["id_auteur"]["nom de l'auteur"] = time()`
152 function qui_edite($id, $type = 'article') {
154 $edition = lire_tableau_edition();
156 return empty($edition[$type][$id]) ?
array() : $edition[$type][$id];
160 * Afficher les auteurs ayant édités récemment l'objet.
163 * Identifiant de l'objet
164 * @param string $type
167 * Liste de tableaux `['nom_auteur_modif' => x|y|z, 'date_diff' => n]`
169 function mention_qui_edite($id, $type = 'article') {
170 $modif = qui_edite($id, $type);
171 unset($modif[$GLOBALS['visiteur_session']['id_auteur']]);
175 foreach ($modif as $duo) {
176 $auteurs[] = typo(key($duo));
177 $quand = max($quand, current($duo));
180 // format lie a la chaine de langue 'avis_article_modifie'
182 'nom_auteur_modif' => join(' | ', $auteurs),
183 'date_diff' => ceil((time() - $quand) / 60)
189 * Quels sont les objets en cours d'édition par `$id_auteur` ?
191 * @uses lire_tableau_edition()
193 * @param int $id_auteur
194 * Identifiant de l'auteur
196 * Liste de tableaux `['objet' => x, 'id_objet' => n]`
198 function liste_drapeau_edition($id_auteur) {
199 $edition = lire_tableau_edition();
200 $objets_ouverts = array();
202 foreach ($edition as $objet => $data) {
203 foreach ($data as $id => $auteurs) {
204 if (isset($auteurs[$id_auteur])
205 and is_array($auteurs[$id_auteur]) // precaution
206 and (array_pop($auteurs[$id_auteur]) > time() - 3600)
208 $objets_ouverts[] = array(
216 return $objets_ouverts;
220 * Quand l'auteur veut libérer tous ses objets (tous types)
222 * @uses lire_tableau_edition()
223 * @uses ecrire_tableau_edition()
225 * @param integer $id_auteur
228 function debloquer_tous($id_auteur) {
229 $edition = lire_tableau_edition();
230 foreach ($edition as $objet => $data) {
231 foreach ($data as $id => $auteurs) {
232 if (isset($auteurs[$id_auteur])) {
233 unset($edition[$objet][$id][$id_auteur]);
234 ecrire_tableau_edition($edition);
241 * Quand l'auteur libère un objet précis
243 * @uses lire_tableau_edition()
244 * @uses ecrire_tableau_edition()
246 * @param integer $id_auteur
247 * Identifiant de l'auteur
248 * @param integer $id_objet
249 * Identifiant de l'objet édité
250 * @param string $type
254 function debloquer_edition($id_auteur, $id_objet, $type = 'article') {
255 $edition = lire_tableau_edition();
257 foreach ($edition as $objet => $data) {
258 if ($objet == $type) {
259 foreach ($data as $id => $auteurs) {
261 and isset($auteurs[$id_auteur])
263 unset($edition[$objet][$id][$id_auteur]);
264 ecrire_tableau_edition($edition);