Changeset 124303 in spip-zone


Ignore:
Timestamp:
Apr 23, 2020, 4:58:34 PM (3 months ago)
Author:
tcharlss
Message:

Encapsuler les prix formatés dans des <span> pour différencier le nombre et la devise, ce qui permet plus de choses à l'affichage. Le markup est en BEM. On peut désactiver avec l'option brut = oui (ou true, ou n'importe). Ça se fait dans une fonction à part prix_markup. Pour l'instant elle n'est pas surchargeable, mais ça pourrait, à voir.

Location:
_plugins_/prix
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/prix

    • Property subgit:lock:41b8823b675096e20072aed5bf012a1cb79d5bfd deleted
    • Property subgit:lock:1cbe2947d5b0d6037b38acae963feac1d4279927 set to 2020-04-23T19:01:48.859
  • _plugins_/prix/paquet.xml

    r124124 r124303  
    22        prefix="prix"
    33        categorie="outil"
    4         version="1.2.8"
     4        version="1.2.9"
    55        etat="dev"
    66        compatibilite="[3.2.0;3.2.*]"
  • _plugins_/prix/prix_fonctions.php

    r123222 r124303  
    139139 * @param array $options
    140140 *     Tableau d'options :
     141 *     - brut :                    (String|Boolean) pour ne pas encapsuler dans un <span>
     142 *     - class :                   (String) nom de la classe pour encapsuler
     143 *                                 Défaut : montant
    141144 *     - currency|devise :         (String) devise, code alphabétique à 3 lettres.
    142145 *                                 Défaut : celle configurée
     
    155158 *                                 Défaut : symbol
    156159 * @return string|float
    157  *     Retourne une chaine contenant le prix formaté avec une devise
     160 *     Retourne une chaine contenant le prix formaté avec une devise, encapsulée dans un <span>
    158161 */
    159162function filtres_prix_formater_dist($prix, $options = array()) {
     
    199202                $prix_formate = $currencyFormatter->formatCurrency($prix, $devise);
    200203
    201         // 3) Sinon, on fait le formatage du pauvre, au doigt mouillé
     204        // 3) En dernier recours on fait le formatage du pauvre
    202205        } else {
    203206                $prix_formate = str_replace('.', ',', $prix) . '&nbsp;' . $devise;
    204207        }
    205208
     209        // Enfin, on encapsule le tout
     210        if (empty($options['brut'])) {
     211                $classe = (!empty($options['class']) ? $options['class'] : null);
     212                $prix_formate = prix_markup($prix_formate, $devise, $classe);
     213        }
     214
    206215        return $prix_formate;
     216}
     217
     218/**
     219 * Encapsule un prix dans un <span> en séparant nombre et devise, en mode BEM.
     220 *
     221 * @example
     222 *     (sans retour ligne, là c'est pour lisibilité)
     223 *     ````
     224 *     <span class="montant">
     225 *       <span class="montant__nombre">3,14</span>
     226 *       <span class="montant__devise montant__devise_eur">EUR</span>
     227 *     </span>
     228 *    ````
     229 *
     230 * @param string $prix
     231 * @param string $devise
     232 *     Code alphabétique à 3 lettres, par défaut tiré du prix (mais le préciser si possible)
     233 * @param string $classe
     234 *     Classe parente à utiliser, défaut = 'montant'
     235 * @return string
     236 */
     237function prix_markup($prix, $devise = '', $classe = '') {
     238
     239        $pattern_devise = '/[^\d\,\.\s]+/'; // tout ce qui n'est pas nombre ou espace
     240        $pattern_nombre = '/[\d\,\.]+/'; // nombre = chiffres, virgules ou points
     241        $devise = ($devise ?: (preg_match($pattern_devise, $prix, $m) ? $m[0] : '')); // fallback si devise pas donnée
     242        $classe = (!empty($classe) ? $classe : 'montant');
     243        $classe_devise = "${classe}__devise ${classe}__devise_".strtolower($devise);
     244        $classe_nombre = "${classe}__nombre";
     245        $cherche = array(
     246                $pattern_devise,
     247                $pattern_nombre,
     248        );
     249        $remplace = array(
     250                "<span class=\"$classe_devise\">$0</span>",
     251                "<span class=\"$classe_nombre\">$0</span>",
     252        );
     253        $prix =
     254                "<span class=\"$classe\">" .
     255                preg_replace($cherche, $remplace, $prix) .
     256                '</span>';
     257
     258        return $prix;
    207259}
    208260
Note: See TracChangeset for help on using the changeset viewer.