Plugin API Prix

API Prix est un outil de développement pour divers outils de gestion de commerce en ligne SPIP. Lorsque des objets SPIP ont un prix, d’autres plugins peuvent se brancher sur ses pipelines pour établir par exemple des factures ou enregistrer des paiements. Il est destiné à permettre de définir et afficher un prix HT et TTC avec sa devise sur tout objet possédant un champ prix.

Principe de base

Lorsque vous créez un nouvel objet ayant un prix, au lieu d’utiliser directement la valeur d’un champ qui contiendrait ce prix, ce plugin propose une API unifiée permettant de sortir le prix HT et le prix TTC toujours de la même manière, que ce soit une simple valeur de champ ou un calcul compliqué en arrière plan.

Implémentation

Pour que cette API fonctionne, vous devez l’implémenter pour le nouvel objet. Pour cela vous devez créer un fichier prix/<objet>.php avec possiblement deux fonctions.

Par exemple pour une patate :

prix_patate_ht_dist($id_patate, $ligne_sql) : cette fonction doit renvoyer la valeur du prix hors taxe pour cet identifiant. Afin de ne pas avoir trop de requête SQL, il y a déjà un argument contenant la ligne SQL de ce contenu, avec tous ses champs. Comme très souvent il s’agit juste de renvoyer le contenu d’un champ prix_ht ou prix, le plugin sait déjà le faire tout seul, et dans ce cas vous n’avez pas à implémenter cette fonction. Elle n’est donc utile que si la valeur n’est pas dans un champ commun, ou bien si vous avez besoin de faire des calculs pour trouver le prix HT, par exemple en multipliant avec une quantité (c’est ce que fait le plugin Commande par exemple).

prix_patate_dist($id_patate, $prix_ht) : cette fonction doit renvoyer le prix toute taxes comprises pour cet identifiant. Elle reçoit aussi le prix HT déjà calculé en amont. Si votre plugin est lié à un système permettant de trouver une ou plusieurs taxes pour votre objet, alors vous devez faire les calculs nécessaires et retourner le prix TTC. Si ce n’est pas le cas, le prix renvoyé au final sera le même que le prix HT.

Utilisation en PHP

Au niveau de l’utilisation, le cœur de l’API est constitué de deux fonctions génériques placées dans inc/prix.php.

inc_prix_ht_dist($type_objet, $id_objet, $arrondi)

// Charger la fonction
$fonction_prix_ht = charger_fonction('ht', 'inc/prix');
// Arrondi après la virgule
$arrondi = 2;
// On trouve le prix HT
$prix_ht = $fonction_prix_ht('patate', $id_patate, $arrondi);

inc_prix_dist($type_objet, $id_objet, $arrondi)

// Charger la fonction
$fonction_prix = charger_fonction('prix', 'inc/');
// Arrondi après la virgule
$arrondi = 2;
// On trouve le prix TTC
$prix_ttc = $fonction_prix('patate', $id_patate, $arrondi);

Utilisation dans les squelettes

À utiliser dans le boucle d’un objet :
-  #PRIX_HT : renvoie le prix HT d’un objet
-  #PRIX : renvoie le prix TTC d’un objet

Les balises de prix sont directement formatées, un filtre leur est appliqué automatiquement, sauf si vous utilisez l’étoile *. Si vous devez formater une autre valeur, ou après un calcul dans un squelette, il s’agit du filtre prix_formater :

