Re: micros données schemas.org sur le prix d 'un produit
Laëtitia Philippe <[email protected]> Sat, 1 May 2021 15:03:19 +0200
| Newsgroups | gmane.comp.web.spip.user |
|---|---|
| Message-ID | <CAGWw4oDZKF4=poQ5KTcfVNsLGzGGne2XSHG30tVRkZf1h16u-A@mail.gmail.com> |
Après test j'en reviens pour préciser, parce qu'en fait ce que tu me
proposes Tcharlss, modifie le prix affiché/ public aussi, hors c'est
uniquement le prix du "content" qui doit utiliser ce nombre flottant à 2
decimal
le prix public entre <span itemprop...>ICI </span> doit s'afficher avec la
virgule
c'est celui qui renseigne la micro donnée dans <span itemprop="price"
content="ICI"> qui doit s'afficher avec un point
Je ne sais pas si c'est à faire mais voici mes fichiers:
*concrètement sur ma page html:*
<span itemprop="offers" itemscope="" itemtype="https://schema.org/Offer">
<link itemprop="availability" href="https://schema.org/InStock">
<h2><span class="montant" data-montant-nombre="31"
data-montant-devise="EUR"><span itemprop="price"
content="*0.00*">31,00</span> <span
itemprop="priceCurrency" content="EUR"
class="montant__devise">€</span></span></h2>
</span>tp://schema.org/Product <http://schema.org/Product>">
<h1 itemprop="name">#TITRE</h1>
<span itemprop="offers" itemscope itemtype="https://schema.org/Offer">
<h2>#PRIX</h2>
</span>
[(#DESCRIPTIF)]
[<span class="ref">référence: (#REFERENCE)</span>]
<meta itemprop='productID' content='ref:[(#REFERENCE|attribut_html)]'/>
#FORMULAIRE_PANIER_OPTIONS{produit, #ID_PRODUIT}
</span>
*je reprends le plugin intl*
* dans mes_options.php:*
<?php
/**
* Formater un montant (un nombre + une devise)
*
* Le montant retourné respecte les règles d'affichages propres à chaque
langue et devise :
* nombre de décimales, virgules et/ou points, emplacement de la devise, etc.
*
* L'option `currency_display` permet d'avoir un format spécifique aux
factures.
* L'option `float_only` permet d'avoir le nombre flottant arrondi selon la
devise.
*
* @note
* Nécessite soit l'extension bcmath, soit l'extension intl.
*
* @example montant_formater($montant, array('currency'=>'EUR',
'locale'=>'fr-CA'))
*
* @see
https://github.com/commerceguys/intl/blob/master/src/Formatter/CurrencyFormatterInterface.php#L8
* @see https://www.php.net/manual/fr/numberformatter.formatcurrency.php
*
* @uses intl_devise_defaut
* @uses intl_locale_defaut
* @uses intl_devise_info
* @uses intl_langue_vers_locale
* @uses intl_filtrer_options_formater
* @uses intl_alias_options_formater
*
* @param float $montant
* Valeur du montant à formater
* @param array $options
* Tableau d'options :
* - markup : (String|Boolean) pour encapsuler ou pas
dans un <span>
* Défaut: true
* - class : (String) nom de la classe parente pour
encapsuler
* Défaut : montant
* - currency : (String) devise, code alphabétique à 3
lettres.
* Défaut : celle configurée
* - locale : (String) identifiant d'une locale (fr-CA)
ou code de langue SPIP (fr_tu)
* - style : (String) standard | accounting.
* Défaut : standard
* - use_grouping : (Bool) grouper les séparateurs.
* Défaut : true
* - rounding_mode : constante PHP_ROUND_ ou `none`.
* Défaut : PHP_ROUND_HALF UP
* - minimum_fraction_digits : (Int)
* Défaut : fraction de la devise.
* - maximum_fraction_digits : (Int)
* Défaut : fraction de la devise.
* - currency_display : (String) symbol | code | none.
* Défaut : symbol
* @return string|float
* Retourne une chaine contenant le montant formaté avec une devise,
encapsulée dans un <span>
*/
function filtre_montant_formater($montant, $options = array()) {
intl_loader();
// S'assurer d'avoir un nombre flottant
$montant = floatval(str_replace(array(',', ' '), array('.', ''), $montant));
// Devise à utiliser
$devise = (!empty($options['currency']) ? $options['currency'] :
intl_devise_defaut());
// Locale à utiliser
$locale = (!empty($options['locale']) ? $options['locale'] :
intl_locale_defaut());
$locale = intl_langue_vers_locale($locale);
// Options (celles propres au formatter + diverses)
$options_defaut = array(
'locale' => $locale,
'currency_display' => 'code', // pour l'accessibilité
'markup' => true, // encapsuler
);
$options = array_merge($options_defaut, is_array($options) ? $options :
array());
// 1) De préférence, on utilise la librairie Intl de Commerceguys
if (extension_loaded('bcmath')) {
// Éviter les exceptions invalid argument.
$options_formatter = intl_normaliser_options_formatter($options);
$numberFormatRepository = new
CommerceGuys\Intl\NumberFormat\NumberFormatRepository;
$currencyRepository = new CommerceGuys\Intl\Currency\CurrencyRepository;
$currencyFormatter = new
CommerceGuys\Intl\Formatter\CurrencyFormatter($numberFormatRepository,
$currencyRepository);
$montant_formate = $currencyFormatter->format($montant, $devise,
$options_formatter);
// 2) Sinon on se rabat sur la librairie Intl PECL
} elseif (extension_loaded('intl')) {
$currencyFormatter = new NumberFormatter($locale,
NumberFormatter::CURRENCY);
$montant_formate = $currencyFormatter->formatCurrency($montant, $devise);
// 3) En dernier recours on fait le formatage du pauvre
} else {
$montant_nombre = str_replace('.', ',', $montant);
$montant_formate = $montant_nombre . ' ' . $devise;
}
// Enfin, on encapsule le tout
if (!empty($options['markup'])) {
$classe = (!empty($options['class']) ? $options['class'] : null);
// S'assurer que le montant soit arrondi selon la devise, même si c'est en
principe fait en amont
$arrondi_devise = intval(intl_devise_info($devise, 'fraction'));
$montant = round($montant, $arrondi_devise);
$montant_formate = intl_ajouter_markup_crealouest($montant_formate,
$montant, $devise, $classe);
}
return $montant_formate;
}
/**
* Encapsule un montant dans des <span> en isolant la devise, en mode BEM.
*
* @note
* On n'encapsule pas le nombre dans un span car la devise peut être incluse
dedans,
* ex. : -AED123
*
* @example
* (sans retour ligne, là c'est pour lisibilité)
* ````
* <span class="montant" data-montant-nombre="3.14"
data-montant-devise="EUR">
* 3,14 <span class="montant__devise">EUR</span>
* </span>
* ````
*
* @param string $montant_formate
* Montant formaté avec éventuellement la devise ou le symbole
* @param float $montant
* Montant sans formatage
* @param string $devise
* Code alphabétique à 3 lettres
* @param string $classe
* Classe parente à utiliser, défaut = 'montant'
* @return string
*/
function intl_ajouter_markup_crealouest($montant_formate, $montant,
$devise, $classe = '') {
// Les classes BEM
$classe = (!empty($classe) ? $classe : 'montant');
$classe_devise = "${classe}__devise";
$english_format_number = number_format($number, 2, '.', '');
// Markupisons
$cherche_devise = '/[^\d\-\.\,\(\)\s x{00a0}]+/u';
$cherche_prix = "/[0-9]{0,9}\,[0,9]{2}/";
$symbole = intl_devise_info($devise, 'symbole');
$remplace_devise = "<span itemprop='priceCurrency' content='$0'
class=\"$classe_devise\">$symbole</span>";
$remplace_prix = "<span itemprop='price'
content='$english_format_number'>$0</span>";
$montant_formate = preg_replace($cherche_devise, $remplace_devise,
$montant_formate);
$montant_formate = preg_replace($cherche_prix, $remplace_prix,
$montant_formate);
$montant_formate = "<span class=\"$classe\"
data-montant-nombre=\"$montant\" data-montant-devise=\"$devise\">" .
$montant_formate . '</span>';
return $montant_formate;
}
Le sam. 24 avr. 2021 à 11:51, Laëtitia Philippe <[email protected]> a
écrit :
> Merci pour la piste, faut tester maintenant😊
>
> Le dim. 18 avr. 2021 à 12:22, tcharlss <[email protected]> a
> écrit :
>
>> Bonjour,
>>
>> Je lis ce message avec un peu de retard.
>>
>> Le 13/04/2021 à 16:30, Laëtitia Philippe a écrit :
>> > Bonjour,
>> >
>> > je cherche une solution pour bien baliser le prix d'une fiche produit
>> > dans content="100.00", en effet le prix doit y être affiché avec un
>> > point et non une virgule.
>>
>> Ça veut dire que dans "content" il faut un nombre flottant avec 2
>> décimales, c'est ça ?
>>
>> Dans ce cas là le plus simple c'est number_format :
>> https://www.php.net/manual/fr/function.number-format.php
>>
>> [(#PRIX*|number_format{2})]
>>
>> > dans l'exemple de la doc:
>> >
>> > # <span itemprop="price"content="1000.00">1,000.00</span>
>> >
>> > intl_fonction.php est trop obscure mais c'est sûrement là qu'est la
>> > solution,quelqu'un aurait une idée? Merci beaucoup par avance
>> >
>> > Laëtitia
>> >
>> >
>> >
>> >
>> >
>>
>> _______________________________________________
>> liste spip
>> [email protected] - désabonnement : envoyer un mail à [email protected]
>>
>> Archives : https://www.mail-archive.com/[email protected]/maillist.html
>>
>> Infos : https://listes.rezo.net/mailman/listinfo/spip
>>
>> Documentation de SPIP : http://www.spip.net/
>>
>> Irc : de l'aide à toute heure : http://spip.net/irc
>>
>