SPIP-Contrib

SPIP-Contrib

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

288 Plugins, 197 contribs sur SPIP-Zone, 273 visiteurs en ce moment

Accueil > Outils pour plugins > Tutoriaux pour Plugins > Balises arithmétiques

Balises arithmétiques

Cours de programmation

27 juillet 2009 – par Vincent François – commentaires

10 votes

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

Plugin Balises Arithmétiques

Cet article a pour nature un attrait pédagogique, toutes les balises citées ont leurs équivalents en tant que filtres (uniquement depuis SPIP 1.9).

Objectif

Les objectifs de ce projet sont listés ci-dessous :

  • Mise en œuvre d’un plugin
  • Écriture d’un fichier php contenant les balises arithmétiques.
  • Les opérations seront au nombre de six :
    • Addition/Soustraction.
    • Multiplication/Division.
    • Division Euclidienne (quotien et reste).

La syntaxe des balises sera celle décris ci-dessous :

<!-- Addition et soustraction -->
#ADDITION{terme_a, terme_b}
#SOUSTRACTION{terme_a, terme_b}

<!-- Multiplication et division -->
#MULTIPLICATION{terme_a, terme_b}
#DIVISION{terme_a, terme_b}

<!-- Division Euclidienne -->
#QUOTIENT{terme_a, terme_b}
#RESTE{terme_a, terme_b}

Bien sûr, les balises pourront être utilisées dans les boucles.
Ci-dessous, un exemple représentant la sommation des #ID_ARTICLE de tous les articles présent dans la base de données.

<!-- Déclaration de la variable somme (accumulateur) -->
#SET{somme, 0}
<!-- Déclaration de la boucle -->
<BOUCLE_articles(ARTICLES){tout}>
#SET{somme, #ADDITION{#GET{somme}, #ID_ARTICLE}}
</BOUCLE>
<!-- Affichage du résultat -->
<br>La somme des #ID_ARTICLE est égale à #GET{somme}</br>

Les balises #ADDITION, #SOUSTRACTION et #MULTIPLICATION

function balise_ADDITION_dist($p)
{
  $a = interprete_argument_balise(1, $p);
  $b = interprete_argument_balise(2, $p);

  if ($a == '' || $b == '')
  {
     $p->code = '\'#ADDITION[Manque argument]\'';
  }
  else
  {
     $p->code = '(' . $a . '+' . $b . ')';
  }

  return $p;
}

function balise_SOUSTRACTION_dist($p)
{
  $a = interprete_argument_balise(1, $p);
  $b = interprete_argument_balise(2, $p);

  if ($a == '' || $b == '')
  {
     $p->code = '\'#SOUSTRACTION[Manque argument]\'';
  }
  else
  {
     $p->code = '(' . $a . '-' . $b . ')';
  }

  return $p;
}

function balise_MULTIPLICATION_dist($p)
{
  $a = interprete_argument_balise(1, $p);
  $b = interprete_argument_balise(2, $p);

  if ($a == '' || $b == '')
  {
     $p->code = '\'#MULTIPLICATION[Manque argument]\'';
  }
  else
  {
     $p->code = '(' . $a . '*' . $b . ')';
  }

  return $p;
}

function balise_RESTE_dist($p)
{
  $a = interprete_argument_balise(1, $p);
  $b = interprete_argument_balise(2, $p);

  if ($a == '' || $b == '')
  {
     $p->code = '\'#RESTE[Manque argument]\'';
  }
  else
  {
     $p->code = '(' . $a . '%' . $b . ')';
  }

  return $p;
}

Pour les opérations addition, soustraction, multiplication et reste vous remarquerez que leurs fonctions est semblables à la différence de l’opérateur mathématique (+, -, * et % (modulo)).

Chaque nom de fonction est composé de cette façon :

  • Le préfixe balise_ , il est obligatoire.
  • Le nom de la balise en majuscule (exemple ADDITION).
  • Le suffixe _dist, il est facultatif, il indique à SPIP que la fonction est surchargeable.

Le seul argument d’une fonction balise est la variable $p, cet argument permet entre autre de récupérer le code PHP représentant les termes de la balise et d’envoyer du code PHP et HTML à SPIP.

Pour récupérer les termes, il faut employer la fonction interprete_argument_balise fournit par l’API de SPIP.

Le test conditionnel if ($a == '' || $b == '')vérifie si les deux termes (terme_a et terme_b) sont disponibles. Si cela n’est pas le cas, la fonction renvoie un message d’erreur. Par contre, si ils sont bien présent alors la fonction insére du code php exprimant l’opération mathématique au travers du membre code de la variable $p : $p->code.

Les balises #DIVISION et #QUOTIENT

function balise_DIVISION_dist($p)
{
  $a = interprete_argument_balise(1, $p);
  $b = interprete_argument_balise(2, $p);

  if ($a == '' || $b == '')
  {
     $p->code = '\'#DIVISION[Manque argument]\'';
  }
  else
  {
     $p->code = '(' . $b . ' == 0 ? \'#RESTE[Division par zéro]\' : '$a . '/' . $b . ')';
  }

  return $p;
}

function balise_QUOTIENT_dist($p)
{
  $a = interprete_argument_balise(1, $p);
  $b = interprete_argument_balise(2, $p);

  if ($a == '' || $b == '')
  {
     $p->code = '\'#QUOTIENT[Manque argument]\'';
  }
  else
  {
     $p->code = '(' . $b . ' == 0 ? \'#QUOTIENT[Division par zéro]\' : floor('$a . '/' . $b . '))';
  }

  return $p;
}

