[SPIP] ~v3.0.21-->v3.0.22
[lhc/web/www.git] / www / prive / formulaires / dater.php
index 5ad8828..f8aebcc 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2014                                                *
+ *  Copyright (c) 2001-2016                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -100,6 +100,12 @@ function formulaires_dater_charger_dist($objet, $id_objet, $retour='', $options=
        $valeurs['_label_date'] = (($statut == 'publie')? _T('texte_date_publication_objet'): _T('texte_date_creation_objet'));
        $valeurs['_saisie_en_cours'] = (_request('date_jour')!==null);
 
+       // cas ou l'on ne peut pas dater mais on peut modifier la date de redac anterieure
+       // https://core.spip.net/issues/3494
+       $valeurs['_editer_date'] = $valeurs['editable'];
+       if ($valeurs['_editer_date_anterieure'] AND !$valeurs['editable']){
+               $valeurs['editable'] = autoriser('modifier',$objet,$id_objet);
+       }
        return $valeurs;
 }
 
@@ -138,11 +144,12 @@ function formulaires_dater_identifier_dist($objet, $id_objet, $retour='', $optio
 function formulaires_dater_verifier_dist($objet, $id_objet, $retour=''){
        $erreurs = array();
 
-       foreach(array('date','date_redac') as $k)
-               if ($v=_request($k."_jour") AND !dater_recuperer_date_saisie($v))
+       foreach(array('date','date_redac') as $k){
+               if ($v=_request($k."_jour") AND !dater_recuperer_date_saisie($v, $k))
                        $erreurs[$k] = _T('format_date_incorrecte');
                elseif ($v=_request($k."_heure") AND !dater_recuperer_heure_saisie($v))
                        $erreurs[$k] = _T('format_heure_incorrecte');
+       }
 
        if (!_request('date_jour'))
                $erreurs['date'] = _T('info_obligatoire');
@@ -174,26 +181,41 @@ function formulaires_dater_traiter_dist($objet, $id_objet, $retour=''){
 
                $set = array();
 
-               if (!$d = dater_recuperer_date_saisie(_request('date_jour')))
-                       $d = array(date('Y'),date('m'),date('d'));
-               if (!$h = dater_recuperer_heure_saisie(_request('date_heure')))
-                       $h = array(0,0);
+               $charger = charger_fonction("charger","formulaires/dater/");
+               $v = $charger($objet, $id_objet, $retour, $options);
 
-               $set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
+               if ($v['_editer_date']){
+                       if (!$d = dater_recuperer_date_saisie(_request('date_jour')))
+                               $d = array(date('Y'),date('m'),date('d'));
+                       if (!$h = dater_recuperer_heure_saisie(_request('date_heure')))
+                               $h = array(0,0);
 
-               if (isset($desc['field']['date_redac'])){
+                       $set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
+               }
+
+               if (isset($desc['field']['date_redac']) AND $v['_editer_date_anterieure']){
                        if (!_request('date_redac_jour') OR _request('sans_redac'))
                                $set['date_redac'] = sql_format_date(0,0,0,0,0,0);
                        else {
-                               if (!$d = dater_recuperer_date_saisie(_request('date_redac_jour')))
+                               if (!$d = dater_recuperer_date_saisie(_request('date_redac_jour'), "date_redac"))
                                        $d = array(date('Y'),date('m'),date('d'));
                                if (!$h = dater_recuperer_heure_saisie(_request('date_redac_heure')))
                                        $h = array(0,0);
                                $set['date_redac'] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
                        }
                }
-               include_spip('action/editer_objet');
-               objet_modifier($objet, $id_objet, $set);
+
+               if (count($set)){
+                       $publie_avant = objet_test_si_publie($objet,$id_objet);
+                       include_spip('action/editer_objet');
+                       objet_modifier($objet, $id_objet, $set);
+                       $publie_apres = objet_test_si_publie($objet,$id_objet);
+                       if ($publie_avant !== $publie_apres){
+                               // on refuse ajax pour forcer le rechargement de la page ici
+                               // on refera traiter une 2eme fois, mais c'est sans consequence
+                               refuser_traiter_formulaire_ajax();
+                       }
+               }
        }
 
        if ($retour)
@@ -210,15 +232,25 @@ function formulaires_dater_traiter_dist($objet, $id_objet, $retour=''){
 /**
  * Recuperer annee,mois,jour sur la date saisie
  * @param string $post
+ * @param string $quoi
  * @return array
  */
-function dater_recuperer_date_saisie($post) {
+function dater_recuperer_date_saisie($post, $quoi="date") {
        if (!preg_match('#^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})#', $post, $regs))
                return '';
-       if ($regs[3]<>'' AND $regs[3] < 1001)
-               $regs[3] += 9000;
+       if ($quoi=="date_redac") {
+               if ($regs[3]<>'' AND $regs[3] < 1001)
+                       $regs[3] += 9000;
+
+               return array($regs[3],$regs[2],$regs[1]);
+       }
+       else {
+               $t = mktime(0,0,0,$regs[2],$regs[1],$regs[3]);
+               // si la date n'est pas valide selon mktime, la refuser
+               if (!$t) return '';
+               return array(date('Y',$t),date('m',$t),date('d',$t));
+       }
 
-       return array($regs[3],$regs[2],$regs[1]);
 }
 
 /**