Changeset 111457 in spip-zone


Ignore:
Timestamp:
Aug 28, 2018, 4:13:24 PM (8 months ago)
Author:
nicod@…
Message:

Un formulaire générique pour ajouter n'importe quel objet avec ses options au panier (cf README.md)

Location:
_plugins_/optionsproduits/trunk
Files:
7 edited
2 copied

Legend:

Unmodified
Added
Removed
  • _plugins_/optionsproduits/trunk/README.md

    r111358 r111457  
    11# Gérer des options sur des produits
    22
    3 ## v1.3.0 ##
    43
    5 Les options peuvent être associées à tous les objets éditoriaux, pas uniquement les produits.
     4## v1.3.2 ##
     5
     6Les options peuvent être associées à tous les objets éditoriaux, pas uniquement aux produits.
    67L'association se fait dans la configuration du plugin (liste des objets à cocher).
    78Les plugins produits et prix deviennent donc optionnels.
    8 
    99Pour gérer des options sur un objet patate, on pourra par exemple ajouter un champ prix (et taxe) dans la définition de l'objet patate.
    1010
    11 Et si on utilise le plugin Panier, comme on ne sait pas boucler sur une table de façon dynamique on pourra créer un formulaire/panier_patate_options.htm et .php en copiant/adaptant celui des produits (panier_produit_options).
     11Un formulaire générique permet d'ajouter un objet et ses options au panier.
     12Exemple : #FORMULAIRE_PANIER_OPTIONS{patate, #ID_PATATE} à utiliser dans une <boucle_(PATATES)>
    1213
    13 On pourra ensuite utiliser #FORMULAIRE_PANIER_PATATE_OPTIONS{#ID_PATATE}
    1414 
    1515## v1.0.0 ##
     
    2828Les options sont transmises aux paniers puis aux commandes. 
    2929La surcharge de formulaires/panier permet d'afficher le nom du produit avec toutes les options choisies.
    30 
    31 ## Pour tester
    32 
    33 Pour afficher le formulaire de choix des options et d'ajout au panier, utiliser #FORMULAIRE_PANIER_PRODUIT_OPTIONS{#ID_PRODUIT} dans le contexte d'un produit.
    3430
    3531## Notes techniques
  • _plugins_/optionsproduits/trunk/action/produit_panier.php

    r111355 r111457  
    2323        }
    2424        // On concatène pour passer les options à l'action remplir_panier.
    25         $options = join('|',$options);
     25        $options = join('|',array_filter($options));
    2626
    2727        if($id_objet = _request('id_produit')) {
  • _plugins_/optionsproduits/trunk/formulaires/panier_options.html

    r111357 r111457  
    1 <BOUCLE_produit(spip_produits){id_produit}>
    2 #SET{prix,#PRIX*}
     1#SET{prix,#ENV*{prix}}
    32<div class="formulaire_spip overflow-visible">
    43        <form action="#ENV{action}" method="post" class="js-achat-form achat">
    54                #ACTION_FORMULAIRE{#ENV{action}}
     5                <input type="hidden" name="objet" value="#ENV{objet}">
     6                <input type="hidden" name="id_objet" value="#ENV{id_objet}">
    67                <input type="hidden" name="prix_objet" value="#GET{prix}">
    78               
     
    1213                        <div class="editer editer_radio editer_options_objet">
    1314                                <label>#TITRE_GROUPE</label>
    14                                 <BOUCLE_radio(OPTIONS){id_optionsgroupe}{options_liens.objet=produit}{options_liens.id_objet=#ID_PRODUIT}{par rang, prix_option_objet}{doublons}>
    15                                 [(#SET{prix_option, #PRIX_OPTION*{produit,#ID_PRODUIT,#ID_OPTION}})]
     15                                <BOUCLE_radio(OPTIONS){id_optionsgroupe}{options_liens.objet=#ENV{objet}}{options_liens.id_objet=#ID_OBJET}{par rang, prix_option_objet}{doublons}>
     16                                [(#SET{prix_option, #PRIX_OPTION*{#ENV{objet},#ID_OBJET,#ID_OPTION}})]
    1617                                [(#SET{prix_option_seule, #GET{prix_option}|moins{#GET{prix}}})]
    1718                                <div class="choix">
     
    4647        </form>
    4748</div>
    48 </BOUCLE_produit>
  • _plugins_/optionsproduits/trunk/formulaires/panier_options.php

    r111344 r111457  
    66}
    77
    8 function formulaires_panier_produit_options_charger_dist($id_produit) {
    9         $valeurs = array('id_produit' => $id_produit);
    10 
    11         // On transmet les options reçues au formaulaire sous forme concaténee
     8function formulaires_panier_options_charger_dist($objet, $id_objet) {
     9        $valeurs = array(
     10                'objet'    => $objet,
     11                'id_objet' => $id_objet,
     12        );
     13       
     14        // Calculer le prix de l'objet pour le passer au formulaire
     15        $fonction_prix = charger_fonction('prix', 'inc/');
     16        $fonction_prix_ht = charger_fonction('ht', 'inc/prix');
     17        $valeurs['prix_ht'] = $fonction_prix_ht($objet, $id_objet, 6);
     18        $valeurs['prix'] = $fonction_prix($objet, $id_objet, 6);
     19       
     20        // On transmet les options reçues au formulaire sous forme concaténee
    1221        // pour qu'il les réaffiche comme cochées, mais on ne lui transmet pas les
    1322        // id_options reçues pour qu'il ne les remette pas dans #ACTION_FORMULAIRE
    1423        $options = array();
    1524        foreach ($_REQUEST as $key => $value) {
    16                 if($value && strpos($key,'id_option')!==false){
    17                         set_request($key,'');
     25                if ($value && strpos($key, 'id_option') !== false) {
     26                        set_request($key, '');
    1827                        $options[] = intval($value);
    1928                }
    2029        }
    21         $valeurs['options'] = join('|',$options);
    22        
     30        $valeurs['options'] = join('|', array_filter($options));
     31
    2332        return $valeurs;
    2433}
    2534
    26 function formulaires_panier_produit_options_traiter_dist($id_produit) {
     35function formulaires_panier_options_traiter_dist($id_objet) {
    2736        // On récupère les infos       
    28         $quantite= intval(_request('quantite'));
    29         $negatif= intval(_request('negatif'));
     37        $objet    = _request('objet');
     38        $id_objet = intval(_request('id_objet'));
     39        $quantite = intval(_request('quantite'));
     40        $negatif  = intval(_request('negatif'));
     41        $options  = array(_request('id_option'));
    3042
    3143        // On reçoit des options en POST sous la forme id_option
    3244        // ou id_optionX où X est l'id du groupe d'options.
    33         $options = array(_request('id_option'));
    3445        $groupes = sql_allfetsel('id_optionsgroupe', 'spip_optionsgroupes');
    3546        foreach ($groupes as $groupe) {
     
    3950        }
    4051        // On concatène pour passer les options à l'action remplir_panier.
    41         $options = join('|',$options);
    42 
    43         if($id_objet = _request('id_produit')) {
    44                 $id_objet= intval(_request('id_produit'));
    45                 $objet = 'produit';
    46         } else {
    47                 $objet = _request('objet');
    48                 $id_objet= intval(_request('id_objet'));
    49         }
     52        $options = join('|', array_filter($options));
    5053
    5154        // On appelle l'action remplir_panier
    52         $remplir_panier=charger_fonction('remplir_panier','action');
    53         $remplir_panier($objet.'-'.$id_objet.'-'.$quantite.'-'.$negatif.'-'.$options);
    54 
     55        $remplir_panier = charger_fonction('remplir_panier', 'action');
     56        $remplir_panier($objet . '-' . $id_objet . '-' . $quantite . '-' . $negatif . '-' . $options);
    5557}
  • _plugins_/optionsproduits/trunk/formulaires/panier_produit_options.php

    r109612 r111457  
    3939        }
    4040        // On concatène pour passer les options à l'action remplir_panier.
    41         $options = join('|',$options);
     41        $options = join('|', array_filter($options));
    4242
    4343        if($id_objet = _request('id_produit')) {
  • _plugins_/optionsproduits/trunk/inc/prix_option.php

    r109612 r111457  
    77
    88/*
    9  * Permet d'obtenir le prix HT d'un objet SPIP. C'est le résultat de cette fonction qui est utilisée pour calculer le prix TTC.
     9 * Permet d'obtenir le prix HT d'un objet SPIP avec une option
     10 * C'est le résultat de cette fonction qui est utilisée pour calculer le prix TTC.
    1011 *
    1112 * @param string $type_objet Le type de l'objet
     
    6162
    6263/*
    63  * Permet d'obtenir le prix final TTC d'un objet SPIP quel qu'il soit.
     64 * Permet d'obtenir le prix final TTC d'un objet SPIP avec une option
    6465 *
    6566 * @param string $type_objet Le type de l'objet
  • _plugins_/optionsproduits/trunk/javascript/optionsproduits.js

    r111357 r111457  
    55                function updatePrixOptionObjet() {
    66                        // calculer le prix du objet + des options
    7                         var prixObjet = parseFloat($('.js-achat-form input[name=prix_objet]').val());
    8                         $('.js-achat-form .editer_options_objet input[type=radio]:checked').each(function(){
    9                                 prixObjet += parseFloat($(this).data('prixoption'));
     7                        var prixObjet = parseFloat($('.js-achat-form input[name=prix_objet]').val())||0;
     8            $('.js-achat-form .editer_options_objet input[type=radio]:checked').each(function(){
     9                                prixObjet += parseFloat($(this).data('prixoption'))||0;
    1010                                console.log(parseFloat($(this).data('prixoption')));
    1111                        });
  • _plugins_/optionsproduits/trunk/optionsproduits_administrations.php

    r111348 r111457  
    3030
    3131                // créer les tables des options
    32                 array('maj_tables', array('spip_options', 'spip_options_liens', 'spip_optionsgroupes')),
     32                array(
     33                        'maj_tables',
     34                        array(
     35                                'spip_options',
     36                                'spip_options_liens',
     37                                'spip_optionsgroupes',
     38                        ),
     39                ),
    3340
    34                 // ajouter un champ pour les options dans les lignes du panier et des commandes
    35                 array('sql_alter', 'TABLE spip_paniers_liens ADD options VARCHAR(100) NOT NULL DEFAULT ""'),
    36                 array('sql_alter', 'TABLE spip_commandes_details ADD options VARCHAR(100) NOT NULL DEFAULT ""'),
    37 
    38                 // recréer la clé du panier avec les options
    39                 array('sql_alter', 'TABLE `spip_paniers_liens` DROP PRIMARY KEY'),
    40                 array('sql_alter', 'TABLE `spip_paniers_liens` ADD PRIMARY KEY (`id_panier`, `id_objet`, `objet`, `options`)',),
    41 
     41                // ajouter le champ options dans les tables des plugins Panier et Commande
     42                array('optionsproduits_alter_paniers_commandes'),
     43               
    4244                // ajouter les options et groupes à la config des objets géré par Rang
    4345                array('optionsproduits_configure_rang'),
     
    7375
    7476        // Retirer les options et groupes d'options dans la liste des objets géré par le plugin Rang
    75         $tables         = lire_config('rang/rang_objets');
    76         $tables         = explode(',', $tables);
     77        $tables = lire_config('rang/rang_objets');
     78        $tables = explode(',', $tables);
    7779        unset($tables['spip_options']);
    7880        unset($tables['spip_optionsgroupes']);
     
    8688 **/
    8789function optionsproduits_configure_rang() {
    88         $tables         = lire_config('rang/rang_objets');
    89         $tables         = explode(',', $tables);
     90        $tables = lire_config('rang/rang_objets');
     91        $tables = explode(',', $tables);
    9092        $tables_options = array(
    9193                'spip_options',
    9294                'spip_optionsgroupes',
    9395        );
    94         $tables         = array_unique(array_merge($tables, $tables_options));
     96        $tables = array_unique(array_merge($tables, $tables_options));
    9597        ecrire_config('rang/rang_objets', implode(',', $tables));
    9698        // créer les champs 'rang' dans les tables
    9799        rang_creer_champs($tables_options);
     100}
     101
     102/**
     103 * Ajouter le champ options dans les tables des plugins Panier et Commande
     104 *
     105 * @return void
     106 **/
     107function optionsproduits_alter_paniers_commandes() {
     108
     109        // TODO : problème si on installe les plugins Panier ou Commande après ce plugin,
     110        // les champs ne seront pas créés ni la clé réécrite...
     111        // faudrait pouvoir checker ça avec un pipeline post installation de plugin
     112        // je sais pas comment faire pour l'instant sans faire le gros bourrin
     113       
     114        if(test_plugin_actif('paniers')) {
     115                // ajouter un champ pour les options dans les lignes du panier
     116                sql_alter('TABLE spip_paniers_liens ADD options VARCHAR(100) NOT NULL DEFAULT ""');
     117                // recréer la clé du panier avec les options
     118                sql_alter('TABLE `spip_paniers_liens` DROP PRIMARY KEY');
     119                sql_alter('TABLE `spip_paniers_liens` ADD PRIMARY KEY (`id_panier`, `id_objet`, `objet`, `options`)');         
     120   }
     121   
     122        if(test_plugin_actif('commandes')) {
     123                // ajouter un champ pour les options dans les lignes des commandes
     124                sql_alter('TABLE spip_commandes_details ADD options VARCHAR(100) NOT NULL DEFAULT ""');
     125        }
     126
    98127}
  • _plugins_/optionsproduits/trunk/paquet.xml

    r111357 r111457  
    22        prefix="optionsproduits"
    33        categorie="divers"
    4         version="1.3.1"
     4        version="1.3.2"
    55        etat="dev"
    66        compatibilite="[3.1.0;3.2.*]"
     
    1818        <necessite nom="rang" compatibilite="[1.0.3;]" />
    1919        <necessite nom="spip_bonux" compatibilite="[3.4.2;]" />
     20        <necessite nom="prix" compatibilite="[0.1.15;]" />
    2021       
    21         <utilise nom="produits" compatibilite="[1.1.19;]" />
    22         <utilise nom="prix" compatibilite="[0.1.15;]" />
     22        <utilise nom="produits" compatibilite="[1.1.19;]" />   
    2323        <utilise nom="paniers" compatibilite="[1.3.0;]" />
    2424        <utilise nom="commandes" compatibilite="[1.15.0;]" />
Note: See TracChangeset for help on using the changeset viewer.