Un probléme se pose avec les opérations division et quotient, la division d’une nombre quelconque par zéro est impossible (non définie). Il faut donc vérifier si le terme_b est différent de zéro. Si oui on renvoie le résultat sinon une erreur.

Question aux développeurs

Fichier HTML

<BOUCLE_articles(ARTICLES){tout}>
#DIVISION{0,#ID_ARTICLE}
</BOUCLE_articles>

Fichier PHP

function balise_DIVISION_dist($p)
{
  $a = interprete_argument_balise(1, $p);
  $b = interprete_argument_balise(2, $p);

  if ($a == '' || $b == '')
  {
     $p->code = '\'#DIVISION[Manque argument]\'';
  }
  else
  {
     if ($b == 0)
     {
        $p->code = '\'#DIVISION[Division par zéro]\'';
     }
     else
     {
        $p->code = '('$a . '/' . $b . ')';
     }      
  }

  return $p;
}

Le problème est le suivant : quand le terme_b de la balise division est par exemple une balise #ID_ARTICLE, le test conditionnel if ($b == 0) renvoie toujours true. Serait-ce un problème de typage, pour ma part je ne sais pas.

La solution utilisée est d’effectuer le test conditionnel dans le membre code de $p, c’est à dire test ? oui : non. Cette méthode est décrite plus haut dans l’article.

Donc Messieurs les développeurs de SPIP, j’attend vos remarques avec impatience.

Réponse

La fonction balise est exécutée lors de la compilation du squelette. Avant le processus de compilation, la variable $b (et à priori $a) est indéfinie (la valeur n’est pas connue).

La solution est donc d’effectuer le test condionnel dans l’expression retounée à SPIP au travers de $p->code.

Merci à Cédric Morin pour les remarques pertinentes.

Conclusion

La programmation de balises arithmétiques est en fin de compte assez simple à mettre en œuvre, les connaissances informatiques sont assez limitées.

Pour les personnes désirant avoir plus d’informations, je serais prêt à commenter l’article en fonction de vos questions.

Le plugin est fournit avec l’article, il regroupe les fichiers nécessaires à l’emploie des balises arithmétiques. Pour l’installation, décompresser le fichier balise_arithmetique.zip dans le répertoire /plugins/ de SPIP.

Avec ce plugin un fichier de test est fournie, pour l’utiliser , vous inclurez cette commande dans votre squelette (exemple : sommaire.html) :
#INCLURE{fond=test_balises_arithmetiques}

Pour les personnes désirant approfondir le sujet, je vous proprose de visiter le site http://programmer.spip.org/. Vous y trouverez moult informations au sujet des balises et autres ; pour ma part je découvre ce site et cela est formidable !

Plugin Balises Arithmétiques

Dernière modification de cette page le 31 juillet 2009

Retour en haut de la page

Vos commentaires

  • Le 12 mai 2010 à 08:13, par ADB En réponse à : Balises arithmétiques

    Bonjour
    Merci pour cette contrib, mais... comment faire pour additionner plusieurs valeurs de champs ?
    Par exemple :
    #ADDITION#L_R3_T_1,#L_R3_T_2,#L_R3_T_3,#L_R3_T_4,#L_R3_T_5,#L_R3_T_6,#L_R3_T_7,#L_R3_T_8,#L_R3_T_9

    Merci

    • Le 12 mai 2010 à 17:00, par Pat En réponse à : Balises arithmétiques

      Voici une fonction qui le permet :

      1. function balise_SOMME_dist($p) {
      2. $n = 1;
      3. $_code = array();
      4. while ($_v = interprete_argument_balise($n++, $p))
      5. $_code[] = $_v;
      6. $p->code = count($_code)?'('.join(' + ',$_code).')':'0';
      7. $p->interdire_scripts = false;
      8. return $p;
      9. }

      Télécharger

      Tests OK :

      1. #SOMME{1,2,3}
      2. [(#SOMME{[(#VAL{2}|plus{3})],10,100})]

      Télécharger

    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

  • Refonte de l’identité graphique

    10 juillet – 33 commentaires

    Lors de la SPIP Party 2017 à Toulouse, un nouveau contributeur est venu nous présenter son travail sur une refonte du logo. Au delà de la refonte du logo, c’est une toute nouvelle identité graphique pour SPIP que Jordan nous propose. Voici une (...)

  • ScolaSPIP 4

    19 janvier 2016 – 211 commentaires

    ScolaSPIP est plugin-squelette responsive personnalisable pour sites Web d’établissements scolaires basé sur SPIPr Présentation de ScolaSPIP Ce plugin pour SPIP 3 est développé par la Dane de l’académie de Versailles pour les webmestres de cette (...)

  • Agenda Fullcalendar facile

    29 octobre 2016 – 34 commentaires

    Dans un précédent article, nous expliquions comment afficher un agenda Fullcalendar sur son site avec le plugin agenda. Cependant, ceci nécessite des manipulation de squelettes, ce qui n’est pas toujours évident lorsqu’on débute. La présente (...)

  • La Fabrique

    20 avril 2012 – 315 commentaires

    La Fabrique est un outil pour webmestres ou développeurs qui souhaitent créer des plugins. La Fabrique est capable de générer le code source minimal d’un plugin pour SPIP 3 (elle accélère donc le démarrage d’un plugin) et peut s’occuper également de (...)

  • Formulaire upload

    25 septembre 2012 – 34 commentaires

    Ce plugin permet d’uploader des documents depuis l’espace public Objectifs Ce plugin permet d’ajouter un formulaire dans l’espace public pour uploader et gérer des fichiers. A priori, il peut se greffer sur tous types objets SPIP : articles, (...)

Ça spipe par là