Browse Source

Pour fixer les dates de début et de fin.

Ne marche que sous SPIP 4, car les attributs data ont changé entre 3.2
et 4.
Permet d'indiquer :
  - soit date fixe
  - un nombre de jour avant/après la date du jour (possibilité de mettre un calcul genre 2*365)

Reste à faire :
  - l'option pour ne pas depasser la date d'un autre champ
  - la vérification de tout cela au niveau de verifier_valeur_acceptable
Maïeul 2 years ago
parent
commit
0f693ee348
  1. 6
      lang/saisies_fr.php
  2. 3
      saisies/date.html
  3. 42
      saisies/date.yaml
  4. 72
      saisies/date_fonctions.php

6
lang/saisies_fr.php

@ -122,6 +122,12 @@ Vous trouverez la <a href="https://contrib.spip.net/5080" target="_blank" rel="n
'option_datas_grille_explication' => 'Vous devez indiquer un choix par ligne sous la forme "cle|Label du choix" ou bien "cle|Label à gauche|Label à droite"<br />La clé doit être unique, brève, claire et ne doit plus être modifiée par la suite.<br />',
'option_datas_label' => 'Liste des choix possibles',
'option_datas_sous_groupe_explication' => 'Vous devez indiquez un choix par ligne sous la forme "cle|Label" du choix.<br />La clé doit être unique, brève, claire et ne doit plus être modifiée par la suite.<br />Vous pouvez indiquer le début d’un sous-groupe sous la forme "*Titre du sous-groupe". Pour finir un sous-groupe vous pouvez en entamez un autre, ou bien mettre une ligne contenant uniquement "/*".',
'option_date_modifier_limites_label' => 'Modifier la portée des dates proposées',
'option_date_min_label' => 'Date minimale',
'option_date_max_label' => 'Date maximale',
'option_date_intervalle_bas_label' => 'Limiter à <em>x</em> jours dans le passé',
'option_date_intervalle_haut_label' => 'Limiter à <em>x</em> jours dans le futur',
'option_date_limiter_label' => 'Limiter la portée des dates proposées',
'option_defaut_label' => 'Valeur par défaut',
'option_disable_avec_post_explication' => 'Identique à l’option précédente mais poste quand même la valeur dans un champ caché.',
'option_disable_avec_post_label' => 'Désactiver mais poster',

3
saisies/date.html

@ -54,6 +54,8 @@
]
]
[(#REM)<!-- construire les attributs pour les intervalles -->]
#SET{attributs,#ENV*|unserialize|saisies_date_generer_attributs_limitation}
<p hidden id="[format_date_(#ENV{nom}|saisie_nom2name)]"><:saisies:format_date_attendu:></p>
#SET{describedby, #ENV{describedby}|concat{' ',format_date_#ENV{nom}|saisie_nom2name} }
@ -63,6 +65,7 @@
describedby=#GET{describedby},
valeur=#GET{date},
type=text,
attributs=#GET{attributs},
class=[(#ENV{class}) ]date})]
[(#ENV{horaire}|oui)
[(#INCLURE{fond=saisies/input,

42
saisies/date.yaml

@ -26,6 +26,48 @@ options:
label: '<:saisies:option_label_label:>'
explication: '<:saisies:option_label_explication:>'
size: 50
-
saisie: 'case'
options:
nom: 'modifier_limites'
label_case: '<:saisies:option_date_modifier_limites_label:>'
conteneur_class: 'pleine_largeur'
-
saisie: 'input'
options:
nom: 'intervalle_bas'
label: '<:saisies:option_date_intervalle_bas_label:>'
afficher_si: '@modifier_limites@'
verifier:
type: 'entier'
options:
min: '0'
-
saisie: 'input'
options:
nom: 'intervalle_haut'
label: '<:saisies:option_date_intervalle_haut_label:>'
afficher_si: '@modifier_limites@'
verifier:
type: 'entier'
options:
min: '0'
-
saisie: 'date'
options:
nom: 'date_min'
label: '<:saisies:option_date_min_label:>'
afficher_si: '@modifier_limites@'
verifier:
type: 'date'
-
saisie: 'date'
options:
nom: 'date_max'
label: '<:saisies:option_date_max_label:>'
afficher_si: '@modifier_limites@'
verifier:
type: 'date'
-
saisie: 'input'
options:

72
saisies/date_fonctions.php

@ -0,0 +1,72 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Retourne les data-attributs indiquant les limites de dates, en fonction des options passées à la saisie date
* @param array $env
* @return string
**/
function saisies_date_generer_attributs_limitation($env) {
$attributs = '';
$bornes = saisies_date_trouver_bornes($env);
if (isset($bornes['date_min'])) {
$attributs .= ' data-startdate=\''.$bornes['date_min']->format('d/m/Y').'\'';
}
if (isset($bornes['date_max'])) {
$attributs .= ' data-enddate=\''.$bornes['date_max']->format('d/m/Y').'\'';
}
return $attributs;
}
/**
* Trouver les bornes d'après les options
* @param array $env les options de la saisie
* @return array ['date_max' => DateTime, 'date_min' => DateTime]
**/
function saisies_date_trouver_bornes($env) {
$bornes = [];
// Date minimal
if (isset($env['intervalle_bas']) and $env['intervalle_bas'] !== '') {
$intervalle_bas = -valeur_numerique($env['intervalle_bas']);
$date_min_via_intervalle = new DateTime();
$date_min_via_intervalle->modify("$intervalle_bas day");
}
if (isset($env['date_min']) and $env['date_min'] !== '') {
$date_min = new DateTime($env['date_min']);
};
if (isset($date_min_via_intervalle) and isset ($date_min)) {
$date_min = max($date_min, $date_min_via_intervalle);
} elseif (isset($date_min_via_intervalle)) {
$date_min = $date_min_via_intervalle;
}
if (isset($date_min)) {
$bornes['date_min'] = $date_min;
}
// Date max
if (isset($env['intervalle_haut']) and $env['intervalle_haut'] !== '') {
$intervalle_haut = valeur_numerique($env['intervalle_haut']);
$date_max_via_intervalle = new DateTime();
$date_max_via_intervalle->modify("$intervalle_haut day");
}
if (isset($env['date_max']) and $env['date_max'] !== '') {
$date_max = new DateTime($env['date_max']);
};
if (isset($date_max_via_intervalle) and isset ($date_max)) {
$date_max = min($date_max, $date_max_via_intervalle);
} elseif (isset($date_max_via_intervalle)) {
$date_max = $date_max_via_intervalle;
}
if (isset($date_max)) {
$bornes['date_max'] = $date_max;
}
return $bornes;
}
Loading…
Cancel
Save