Changeset 110334 in spip-zone


Ignore:
Timestamp:
May 21, 2018, 1:51:40 PM (4 months ago)
Author:
abelass@…
Message:

fonction qui calcule le prix d'un objet en tenant compte des extensions

Location:
_plugins_/prix_objets/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/prix_objets/trunk/base/prix_objets.php

    r110329 r110334  
    33 * Déclarations relatives à la base de données
    44 *
    5  * @plugin     Déclinaisons Prix
     5 * @plugin     Prix Objets
    66 * @copyright  2012 - 2018
    77 * @author     Rainer Müller
  • _plugins_/prix_objets/trunk/paquet.xml

    r110314 r110334  
    22        prefix="prix_objets"
    33        categorie="edition"
    4         version="2.0.0"
     4        version="2.1.0"
    55        etat="stable"
    66        compatibilite="[3.0.5;3.2.*]"
     
    2121        <utilise nom="shop" compatibilite="[1.2.0;]" />
    2222
    23         <!-- Déclaration de pipelines -->
     23        <!-- Déclaration des pipelines -->
    2424        <pipeline nom="prix_objets_extensions" action='' />
     25        <pipeline nom="prix_par_objet" action='' />
    2526
    2627        <!-- Appels des pipelines -->
  • _plugins_/prix_objets/trunk/prix/prix_objet.php

    r103686 r110334  
    5555        return $prix;
    5656}
    57 
  • _plugins_/prix_objets/trunk/prix_objets_fonctions.php

    r110035 r110334  
    401401        return $devise_defaut;
    402402}
     403
     404/**
     405 * Donne le prix pour un objet
     406 *
     407 * @param string $objet
     408 *              Objet dont on cherche le prix
     409 * @param string $id_objet
     410 *              Identifiant de l'objet dont on cherche le prix
     411 * @param array $contexte
     412 *              Les variables de l'environnement.
     413 * @param array $options
     414 *
     415 * @return string
     416 *          Le prix applicable.
     417 */
     418function prix_par_objet($objet, $id_objet, $contexte, $type = 'prix_ht', $options = array()) {
     419        $prix = 0;
     420        $prix_priorite = isset($options['prix_priorite']) ? $options['prix_priorite'] : 'plus_cher';
     421        $prix_fallback = isset($options['prix_fallback']) ? $options['prix_fallback'] : $prix_priorite;
     422
     423        $fonction_prix = charger_fonction($type, 'prix', TRUE);
     424        $prix_source = sql_select(
     425                        'id_prix_objet',
     426                        'spip_prix_objets',
     427                        'id_prix_objet_source=0 AND objet LIKE ' . sql_quote($objet) . ' AND id_objet=' . $id_objet);
     428
     429        $prix_objets = array();
     430        // On parcours les extension pour chaque prix principal.
     431        while ($data_source = sql_fetch($prix_source)) {
     432                $id_prix_objet = $data_source['id_prix_objet'];
     433                $extensions = sql_select(
     434                                'extension,id_extension',
     435                                'spip_prix_objets',
     436                                'id_prix_objet_source=' . $id_prix_objet);
     437                $applicable = FALSE;
     438                while ($data_extension = sql_fetch($extensions)) {
     439                        if($extension = charger_fonction($data_extension['extension'], 'prix_objet', TRUE)) {
     440                                $applicable = $extension($data_extension['id_extension'], $contexte);
     441                        }
     442                        else {
     443                                $applicable = TRUE;
     444                        }
     445                }
     446
     447                // Les prix applicables.
     448                if ($applicable) {
     449                        $prix_objets['applicable'][] =$fonction_prix('prix_objet', $id_prix_objet);
     450                }
     451                // Les prix non applicables
     452                else {
     453                        $prix_objets['non_applicable'][] = $fonction_prix('prix_objet', $id_prix_objet);
     454                }
     455        }
     456
     457
     458        // Si plusieurs prix, on choisit selon préférence
     459        if (count($prix_objets) > 0) {
     460                // Parmis les prix applicables
     461                if (isset($prix_objets['applicable'])) {
     462                        foreach ($prix_objets['applicable'] as $prix_objet) {
     463                                switch($prix_priorite) {
     464                                        case 'plus_cher':
     465                                                if ($prix_objet > $prix) {
     466                                                        $prix = $prix_objet;
     467                                                }
     468                                                break;
     469                                        case 'moins_cher':
     470                                                $prix = '';
     471                                                if (!$prix or $prix_objet < $prix) {
     472                                                        $prix = $prix_objet;
     473                                                }
     474                                                break;
     475                                }
     476                        }
     477                }
     478                // sinon parmis tous les prix
     479                else {
     480                        foreach ($prix_objets['non_applicable'] as $prix_objet) {
     481                                switch($prix_fallback) {
     482                                        case 'plus_cher':
     483                                                if ($prix_objet > $prix) {
     484                                                        $prix = $prix_objet;
     485                                                }
     486                                                break;
     487                                        case 'moins_cher':
     488                                                $prix = '';
     489                                                if (!$prix or $prix_objet < $prix) {
     490                                                        $prix = $prix_objet;
     491                                                }
     492                                                break;
     493                                        case 'aucun':
     494                                                break;
     495                                }
     496                        }
     497                }
     498        }
     499
     500        // Permettre d'intervenir sur le prix
     501        return pipeline('prix_par_objet', array(
     502                        'data' => $prix,
     503                        'args' => array(
     504                                'objet' => $objet,
     505                                'id_objet' => $id_objet,
     506                                'contexte' => $contexte,
     507                                'type' => $type,
     508                                'options' => $options,
     509                        )
     510                )
     511        );
     512}
Note: See TracChangeset for help on using the changeset viewer.