SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 284 visiteurs en ce moment

Accueil > Rédaction > Affichage dans texte > Créer un modèle permettant de calculer l’âge automatiquement

Créer un modèle permettant de calculer l’âge automatiquement

18 février 2015 – par gdw96 – 17 commentaires

61 votes

Ceci est une « contribution pédagogique », qui montre par l’exemple comment développer une nouvelle fonctionnalité pour SPIP.

Pouvoir calculer un âge et afficher le résultat automatiquement dans un article, un titre, une brève, etc.
L’âge est mis à jour dynamiquement et automatiquement.
Cet article vous explique pas à pas comment y arriver.

Pré-requis : (conseillé)

  • Connaître un peu de php
  • Connaître un peu de html

Cet article est destiné à : webmestre

Introduction

Nous allons créer, ensemble, un modèle Spip permettant de calculer un âge automatiquement.

Spip, nous permet, facilement, de créer ses propres modèle afin d’ajouter des fonctionnalités.

Qu’est-ce qu’un modèle ?

Je renvoie vers la documentation de Spip qui est, selon moi, la plus appropriée pour l’expliquer : Utiliser les modèles.

Il nous faut savoir deux trois choses sur les modèles avant de faire le nôtre :

  • Les modèles créés ou rajoutés doivent être dans le dossier « modeles » lui-même, dans le dossier « squelettes ».
  • Les modèles sont sous forme de fichier html.
  • Les modèles portent le même nom que la syntaxe correspondante dans Spip
  • S’il doit y avoir des actions en php, le fichier (php) doit avoir le même nom que le fichier html avec _fonctions.php à la fin. Exemple, si notre modèle se nomme modele1.html le fichier contenant les fonctions php aura pour nom : modele1_fonctions.php [1].
  • Pour agir, avec un script php, sur un modèle qui, lui est en html, on utilise un filtre php. Les filtres sont à appliquer sur un champ (exemple : [(#TEXTE|filtre)]).
  • Si le modèle doit faire appel à un code php spécifique, celui ci doit être créé sous la forme de fonctions qui seront appelées comme filtres dans le squelette html du modèle. Cette définition peut se faire dans un fichier du même nom que le fichier html, mais suffixé par « _fonctions.php » et situé dans le même dossier que lui. Exemple, si notre modèle se nomme age.html le fichier contenant les fonctions php aura pour nom : age_fonctions.php [2].

Concrètement :

Note : vous trouverez, à la fin de l’article, le modèle déjà prêt.

Nous allons commencer par créer le répertoire « modeles », s’il n’existe pas déjà, ensuite nous allons partir d’une syntaxe, d’une forme d’écriture que Spip reconnaîtra et qui appellera notre modèle.
Nous partirons sur la syntaxe suivante :

  1. <ages|n=date>

« date » sera, évidemment, à remplacer par la date « d’anniversaire » souhaité, par exemple, si l’on veut dire :

J’utilise Spip depuis ... ans

On écrira :

  1. J'utilise Spip depuis <ages|n=13-02-2011> ans

Le modèle

Maintenant qu’on a notre syntaxe, on peut commencer le modèle, pour cela on va créer un fichier, toujours dans le dossier modeles, nommé ages.html (sans les guillemets). Dans ce fichier il faut écrire les morceaux de html dont vous avez besoin (c’est un mini squelette).
Pour notre modèle nous n’avons pas besoin de balise html, on va juste écrire :

  1. [(#ENV{n}|ages)]

Je vous explique, lorsque, dans Spip, nous avons écrit <ages|n=date> on affecte à la variable, ici, n la valeur date. Afin de récupérer cette valeur, Spip nous propose une syntaxe qui est la suivante :

  1. #ENV{nom_de_la_variable}

Ensuite, sur cette variable nous appliquons un filtre nommé ages (c’est le |ages).

Comment ce filtre fonctionne ?

Spip va appeler une fonction php du même nom, ici ages.

C’est là qu’on créer le fichier php nommé « ages_fonctions.php »

Pourquoi ce fichier doit s’appeler ages_fonctions.php

SPIP permet, par cette dénomination, d’associer un fichier php à un squelette. Notez que si on partage des filtres entre plusieurs squelettes, on utilise mes_fonctions.php.

Dans ce fichier nous allons créer une fonction nommée ages. Notre fichier php commence par <?php et fini par ?>.
Ensuite, on déclare la fonction et on lui met en paramètre une variable qui contiendra la date :

  1. function ages($uneDate) {
  2. // C'est ici que l'on va écrire le code permettant de calculer l'âge
  3. }

Télécharger

En appliquant le filtre sur #ENV{n}, le paramètre $uneDate va prendre la valeur de #ENV{n} donc de la date stocké dans le paramètre d’environnement n.

Le double slash (//) désigne un commentaire. Un commentaire est un morceaux de code qui n’est pas exécuté, il est souvent utilisé pour aider le développeur dans la compréhension du code.

Dans le cas présent, j’ai décidé de faire une vérification sur la date, afin d’être sûr qu’elle soit au bon format et, ainsi, éviter d’éventuels bogues.
Nous allons commencer par déterminer une chaîne de caractère type (à l’aide des expressions relationnelles : regexp). Je renvoie vers l’article correspondant sur Wikipédia : Expression rationnelle

Voici deux variables, contenant une fonction php permettant de vérifier la présence d’une chaine de caractère (ici notre regexp) :

  1. // Vérifie la présence d'une chaîne type dans la date (vérifie le format de la date)
  2. $test1 = preg_match("/(^[0-9]{2})[-\/]([0-9]{2})[-\/]([0-9]{4}$)/", $uneDate);
  3. $test2 = preg_match("/(^[0-9]{4})[-\/]([0-9]{2})[-\/]([0-9]{2}$)/", $uneDate);

Télécharger

J’utilise la fonction « preg_match », elle fonctionne de la manière suivante :

  1. preg_match("la chaine recherchée", "la chaîne dans laquel on va rechercher la chaîne recherchée", $une_Variable_Contenant_Les_Éventuels_Résultats);

Je vais tenter de vous expliquer une des expressions relationnelles :

  1. /(^[0-9]{2})[-\/]([0-9]{2})[-\/]([0-9]{4}$)/

Les parenthèses désignent un groupe, dans le premier groupe

  1. (^[0-9]{2})

on note la présence d’un accent circonflexe juste avant les crochets [0-9]. L’accent nous indique que l’on peut trouver ce qui suit uniquement en début de ligne, en l’occurrence [0-9] qui désigne n’importe quel chiffre de 0 à 9 (par exemple 4). Après les crochets, il y a des accolades :

  1. {2}

elles indiquent le nombre de fois que l’on doit trouver l’expression juste avant celle-ci (les accolades). Ici

  1. [0-9]{2}

signifie que l’on doit trouver deux chiffres allant de 0 à 9.

Après les premières parenthèses, il y a des crochets ([-\/]) ils signifient qu’il doit y avoir, après les deux chiffres, le caractère « - » ou le caractère « / » [3].

Le dollar « $ », juste avant la dernière parenthèse, signifie que l’expression juste avant doit se situer absolument en fin de ligne, il ne doit rien y avoir derrière).

Maintenant, vous êtes tout à fait capable de comprendre l’expression relationnelle.

Pourquoi avoir fait deux regexp ?

Si vous avez compris et que vous regardez attentivement, vous trouverez facilement la raison. J’aurais très bien pu faire un seul regexp mais j’ai voulu m’assurer que la date donnée soit bien au format Année/Mois/Jour ou Jour/Mois/Année. La première expression cherche : 00-00-0000 (comme en français) et la seconde : 0000-00-00 (comme en SQL). Ici, les zéros désignent n’importe quel chiffre de 0 à 9.

Nous allons, maintenant, pouvoir écrire le test conditionnel qui vérifiera le format de la date, donc :

  1. if ($test1 or $test2) {
  2. // Calcule l'âge
  3. } else {
  4. // Retourne la phrase : Format de date invalide : "la date en question";
  5. }

Télécharger

Traduction :
Si (if) le test1 a trouvé une correspondance OU (or) que le test2 a trouvé une correspondance, alors, on calcule l’âge. Sinon (else) on retourne une phrase d’erreur.

Voici le teste conditionnel complet :

  1. if ($test1 or $test2) {
  2. // Calcule l'âge
  3. $age = date('Y') - date('Y', strtotime($uneDate));
  4. if (date('md') < date('md', strtotime($uneDate))) {
  5. $age = $age - 1;
  6. }
  7. } else {
  8. return("<b>Format de date invalide : ".$uneDate."</b>");
  9. }

Télécharger

Explication :
En ligne 3, on a le cœur de la fonction, la base de notre modèle, c’est à dire le calcul de l’âge. Cette ligne veut dire : la variable, du nom de $age, prend la valeur de l’année actuelle moins la valeur de l’année donnée, stocké dans la variable nommée $uneDate.

De la ligne 4 à 6, on voit un autre test conditionnel, permettant de vérifier que la date d’anniversaire n’est pas passée. Dans ce cas, il retire un an à l’âge afin que celui-ci soit juste.

En ligne 8, on a le retour en cas d’erreur. Le mot clef return renvoie la chaîne de caractère donné (notez la présence des balise html <b> et </b> qui permettent de mettre ce qu’elles contiennent en gras) et stoppe l’exécution de la fonction.

J’ai rajouté à la chaîne de caractère la date contenu afin que l’utilisateur puisse se rendre compte de son erreur.

Maintenant, il ne reste plus qu’à retourner l’âge et notre fonction est terminée.
Voici le retour de l’âge :

  1. // Revoit l'age.
  2. return($age);

Télécharger

Fini !

Voici la fonction en entier :

  1. <?php
  2. /********************************** age **********************************
  3. * Cette fonction permet de calculer un âge et de l'afficher dans un
  4. * article, une rubrique, une brève, etc.
  5. *
  6. * La syntaxe est la suivante :
  7. * <ages|n=date>
  8. *
  9. * Exemples :
  10. * <ages|n=2000-01-01>
  11. * <ages|n=01-01-2000>
  12. *
  13. * Formats de date supportés :
  14. * AAAA-MM-JJ
  15. * AAAA/MM/JJ
  16. * JJ-MM-AAAA
  17. * JJ/MM/AAAA
  18. *
  19. * Auteur : Gaël de Weerdt
  20. * Version : 0.0.1
  21. * Date : 13 Février 2015
  22. *
  23. *************************************************************************/
  24.  
  25. function ages($uneDate) {
  26. // Vérifie la présence d'une chaîne type dans la date (vérifie le format de la date)
  27. $test1 = preg_match("/(^[0-9]{2})[-\/]([0-9]{2})[-\/]([0-9]{4}$)/", $uneDate);
  28. $test2 = preg_match("/(^[0-9]{4})[-\/]([0-9]{2})[-\/]([0-9]{2}$)/", $uneDate);
  29.  
  30. if ($test1 or $test2) {
  31. // Calcule l'âge
  32. $age = date('Y') - date('Y', strtotime($uneDate));
  33. if (date('md') < date('md', strtotime($uneDate))) {
  34. $age = $age - 1;
  35. }
  36. } else {
  37. return("<b>Format de date invalide : ".$uneDate."</b>");
  38. }
  39.  
  40. // Revoit l'age.
  41. return($age);
  42.  
  43. }
  44. ?>

Télécharger

Récapitulatif

Nous avons choisi une syntaxe pour Spip, nous avons créé le modèle avec le fichier ages.html, dans lequel nous avons appliqué un filtre (la fonction php ages du fichier ages_fonctions.php) et nous avons écrit la fonction. Et le tout est au bon endroit (dans le dossier modeles" qui est dans le dossier « squelettes »).

Le modèle devrait être fonctionnel, il ne reste plus que l’essayer !

Conclusion

Nous avons créé notre propre modèle qui calcule l’âge automatiquement, le met à jour et il fonctionne très bien !

C’est maintenant à vous de faire vos modèles afin d’améliorer votre Spip :

Téléchargement du modèle

Zip - 1022 octets
modeles-ages
Version officielle de cette contribution pédagogique.
Zip - 1.2 ko
modeles-ages_v0.0.2
Nouvelle version bien différente permettant de calculer et d’afficher l’âge avec l’année, les mois et les jours ainsi que la gestion des pluriels etc..
Exemple : Âge : 1 an, 20 mois et 2 jours

Notes

[1Si les actions sont partagés entre plusieurs modèles, on utilisera alors mes_fonctions.php

[2Si les actions sont partagés entre plusieurs modèles, il faudra utiliser le fichier généraliste mes_fonctions.php

[3L’antislash « ~ » juste avant le slash « / » permet d’annuler l’effet du slash dans le regexp afin qu’il soit compté comme un caractère lambda.

Dernière modification de cette page le 1er septembre 2015

Retour en haut de la page

Vos commentaires

  • Le 28 août 2015 à 17:06, par toto1074 En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

    Bonjour et MERCI !
    Tout marche bien.
    Ce script répond à un besoin pour la publication d’annonces d’adoptions d’animaux (associations de sauvetages).
    Malheureusement, je ne connais pas le php pour l’adapter à cette spécificité : en effet, nous avons des animaux de moins d’un an...
    Pourrais-tu me modifier le script pour qu’il renvoit l’âge en tenant compte des mois ?
    Et si ce n’est ni trop compliqué ni trop de travail, l’idéal serait que le script fasse la différence entre les mois et les années et soit capable de renvoyer une réponse énoncée seulement en mois lorsque le résultat est inférieur à 1 an et « x » ans et « x » mois pour les autres... J’abuse ?
    J’abuse un peu plus : il y a moyen que le script soit capable d’accorder AN en nombre si le sujet à plus d’1 an ?
    Encore merci.
    Bonne journée.

    • Le 31 août 2015 à 12:41, par gdw96 En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

      Et bah écoutez, pourquoi pas !?

      Donnez-moi quelques exemples d’affichages pour être sûr que cela réponde exactement à vos besoins et je vous fais cela ! Normalement :-)

      L’adresse e-mail que vous avez donné pour poser ce commentaire est-elle réelle ? (toto1074@******.fr)

      Si oui, nous communiquerons par e-mail si cela ne vous gêne pas.

      Bien à vous,

    • Le 1er septembre 2015 à 09:18, par toto1074 En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

      Bonjour gdw96.
      Oui, mon adresse courriel est parfaitement valable et correspondre par ce biais me semble en effet plus pratique.
      Je te prépare que quelques exemples d’utilisations très rapidement.
      Merci.
      En attendant, un site personnel où j’ai testé ton modèle (« Date de naissance » dans la description) et qui pourra servir de base aux exemples que je te proposerai : http://lmcchats.free.fr/lmcchats/
      Encore merci et à bientôt.

    • Le 15 septembre 2015 à 18:04, par toto1074 En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

      Salut à tous
      Merci gdw pour cette seconde version qui répond parfaitement à mes demandes et marche du tonnerre. (Version PHP minimum 5.2 requise.)
      Merci à tous les autres contributeurs à l’univers du libre : utilisateur final, j’apprécie énormément ce que vous faites.
      MERCI.

    Répondre à ce message

  • Le 24 février 2015 à 16:44, par mailou En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

    Bonjour,
    Je viens de prendre connaissance de cette contribution et moi aussi je ne réussis pas à décompresser l’archive il est indiqué « Une erreur s’est produite pendant le chargement de l’archive », j’ai essayé plusieurs fois et toujours pareil, dommage j’aimerais tester
    Merci

    Répondre à ce message

  • Le 21 février 2015 à 13:40, par Patrick En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

    Bonjour, et merci pour cet ajout aux possibilités de Spip.
    Tout marche bien, et j’ai effectivement 66 ans comme l’a découvert le programme...
    Ce script répond à la demande d’un participant à la liste de diffusion.
    Bonne journée.

    • Le 21 février 2015 à 17:52, par Patrick En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

      Mais ne va pas plus loin que 1902... dommage

    • Le 21 février 2015 à 21:14, par gdw96 En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

      Bizarrement, chez moi, ça fonctionne jusqu’à l’an 0 !

      (Attention ! Pour les années à moins de 4 chiffres (par exemple pour le 1er janvier 900) il faut écrire « <ages|n=01-01-0900> » ou « <ages|n=0900-01-01> » ou « <ages|n=01/01/0900> » ou « <ages|n=0900/01/01> » : Il ne faut pas oublier de mettre un zéro avant le 900 afin qu’il y ai bien 4 chiffres).

    • Le 22 février 2015 à 07:39, par Patrick En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

      Bonjour,
      Si je mets « <ages|n=01/01/1902> » j’ai 113 ans, avec « <ages|n=01/01/1901> » j’obtiens 45 ainsi qu’en mettant des dates antérieures.
      Est ce que le calcul peut dépendre du serveur ou du système ?
      Je suis en local avec easyphp, spip 2 et spip 3 et j’obtiens le même résultat.
      Voir ici :

      http://imagesetpeche.free.fr/?Dates

    • Le 22 février 2015 à 10:40, par Maïeul En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

      en système 32 bits, les bornes de dates gérés sont 2038-01-19 et 1901-12-13. Une forme de bug de l’an 2000 lié au fait que le point de référence est 1970 et que la date est stockée sur timestamp.

      2 solutions :
      -  la plus simple (mais le plus chère) : avoir un serveur 64 bit.
      -  utiliser la classe datetime : http://php.net/DateTime (il faut du coup faire un php de php...)

    • Le 22 février 2015 à 14:38, par gdw96 En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

      Ah ! D’accord !

      C’est plus clair comme cela. Il est vrai que je ne comprenais absolument pas d’où venait le problème.

      Après, je suis sous GNU/Linux LinuxMint 17.1 64bits (donc Ubuntu) et je travail d’abords sur ce système.
      Mon serveur virtuel est sous Ubuntu - Apache 2.2.22 64bits
      Mon serveur virtuel local est sous Debian 7 64bits

    Répondre à ce message

  • Le 21 février 2015 à 12:23, par Fred En réponse à : Créer un modèle permettant de calculer l’âge automatiquement

    Impossible de décompresser le fichier modele spip-ages

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Mailsubscribers

    16 janvier 2013 – 274 commentaires

    Ce plugin permet de gérer les inscriptions (ou abonnements) à la diffusion de contenu par email. Mailsubscribers permet de gérer les inscriptions par Opt-in simple ou double et la désinscription par URL. Ce plugin gère également plusieurs listes (...)

  • noiZetier v2

    9 novembre 2012 – 36 commentaires

    Le noiZetier offre une interface d’administration permettant d’insérer au choix des éléments modulaires de squelettes (noisettes) et de les ajouter ainsi à ses squelettes. Compatibilité La version 2 du noizetier fonctionne sous SPIP 3. Elle est (...)

  • cirr : plugin « rédacteur restreint »

    29 octobre 2010 – 60 commentaires

    Ce plugin « cirr : rédacteur restreint » permet d’affecter des rubriques aux rédacteurs et modifie les droits afin qu’un rédacteur restreint (ou un administrateur restreint) voit dans l’espace privé uniquement les rubriques qui lui sont affectées (et leur (...)

  • Un retour d’expérience d’utilisation de Formidable

    26 octobre – commentaires

    Il s’agissait de créer un formulaire d’inscription à un évènement modérer les inscriptions dans le privé publier les inscriptions dans le public Nous avons discuté de cette présentation lors de l’apéro SPIP du 15 février 2016 à la Cantine (...)

  • Métas +

    3 décembre – 14 commentaires

    Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card. Installation Activer le plugin dans le menu dédié. Dans le panel de configuration, (...)

Ça spipe par là