[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / inc / modifier.php
index 872a477..94c8a71 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  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.     *
 /**
  * Fonctions d'aides pour les fonctions d'objets de modification de contenus
  *
- * @package SPIP\Objets\Modifications
-**/
+ * @package SPIP\Core\Objets\Modifications
+ **/
 
-if (!defined('_ECRIRE_INC_VERSION')) return;
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
 /**
  * Collecte des champs postés
- * 
+ *
  * Fonction générique pour la collecte des posts
  * dans action/editer_xxx
  *
@@ -34,36 +36,36 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
  * @param bool $tous
  *     true : Recupère tous les champs de white_list meme ceux n'ayant pas ete postés
  * @return array
- *     Tableau des champs et valeurs collectées 
+ *     Tableau des champs et valeurs collectées
  */
-function collecter_requests($white_list, $black_list, $set=null, $tous=false){
+function collecter_requests($white_list, $black_list = array(), $set = null, $tous = false) {
        $c = $set;
-       if (!$c){
+       if (!$c) {
                $c = array();
-               foreach($white_list as $champ) {
+               foreach ($white_list as $champ) {
                        // on ne collecte que les champs reellement envoyes par defaut.
                        // le cas d'un envoi de valeur NULL peut du coup poser probleme.
                        $val = _request($champ);
-                       if ($tous OR $val !== NULL) {
+                       if ($tous or $val !== null) {
                                $c[$champ] = $val;
                        }
                }
                // on ajoute toujours la lang en saisie possible
                // meme si pas prevu au depart pour l'objet concerne
-               if ($l = _request('changer_lang')){
+               if ($l = _request('changer_lang')) {
                        $c['lang'] = $l;
                }
        }
-       foreach($black_list as $champ) {
+       foreach ($black_list as $champ) {
                unset($c[$champ]);
        }
-       
+
        return $c;
 }
 
 /**
  * Modifie le contenu d'un objet
- * 
+ *
  * Fonction generique pour l'API de modification de contenu, qui se
  * charge entre autres choses d'appeler les pipelines pre_edition
  * et post_edition
@@ -94,23 +96,25 @@ function collecter_requests($white_list, $black_list, $set=null, $tous=false){
  *     - chaîne vide : Vide si tout s'est bien passé
  *     - chaîne : Texte d'un message d'erreur
  */
-function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur='') {
+function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur = '') {
        if (!$id_objet = intval($id_objet)) {
                spip_log('Erreur $id_objet non defini', 'warn');
+
                return _T('erreur_technique_enregistrement_impossible');
        }
 
        include_spip('inc/filtres');
 
-       $table_objet = table_objet($objet,$serveur);
-       $spip_table_objet = table_objet_sql($objet,$serveur);
-       $id_table_objet = id_table_objet($objet,$serveur);
+       $table_objet = table_objet($objet, $serveur);
+       $spip_table_objet = table_objet_sql($objet, $serveur);
+       $id_table_objet = id_table_objet($objet, $serveur);
        $trouver_table = charger_fonction('trouver_table', 'base');
        $desc = $trouver_table($spip_table_objet, $serveur);
 
        // Appels incomplets (sans $c)
        if (!is_array($c)) {
-               spip_log('erreur appel objet_modifier_champs('.$objet.'), manque $c');
+               spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c');
+
                return _T('erreur_technique_enregistrement_impossible');
        }
 
@@ -125,9 +129,9 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
        unset($c['id_secteur']);
 
        // Gerer les champs non vides
-       if (isset($options['nonvide']) AND is_array($options['nonvide'])) {
+       if (isset($options['nonvide']) and is_array($options['nonvide'])) {
                foreach ($options['nonvide'] as $champ => $sinon) {
-                       if ($c[$champ] === '') {
+                       if (isset($c[$champ]) and $c[$champ] === '') {
                                $c[$champ] = $sinon;
                        }
                }
@@ -138,9 +142,11 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
        // TODO: ici aussi on peut valider les contenus
        // en fonction du type
        $champs = array();
-       foreach($desc['field'] as $champ => $ignore)
-               if (isset($c[$champ]))
+       foreach ($desc['field'] as $champ => $ignore) {
+               if (isset($c[$champ])) {
                        $champs[$champ] = $c[$champ];
+               }
+       }
 
        // Nettoyer les valeurs
        $champs = array_map('corriger_caracteres', $champs);
@@ -152,7 +158,7 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
                                'table' => $spip_table_objet, // compatibilite
                                'table_objet' => $table_objet,
                                'spip_table_objet' => $spip_table_objet,
-                               'type' =>$objet,
+                               'type' => $objet,
                                'id_objet' => $id_objet,
                                'champs' => isset($options['champs']) ? $options['champs'] : array(), // [doc] c'est quoi ?
                                'serveur' => $serveur,
@@ -162,35 +168,38 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
                )
        );
 
-       if (!$champs) return false;
+       if (!$champs) {
+               return false;
+       }
 
 
        // marquer le fait que l'objet est travaille par toto a telle date
        if ($GLOBALS['meta']['articles_modif'] != 'non') {
                include_spip('inc/drapeau_edition');
-               signale_edition ($id_objet, $GLOBALS['visiteur_session'], $objet);
+               signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet);
        }
 
        // Verifier si les mises a jour sont pertinentes, datees, en conflit etc
        include_spip('inc/editer');
-       if (!isset($options['data']) OR is_null($options['data'])){
+       if (!isset($options['data']) or is_null($options['data'])){
                $options['data'] = &$_POST;
        }
        $conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur);
        // cas hypothetique : normalement inc/editer verifie en amont le conflit edition
        // et gere l'interface
        // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme
-       if ($conflits)
+       if ($conflits) {
                return _T('titre_conflit_edition');
+       }
 
        if ($champs) {
                // cas particulier de la langue : passer par instituer_langue_objet
-               if (isset($champs['lang'])){
-                       if ($changer_lang=$champs['lang']){
+               if (isset($champs['lang'])) {
+                       if ($changer_lang = $champs['lang']) {
                                $id_rubrique = 0;
-                               if ($desc['field']['id_rubrique']){
-                                       $parent = ($objet=='rubrique')?'id_parent':'id_rubrique';
-                                       $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet));
+                               if (isset($desc['field']['id_rubrique'])) {
+                                       $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique';
+                                       $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet));
                                }
                                $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
                                $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
@@ -204,42 +213,59 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
                // la modif peut avoir lieu
 
                // faut-il ajouter date_modif ?
-               if (isset($options['date_modif']) AND $options['date_modif']
-               AND !isset($champs[$options['date_modif']]))
+               if (isset($options['date_modif']) and $options['date_modif']
+                       and !isset($champs[$options['date_modif']])
+               ) {
                        $champs[$options['date_modif']] = date('Y-m-d H:i:s');
+               }
 
                // allez on commit la modif
-               sql_updateq($spip_table_objet, $champs, "$id_table_objet=".intval($id_objet), $serveur);
+               sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur);
 
                // on verifie si elle est bien passee
-               $moof = sql_fetsel(array_keys($champs), $spip_table_objet, "$id_table_objet=".intval($id_objet), array(), array(), '', array(), $serveur);
+               $moof = sql_fetsel(array_keys($champs), $spip_table_objet, "$id_table_objet=" . intval($id_objet), array(), array(),
+                       '', array(), $serveur);
                // si difference entre les champs, reperer les champs mal enregistres
                if ($moof != $champs) {
                        $liste = array();
-                       foreach($moof as $k=>$v)
+                       foreach ($moof as $k => $v) {
                                if ($v !== $champs[$k]
                                        // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes
-                                       AND (!is_numeric($v) OR intval($v)!=intval($champs[$k]))
-                                       ) {
+                                       and (!is_numeric($v) or intval($v) != intval($champs[$k]))
+                               ) {
                                        $liste[] = $k;
                                        $conflits[$k]['post'] = $champs[$k];
                                        $conflits[$k]['save'] = $v;
+
+                                       // cas specifique MySQL+emoji : si l'un est la
+                                       // conversion utf8_noplanes de l'autre alors c'est OK
+                                       if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) {
+                                               include_spip('inc/charsets');
+                                               if ($v == utf8_noplanes($champs[$k])) {
+                                                       array_pop($liste);
+                                               }
+                                       }
                                }
+                       }
                        // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur
                        // c'est un cas exceptionnel
-                       if (count($liste)){
-                               spip_log("Erreur enregistrement en base $objet/$id_objet champs :".var_export($conflits,true),'modifier.'._LOG_CRITIQUE);
-                               return _T('erreur_technique_enregistrement_champs',array('champs'=>"<i>'".implode("'</i>,<i>'",$liste)."'</i>"));
+                       if (count($liste)) {
+                               spip_log("Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true),
+                                       'modifier.' . _LOG_CRITIQUE);
+
+                               return _T('erreur_technique_enregistrement_champs',
+                                       array('champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"));
                        }
                }
 
                // Invalider les caches
                if (isset($options['invalideur']) and $options['invalideur']) {
                        include_spip('inc/invalideur');
-                       if (is_array($options['invalideur']))
-                               array_map('suivre_invalideur',$options['invalideur']);
-                       else
+                       if (is_array($options['invalideur'])) {
+                               array_map('suivre_invalideur', $options['invalideur']);
+                       } else {
                                suivre_invalideur($options['invalideur']);
+                       }
                }
 
                // Notifications, gestion des revisions...
@@ -250,7 +276,7 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
                                        'table' => $spip_table_objet,
                                        'table_objet' => $table_objet,
                                        'spip_table_objet' => $spip_table_objet,
-                                       'type' =>$objet,
+                                       'type' => $objet,
                                        'id_objet' => $id_objet,
                                        'champs' => isset($options['champs']) ? $options['champs'] : array(), // [doc] kesako ?
                                        'serveur' => $serveur,
@@ -264,8 +290,9 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
        // journaliser l'affaire
        // message a affiner :-)
        include_spip('inc/filtres_mini');
-       $qui = ((isset($GLOBALS['visiteur_session']['nom']) AND $GLOBALS['visiteur_session']['nom'])?$GLOBALS['visiteur_session']['nom']:$GLOBALS['ip']);
-       journal(_L($qui.' a &#233;dit&#233; l&#8217;'.$objet.' '.$id_objet.' ('.join('+',array_diff(array_keys($champs), array('date_modif'))).')'), array(
+       $qui = isset($GLOBALS['visiteur_session']['nom']) and $GLOBALS['visiteur_session']['nom'] ? $GLOBALS['visiteur_session']['nom'] : $GLOBALS['ip'];
+       journal(_L($qui . ' a &#233;dit&#233; l&#8217;' . $objet . ' ' . $id_objet . ' (' . join('+',
+                       array_diff(array_keys($champs), array('date_modif'))) . ')'), array(
                'faire' => 'modifier',
                'quoi' => $objet,
                'id' => $id_objet
@@ -276,7 +303,7 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
 
 /**
  * Modifie un contenu
- * 
+ *
  * Dépreciée :
  * Fonction générique pour l'API de modification de contenu
  *
@@ -295,20 +322,21 @@ function objet_modifier_champs($objet, $id_objet, $options, $c=null, $serveur=''
  *     true si quelque chose est modifié correctement
  *     false sinon (erreur ou aucun champ modifié)
  */
-function modifier_contenu($type, $id, $options, $c=null, $serveur='') {
+function modifier_contenu($type, $id, $options, $c = null, $serveur = '') {
        $res = objet_modifier_champs($type, $id, $options, $c, $serveur);
-       return ($res===''?true:false);
+
+       return ($res === '' ? true : false);
 }
 
 /**
  * Crée une modification d'un objet
- * 
+ *
  * Wrapper pour remplacer tous les obsoletes revision_xxx
  *
  * @deprecated
  *     Utiliser objet_modifier();
- * @see objet_modifier();
- * 
+ * @uses objet_modifier()
+ *
  * @param string $objet
  *     Nom de l'objet
  * @param int $id_objet
@@ -317,11 +345,9 @@ function modifier_contenu($type, $id, $options, $c=null, $serveur='') {
  *     Couples des champs/valeurs modifiées
  * @return mixed|string
  */
-function revision_objet($objet,$id_objet,$c=null){
+function revision_objet($objet, $id_objet, $c = null) {
        $objet = objet_type($objet); // securite
        include_spip('action/editer_objet');
-       return objet_modifier($objet,$id_objet,$c);
-}
 
-
-?>
+       return objet_modifier($objet, $id_objet, $c);
+}