[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / inc / drapeau_edition.php
index 394a86f..6e51ffa 100644 (file)
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2016                                                *
+ *  Copyright (c) 2001-2017                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-if (!defined('_ECRIRE_INC_VERSION')) return;
-
-// Drapeau d'edition : on regarde qui a ouvert quel objet editorial en 
-// edition, et on le signale aux autres redacteurs pour eviter de se marcher 
-// sur les pieds
-
-// Le format est une meta drapeau_edition qui contient un tableau
-// serialise
-// type_objet => (id_objet => (id_auteur => (nom_auteur => (date_modif))))
-
-// a chaque mise a jour de ce tableau on oublie les enregistrements datant
-// de plus d'une heure
-
-// Attention ce n'est pas un verrou "bloquant", juste un drapeau qui signale
-// que l'on bosse sur cet objet editorial ; les autres peuvent passer outre
-// (en cas de communication orale c'est plus pratique)
+/**
+ * Gestion des drapeaux d'édition
+ *
+ * Drapeau d'edition : on regarde qui a ouvert quel objet éditorial en
+ * édition, et on le signale aux autres redacteurs pour éviter de se marcher
+ * sur les pieds
+ *
+ * Le format est une meta drapeau_edition qui contient un tableau sérialisé
+ * `type_objet => (id_objet => (id_auteur => (nom_auteur => (date_modif))))`
+ *
+ * À chaque mise à jour de ce tableau on oublie les enregistrements datant
+ * de plus d'une heure
+ *
+ * Attention ce n'est pas un verrou "bloquant", juste un drapeau qui signale
+ * que l'on bosse sur cet objet editorial ; les autres peuvent passer outre
+ * (en cas de communication orale c'est plus pratique)
+ *
+ * @package SPIP\Core\Drapeaux\Edition
+ **/
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
 
-// http://doc.spip.org/@lire_tableau_edition
-function lire_tableau_edition () {
+/**
+ * Retourne le tableau des éléments édités en cours après avoir supprimé
+ * les éléments trop vieux (de plus d'une heure) du tableau.
+ *
+ * @uses ecrire_tableau_edition()
+ *
+ * @return array
+ *     Tableau des éléments édités actuellement, par objet et auteur, du type :
+ *     `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()`
+ **/
+function lire_tableau_edition() {
        $edition = @unserialize($GLOBALS['meta']['drapeau_edition']);
-       if (!$edition) return array();
+       if (!$edition) {
+               return array();
+       }
        $changed = false;
 
-       $bon_pour_le_service = time()-3600;
+       $bon_pour_le_service = time() - 3600;
        // parcourir le tableau et virer les vieux
        foreach ($edition as $objet => $data) {
-               if (!is_array($data))
-                       unset ($edition[$objet]); // vieille version
-               else foreach ($data as $id => $tab) {
-                       if (!is_array($tab))
-                         unset ($edition[$objet][$tab]); // vieille version
-                       else foreach ($tab as $n => $duo) {
-                               if (current($duo) < $bon_pour_le_service) {
-                                       unset($edition[$objet][$id][$n]);
-                                       $changed = true;
+               if (!is_array($data)) {
+                       unset($edition[$objet]);
+               } // vieille version
+               else {
+                       foreach ($data as $id => $tab) {
+                               if (!is_array($tab)) {
+                                       unset($edition[$objet][$tab]);
+                               } // vieille version
+                               else {
+                                       foreach ($tab as $n => $duo) {
+                                               if (current($duo) < $bon_pour_le_service) {
+                                                       unset($edition[$objet][$id][$n]);
+                                                       $changed = true;
+                                               }
+                                       }
+                               }
+                               if (!$edition[$objet][$id]) {
+                                       unset($edition[$objet][$id]);
                                }
                        }
-                       if (!$edition[$objet][$id])
-                               unset($edition[$objet][$id]);
                }
-               if (!$edition[$objet])
+               if (!$edition[$objet]) {
                        unset($edition[$objet]);
+               }
        }
 
-       if ($changed)
+       if ($changed) {
                ecrire_tableau_edition($edition);
+       }
 
        return $edition;
 }
 
-// http://doc.spip.org/@ecrire_tableau_edition
+/**
+ * Enregistre la liste des éléments édités
+ *
+ * @uses ecrire_meta()
+ *
+ * @param array $edition
+ *     Tableau des éléments édités actuellement, par objet et auteur, du type :
+ *     `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()`
+ **/
 function ecrire_tableau_edition($edition) {
        ecrire_meta('drapeau_edition', serialize($edition));
 }
 
 /**
- * J'edite tel objet
- * si l'objet est non editable dans l'espace prive, ne pas retenir le signalement
- * qui correspond a un process unique
+ * Signale qu'un auteur édite tel objet
+ *
+ * Si l'objet est non éditable dans l'espace privé, ne pas retenir le signalement
+ * qui correspond à un process unique.
  *
- * http://doc.spip.org/@signale_edition
+ * @see lire_tableau_edition()
+ * @see ecrire_tableau_edition()
  *
  * @param int $id
- * @param $auteur
+ *     Identifiant de l'objet
+ * @param array $auteur
+ *     Session de l'auteur
  * @param string $type
- * @return mixed
+ *     Type d'objet édité
  */
-function signale_edition ($id, $auteur, $type='article') {
+function signale_edition($id, $auteur, $type = 'article') {
        include_spip('base/objets');
        include_spip('inc/filtres');
-       if (objet_info($type,'editable')!=='oui')
+       if (objet_info($type, 'editable') !== 'oui') {
                return;
+       }
 
        $edition = lire_tableau_edition();
-       if (isset($auteur['id_auteur']) and $id_a = $auteur['id_auteur'])
+       if (isset($auteur['id_auteur']) and $id_a = $auteur['id_auteur']) {
                $nom = $auteur['nom'];
-       else
+       } else {
                $nom = $id_a = $GLOBALS['ip'];
-       if (!is_array($edition[$type][$id]))
+       }
+
+       if (!isset($edition[$type][$id]) or !is_array($edition[$type][$id])) {
                $edition[$type][$id] = array();
+       }
        $edition[$type][$id][$id_a][$nom] = time();
        ecrire_tableau_edition($edition);
 }
 
-// Qui edite mon objet ?
-// http://doc.spip.org/@qui_edite
-function qui_edite ($id, $type='article') {
+/**
+ * Qui édite mon objet ?
+ *
+ * @see lire_tableau_edition()
+ *
+ * @param integer $id
+ *     Identifiant de l'objet
+ * @param string $type
+ *     Type de l'objet
+ * @return array
+ *     Tableau sous la forme `["id_auteur"]["nom de l'auteur"] = time()`
+ */
+function qui_edite($id, $type = 'article') {
 
        $edition = lire_tableau_edition();
 
-       return $edition ? $edition[$type][$id] : array();
+       return empty($edition[$type][$id]) ? array() : $edition[$type][$id];
 }
 
-// http://doc.spip.org/@mention_qui_edite
-function mention_qui_edite ($id, $type='article') {
+/**
+ * Afficher les auteurs ayant édités récemment l'objet.
+ *
+ * @param integer $id
+ *     Identifiant de l'objet
+ * @param string $type
+ *     Type de l'objet
+ * @return array
+ *     Liste de tableaux `['nom_auteur_modif' => x|y|z, 'date_diff' => n]`
+ */
+function mention_qui_edite($id, $type = 'article') {
        $modif = qui_edite($id, $type);
        unset($modif[$GLOBALS['visiteur_session']['id_auteur']]);
 
@@ -115,72 +176,94 @@ function mention_qui_edite ($id, $type='article') {
                        $auteurs[] = typo(key($duo));
                        $quand = max($quand, current($duo));
                }
+
                // format lie a la chaine de langue 'avis_article_modifie'
                return array(
                        'nom_auteur_modif' => join(' | ', $auteurs),
-                       'date_diff' => ceil((time()-$quand) / 60)
+                       'date_diff' => ceil((time() - $quand) / 60)
                );
        }
 }
 
 /**
- * Quels sont les objets en cours d'edition par X ?
+ * Quels sont les objets en cours d'édition par `$id_auteur` ?
  *
- * http://doc.spip.org/@liste_drapeau_edition
+ * @uses lire_tableau_edition()
  *
- * @param $id_auteur
+ * @param int $id_auteur
+ *     Identifiant de l'auteur
  * @return array
+ *     Liste de tableaux `['objet' => x, 'id_objet' => n]`
  */
-function liste_drapeau_edition ($id_auteur) {
+function liste_drapeau_edition($id_auteur) {
        $edition = lire_tableau_edition();
        $objets_ouverts = array();
 
-       foreach ($edition as $objet => $data)
-               foreach ($data as $id => $auteurs)
-               {
+       foreach ($edition as $objet => $data) {
+               foreach ($data as $id => $auteurs) {
                        if (isset($auteurs[$id_auteur])
-                       AND is_array($auteurs[$id_auteur]) // precaution
-                       AND (array_pop($auteurs[$id_auteur]) > time()-3600)) {
+                               and is_array($auteurs[$id_auteur]) // precaution
+                               and (array_pop($auteurs[$id_auteur]) > time() - 3600)
+                       ) {
                                $objets_ouverts[] = array(
-                                       'objet'=>$objet,
+                                       'objet' => $objet,
                                        'id_objet' => $id,
                                );
                        }
                }
+       }
+
        return $objets_ouverts;
 }
 
-// Quand l'auteur veut liberer tous ses objets (tous types)
-// http://doc.spip.org/@debloquer_tous
+/**
+ * Quand l'auteur veut libérer tous ses objets (tous types)
+ *
+ * @uses lire_tableau_edition()
+ * @uses ecrire_tableau_edition()
+ *
+ * @param integer $id_auteur
+ * @return void
+ */
 function debloquer_tous($id_auteur) {
        $edition = lire_tableau_edition();
        foreach ($edition as $objet => $data) {
-               foreach ($data as $id => $auteurs)
-               {
+               foreach ($data as $id => $auteurs) {
                        if (isset($auteurs[$id_auteur])) {
-                               unset ($edition[$objet][$id][$id_auteur]);
+                               unset($edition[$objet][$id][$id_auteur]);
                                ecrire_tableau_edition($edition);
                        }
                }
        }
 }
 
-// quand l'auteur libere un objet precis
-// http://doc.spip.org/@debloquer_edition
-function debloquer_edition($id_auteur, $id_objet, $type='article') {
+/**
+ * Quand l'auteur libère un objet précis
+ *
+ * @uses lire_tableau_edition()
+ * @uses ecrire_tableau_edition()
+ *
+ * @param integer $id_auteur
+ *     Identifiant de l'auteur
+ * @param integer $id_objet
+ *     Identifiant de l'objet édité
+ * @param string $type
+ *     Type de l'objet
+ * @return void
+ */
+function debloquer_edition($id_auteur, $id_objet, $type = 'article') {
        $edition = lire_tableau_edition();
 
-       foreach ($edition as $objet => $data){
+       foreach ($edition as $objet => $data) {
                if ($objet == $type) {
-                       foreach ($data as $id => $auteurs)
-                       {
+                       foreach ($data as $id => $auteurs) {
                                if ($id == $id_objet
-                               AND isset($auteurs[$id_auteur])) {
-                                       unset ($edition[$objet][$id][$id_auteur]);
+                                       and isset($auteurs[$id_auteur])
+                               ) {
+                                       unset($edition[$objet][$id][$id_auteur]);
                                        ecrire_tableau_edition($edition);
                                }
                        }
                }
        }
 }
-?>