Les taxes seules :
 [(#PRIX*|moins{#PRIX_HT*}|prix_formater)] 

Si vous avez besoin de trouver le prix d’un objet quelconque dans un squelette, sans le connaitre à l’avance, donc sans boucle, deux filtres permettent cela, qui appellent directement l’API centrale :
-  prix_ht_objet($id_objet, $type_objet)
-  prix_objet($id_objet, $type_objet)

Paramétrage

Après l’ajout de la librairie INTL la configuration se fait désormais dans l’interface d’administration du site.

Deux constantes permettent de gérer la devise utilisée.
On peut les définir dans le fichier mes_options.php :

-  PRIX_DEVISE pour formater les prix selon une langue (séparateur de milliers, de décimal, etc...). Cette valeur est utilisée par la fonction setlocale de PHP pour le paramètre LC_MONETARY.
-  DEVISE_DEFAUT pour indiquer quel texte doit être affiché après les prix pour indiquer la devise utilisée.

Auparavant, pour les dollars canadiens, on définissait les valeurs ainsi :

define('PRIX_DEVISE','fr_CA.utf8');    // locale du français Canadien
define('DEVISE_DEFAUT','&nbsp;&dollar; CAN'); // espace insécable + symbole dollar + CAN

Pipelines

Le plugin défini deux pipelines : « prix » et « prix_ht ».

Le plugin n’associe aucun traitement par défaut à ces pipelines, mais il est possible de les définir pour votre site ou plugin, de manière à adapter les prix selon les intentions et besoins. C’est ce que fait notamment le plugin ’montants’, par exemple.

Discussion

5 discussions

  • 2

    Bonjour,

    Sur un site 3.2.19 j’ai fait la mise à jour du plugin API prix de la version 1.0.0 à la version 1.3.3 . J’utilise aussi le plugin commandes (version 1.19.2)

    J’obtiens ces warnings en php 7.3.3 :

    Warning : array_merge() [function.array-merge.php] : Expected parameter 2 to be an array, string given in D :\server 17\www\sismo\plugins\auto\prix\v1.3.3\inc\prix.php on line 138

    Warning : array_merge() [function.array-merge.php] : Expected parameter 1 to be an array, null given in D :\server-17\www\sismo\plugins\auto\prix\v1.3.3\inc\prix.php on line 143

    Warning : array_merge() [function.array-merge.php] : Expected parameter 2 to be an array, null given in D :\server-17\www\sismo\plugins\auto\prix\v1.3.3\inc\prix.php on line 47
    ...

    Est-ce une mauvaise utilisation ou une version php incorrecte qui expliquerait ces messages ?

    Merci !

    • Comment $options peut être à « null » alors que quand on met pas le 3e param alors que quand on le met pas ça met un array vide par défaut ?

      Pour string peut être que là c’est avec un appel en squelette reconnu comme chaine même si c’est un nombre (genre « 2 »).

      Il faudrait remonter le chemin d’appel complet pour savoir qui met quoi dans ce paramètres $options.

    • Ok, merci RastaPopoulos

      Je vais donc y regarder de plus près.

      Cheers !

    Répondre à ce message

  • 6

    Bonjour, je viens de faire la maj du plugin de la version 4.7.4 vers la version 5.0.13 (SPIP v 3.2.14, PHP 7.4.25) et j’ai des problèmes d’affichage du montant sur mes pages de paiement et de résultat de paiement avec au moins deux modules :
    plugins/auto/bank/v5.0.13/presta/cheque/payer/acte.html
    plugins/auto/bank/v5.0.13/presta/virement/payer/acte.html

    Voici le montant tel qu’il m’apparait alors en clair sur mon site public :

    Montant : ⚠️ <b><span class=« montant » data-montant-nombre=« 6.5 » data-montant-devise=« EUR »>
    6,50 <span class=« montant__devise »>EUR</span>
    <meta itemprop=« price » content=« 6.5 » />
    <meta itemprop=« priceCurrency » content=« EUR » />
    </span></b>

    Si je remplace dans les deux modules le filtre bank_affiche_montant de la variable :

    #SET{montant,#MONTANT|bank_affiche_montant{#DEVISE}|wrap{'<b>'}}

    par l’ancien |affiche_monnaie tout redevient normal…

    Une idée du problème ? Merci d’avance…

    • Oui c’est un problème de la lib de sécurité HTML qui ne fait pas le boulot correctement, et c’est décrit ici depuis un an :
      https://git.spip.net/spip/spip/issues/4706

      Et la correction a bien été faite *y compris en 3.2* il y a 9 mois :
      https://git.spip.net/spip/spip/issues/4706#issuecomment-26016

      Ce n’est donc pas normal si tu vois encore ce même problème avec la dernière version de la branche 3.2 :(

    • Merci de ta réponse. Ok, oui c’est étrange. J’ai vu que tu as réouvert le ticket sur git.spip.net
      Je n’ai pas un super niveau en code, mais je peux essayer de débroussailler le pourquoi du comment.
      Sur le même serveur j’ai un site en production sous SPIP 3.2.11 avec BANK en 4.7.4 et cela fonctionne parfaitement. C’est sur mon site en DEV que je rencontre le problème : j’ai d’abord mis à jour BANK et d’autres plugins. Le problème est apparu. Puis j’ai MAJ SPIP vers 3.2.14
      Même en désactivant tous les plugins non nécessaires et en suivant la procédure de Tuto-commerce 1.0.11 j’obtiens ce résultat.

    • Mais ton site en production il a quelle version de Prix ? Celle avec Intl aussi ? (forcément si c’est pas le cas ya pas de problème puisque c’est l’ancien affichage sans data-truc en attributs)

      À priori la correction ne suffisait pas déjà car ça corrigeait bien les attributs data-truc mais pas les itemprop (html5 aussi) qui suivent.

    • Mon site en PROD a le plugin PRIX 1.3.1, mon site DEV la version 1.3.2

    • C’est la mise à jour de Intl il y a 4 mois qui a ajouté des nouveaux attributs de nouveau non reconnus par Safehtml : https://git.spip.net/spip-contrib-extensions/intl/commit/248e9b9c01bb61d44a7cb733da1338d8c87d6f52

    • Ok, du coup je reste avec mes bidouillages en attendant une MAJ il me semble. Merci de ta réactivité.

    Répondre à ce message

  • 14

    Yop,
    pour info, qu’est ce qui explique le nécessite PHP 7.0.8 ?

    • Plop,

      C’est la lib Intl de Commerce guys qui nécessite ça.

    • Ben justement, je me suis douté, j’ai regardé, et dans le composer.json ça dit :

      "require": {
          "php": ">=5.5.0"
      }
    • Ah tu fais bien de signaler, faut qu’on mette à jour.
      Maintenant c’est bien php 7.0.8 min : https://github.com/commerceguys/intl/blob/master/composer.json#L7

    • Ah flûte, ça m’arrange pas, c’est pour un vieux serveur avec PHP 5.6 ^^

      Bon, sinon, comment afficher par défaut le symbole € à la place de « EUR » ?

    • Il y a deux manières :
      -  soit tu ne touches à rien et tu utilises les balises avec * puis tu appelles le filtre de formatage toi-même dessus avec les options que tu veux
      https://git.spip.net/spip-contrib-extensions/prix/src/branch/master/prix_fonctions.php#L139
      -  soit tu surcharges le filtre sans le _dist et tu mets autre chose que tu veux par défaut

      Il ne me semble pas qu’on soit parti pour rendre ça configurable pour pouvoir changer le défaut, car la seule manière vraiment accessible c’est avec les devises en code alpha. Les symboles ne sont pas forcément lu correctement partout, et encore moins quand ça dépend des devises. Donc l’afficher autrement, comme par ex avec le symbole, ne devrait pas pouvoir être mis par défaut, mais plutôt utilisé au cas par cas à la main (avec étoile et le filtre), par ex dans des endroits précis où on veut un affichage « marketing » court et joli à présenter (concrètement avec un truc du genre : <span class="offscreen">#PRIX</span><span aria-hidden="true">[(#PRIX*|prix_formater{avec symbole})]</span>).

    • Ah… autre idée si tu veux vraiment par défaut malgré accessibilité et sans devoir surcharger (c’est jamais top) : t’insérer dans « declarer_tables_interfaces » après Prix, et passer par dessus la définition des filtres des deux balises en changeant $interface['table_des_traitements']['PRIX'][]= 'prix_formater(%s)'; par le tien, avec normalement possible la même fonction mais avec l’argument options en plus avec ce que tu désires.

    • Ok merci.
      Ce sera pour un site purement à public français, et en €, une surcharge ira très bien (même pas peur ^^).

    • Test quand même la table des traitements, c’est plus court (2 lignes de code) et ça éviterait la surcharge ! :)

    • Hello,

      Je viens de mettre a jour (merci au passage) et j’ai testé la surcharge de
      $interface['table_des_traitements']['PRIX'][]= 'prix_formater(%s)';

      depuis _options ... mais rien a faire :/ prix est bien necessité ... je vois pas ce que j’ai loupé ..

      j’ai testé ça :

      $GLOBALS['table_des_traitements']['PRIX'][] = 'fragment_prix_formater(%s)';
      
      function fragment_prix_formater($prix, $options = array()){
      	$fonction_formater = charger_fonction('prix_formater', 'filtres/');
      
      	return $fonction_formater($prix, array('currency_display'=>'symbol'));
      }

      et en fait du coup dans la doc/comment c’est écrit que prix_formater currency_display est en symbol par defaut mais dans le code je crois pas... je suis obliger de le forcer partout.

    • Alors
      1) Je sais pas ce que c’est que cette globale, les traitements c’est dans le pipeline « declarer_tables_interfaces » et c’est bien de ça dont j’ai parlé plus haut et c’est ça que tu dois utiliser pour être propre.
      2) Au pire tu peux aussi surcharger sans le « dist » et à l’intérieur appeler la fonction mère avec le dist (en l’appelant en dur du coup, pas avec un charger dynamique)

    • les traitements c’est dans le pipeline « declarer_tables_interfaces »

      qui instancie $GLOBALS[’table_des_traitements’] :)

    • Bah pourquoi ça marcherait pas ? C’est une pratique traditionnelle de modifier $GLOBALS['table_des_traitements']['CHAMP'][] sans passer par le pipeline Cf https://programmer.spip.net/Traitements-automatiques-des ... et assez précisément documenté ici : https://www.teddypayet.com/Supprimer-le-numero-du-titre-de-la-rubrique
      Et sinon clin d’œuil perso en mode souvenir souvenir : http://archives.rezo.net/archives/spip-zone.mbox/B5H7BS3ILDWCFD4A5GINR6GDOLWSV5KC/

    • Et bien c’est ce que je me demandais @Jluc, pourquoi ça marcherais pas ;-)

      bon j’ai dupliqué la fonction filtre dist au final .... merci de vos réponses.

    • cadeau

      /**
       * prix accessibilité
       * surcharge pour retourner le symbole de la devise dans un span
       * <span class="montant" data-montant-nombre="18" data-montant-devise="EUR">18,00&nbsp;<span class="montant__devise">€</span></span>
      **/
      function filtre_montant_formater($montant, $options = array()) {
      	$options['currency_display'] = 'symbol';
      	return filtre_montant_formater_dist($montant, $options);
      }

    Répondre à ce message

  • 4

    Bonsoir,
    J’ai voulu mettre à jour ce plugin ( API Prix 1.2.11 - test ) sur un SPIP SPIP 3.2.8 [24473] et j’ai le message d’erreur :
    "Le plugin API Prix dépend du plugin INTL ≥ 1.0.0."'

    Je ne connais pas ce plugin INTL ??

    Merci

    dd

    Répondre à ce message

  • 8

    Salut

    Les prix d’une application sont saisis en prix ttc.
    Option du plugin Produits v1.2.15 : Editer les produits en TTC.
    Ce plugin enregistre cependant le prix d’un objet en prix ht après l’avoir calculé.
    On a donc des prix_ht avec 6 décimales. Ce qui permet de calculer des prix TTC correctement arrondis.

    Or le plugin API Prix supprime les décimales pour calculer les prix ttc via la balise #PRIX :
    $options_ht = array_merge($options, array('arrondi'=>0));
    Résulat les prix affichés ne correspondent pas aux prix saisis dans l’administration où pourtant ils sont bien affichés, calculés sans doute par une autre formule.

    Peut-on corriger cette ligne 192 de ./inc/prix.php de cette façon :
    $options_ht = array_merge($options, array('arrondi'=>6));

    Cordialement

    • Yo,
      tout d’abord, peux tu indiquer de quelle version tu parles ? :)

      Si c’est la dernière, es-tu vraiment bien à jour ? Car il y a déjà eu cette correction (la dernière version étant encore « en dev » comme l’indique bien son statut) :
      https://git.spip.net/spip-contrib-extensions/prix/commit/41b8823b675096e20072aed5bf012a1cb79d5bfd

    • API Prix 1.2.6 - dev
      telle que distribuée par la fonction de mise à jour des plugins
      mais je vais aller chercher à la main la 1.2.8
      merci

    • API Prix 1.2.6 - dev
      telle que distribuée par la fonction de mise à jour des plugins

      @RastaPopoulos
      Ce tag a été ajouté automatiquement suite au déploiement du débardeur non ?
      Au départ la version de dev n’était pas dans le archivelist il me semble (pour pas être proposée dans SVP justement).

    • Au passage, quand j’active API Prix v1.2.8, ça l’active mais ça me dit ça en rouge,
      ce qui est incohérent :

      Impossible d’activer le plugin ../plugins/auto/paniers/v1.4.1
      Nécessite le plugin PRIX en version ≥ 0.1.8.
      Impossible d’activer le plugin ../plugins/auto/commandes/v1.17.2
      Nécessite le plugin PRIX en version ≥ 0.1.19.
      Impossible d’activer le plugin ../plugins/auto/livraison/v2.2.0
      Nécessite le plugin COMMANDES en version ≥ 1.6.13.
      Impossible d’activer le plugin ../plugins/auto/abonnements/v3.5.7
      Nécessite le plugin PRIX en version ≥ 0.1.11.
      Impossible d’activer le plugin ../plugins/auto/abozones/v1.0.7
      Nécessite le plugin ABONNEMENTS en version ≥ 2.0.0.

    • Ça c’est SVP qui lance parfois des fausses alertes, mais ça ne devrait avoir désactivé aucun de ces plugins.

      En résumé : la branche v1 est encore en développement, elle ne devrait pas tarder à passer en test ou en stable mais il peut subsister quelques bugs. Elle reste rétrocompatible avec la branche v0, mais il n’est pas exclus de faire un peu de ménage (renommage de fonctions, etc.), Bref si tu l’utilises en prod, garde ça en tête :)

      Il n’était pas prévu de la distribuer pour l’instant, c’est un effet de bord dû passage au débardeur, le tag a été posé automatiquement.

    • @tcharlss, tout à fait, c’est lors du passage au nouveau système, Cédric a d’abord généré des centaines de tags sur toutes les dernières versions des plugins (seulement le dernier de chaque branche, contrairement au script de azerttyu), et donc pour cette branche de dev aussi

      Il faudrait vraiment faire un chantier sur SVP pour ne pas mettre à jour si facilement quand ça change de X majeur… (et d’autant plus quand c’est en dev là ça devrait même pas être visible par défaut)

    • Grand merci pour vos explications.
      Très cordialement, Yanic

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

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

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom