Calcul de quantième

Cet exemple court va permettre de calculer et d’afficher le quantième (le numéro d’un jour dans l’année) à partir d’une date saisie dans un formulaire.

Ce formulaire sera nommé « calculer_quantieme » et pourra donc être appelé dans un squelette par #FORMULAIRE_CALCULER_QUANTIEME ou dans le texte d’un article par en utilisant le code <formulaire|calculer_quantieme>.

Mise en place

Les deux fichiers nécessaires seront créés comme ceci :

  • formulaires/calculer_quantieme.html pour la partie HTML
  • formulaires/calculer_quantieme.php pour les fonctions CVT d’analyse et de traitement PHP.

Squelette HTML

Le fichier formulaires/calculer_quantieme.html contient le code suivant, respectant la structure HTML et classes CSS préconisées :

<div class="formulaire_spip formulaire_#FORM">

[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]

[(#ENV{editable}|oui)
<form name="formulaire_#FORM" action="#ENV{action}" method="post"><div>

    #ACTION_FORMULAIRE{#ENV{action}}
    <ul>
    <li class="editer_date_jour obligatoire[ (#ENV**{erreurs}|table_valeur{message}|oui)erreur]">  
        <label for="champ_date_jour">Date (jj/mm/aaaa) :</label>
        [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{message})</span>]
        <input type="text" id="champ_date_jour" name="date_jour" value="[(#ENV{date_jour})]" />
    </li>
    </ul>
    <p class="boutons">
        <input type="submit" name="ok" value="Trouver" />
    </p>
</div></form>
]
</div>

À noter que le plugin « Saisies » permet d’écrire les champs de formulaire grâce à une balise #SAISIE en indiquant le type de saisie et le nom de la variable utilisée, puis les autres paramètres optionnels. Son utilisation pourrait donner (partie entre <ul> et </ul>) :

<ul>
[(#SAISIE{input, date_jour, obligatoire=oui, label="Date (jj/mm/aaaa) :"})]
</ul>

Chargement, vérifications et traitements

Ce fichier formulaires/calculer_quantieme.php contient les trois fonctions suivantes :

La fonction « charger » liste les variables qui seront envoyées dans l’environnement du squelette et initialise leurs valeurs par défaut. Ici aucune date par défaut n’est définie, mais il serait possible d’en indiquer une.

function formulaires_calculer_quantieme_charger_dist (){
    $valeurs = array(
        'date_jour' => ''
    );
    return $valeurs;
}

La fonction « vérifier » teste si tous les champs obligatoires sont renseignés et vérifie que le format de date semble correct :

function formulaires_calculer_quantieme_verifier_dist (){
    $erreurs = array();
    // champs obligatoires
    foreach(array ('date_jour') as $obligatoire) {
        if (!_request($obligatoire)) $erreurs[$obligatoire] = 'Ce champ est obligatoire';
    }
    // format de date correct
    if (!isset($erreurs['date_jour'])) {
        list($jour, $mois, $annee) = explode('/', _request('date_jour'));
        if (!intval($jour) or !intval($mois) or !intval($annee)) {
            $erreurs['date_jour'] = "Ce format de date n'est pas reconnu.";
        }
    }
    if (count($erreurs)) {
        $erreurs['message_erreur'] = 'Votre saisie contient des erreurs !';
    }
    return $erreurs;
}

Si les vérifications sont correctes (aucune erreur), la fonction « traiter » est exécutée. Le formulaire est déclaré ré-éditable, ce qui permet de saisir une nouvelle valeur de date aussitôt après la validation.

function formulaires_calculer_quantieme_traiter_dist (){
    $date_jour   = _request('date_jour');
    $retour = array('editable' => true);
    if ($quantieme = calcule_quantieme($date_jour)) {
        $retour['message_ok'] = "Le quantième de $date_jour est $quantieme";
    } else {
        $retour['message_erreur'] = "Erreur lors du calcul du quantième !";
    }
    return $retour;
}

Bien sûr il manque la fonction qui permet de trouver le quantième, mais deux petites lignes de PHP suffiront. Cette fonction peut être mise dans le même fichier que les trois fonctions précédentes :

function calcule_quantieme($date_jour) {
    list($jour, $mois, $annee) = explode('/', $date_jour);
    if ($time = mktime( 0, 0, 0, $mois, $jour, $annee)) {
        return date('z', $time);
    }
    return false;
}

Auteur Cyril Marion Publié le : Mis à jour : 17/05/10

Traductions : English, français