Bonjour,
Bonne question !
Je ne sais pas si ce cas de figure a été prévu par le plugin paniers.
Pour saisir le problème, revoyons comment fonctionnent les paniers.
Un panier est séparé en 2 éléments :
- la panier en lui même dans la table spip_paniers, il contient les trucs de base : identifiant, auteur, cookie, statut et date.
- le contenu du panier dans la table spip_paniers_liens.
A chaque article du panier correspond une ligne dans cette table.
Elle contient 4 colonnes :
* id_panier : l'identifiant du panier
* id_objet : l'identifiant de l'objet
* objet : le type d'objet
* quantite : comme son nom l'indique
Pour ajouter un objet à un panier, on dispose d'un bouton d'action "remplir_panier", qui accepte 3 paramètres, et pas plus : objet-id_objet-quantite.
Ex:
[(#BOUTON_ACTION{
'ajouter au panier',
#URL_ACTION_AUTEUR{remplir_panier,#OBJET-#ID_OBJET,#SELF},
ajax})]
On voit que ces 3 paramètres correspondent aux données de la ligne qui va être ajoutée (ou mise à jour) dans la table spip_paniers_liens.
Donc voilà le noeud du problème : la table spip_paniers_liens sert à identifier les objets des paniers et leurs quantités, mais il n'y a pas de colonne supplémentaire pour d'autres informations : les variantes (de couleur, de taille, ou d'autre chose) en ce qui nous concerne.
Et de toute façon, le bouton d'action ne prend pas de paramètres supplémentaires pour choisir une de ces hypotétiques variantes.
Qui plus est, ces paramètres doivent être connus à l'avance : au lieu du select, il faudrait un bouton pour chaque variante.
Bon, ça ne veut pas dire que ce n'est pas faisable.
Mais là du coup, je ne suis pas sûr de la bonne solution. Il faudrait contacter l'auteur du plugin pour voir comment "bien" faire.
En attendant, voilà une proposition, à brûle-pourpoint :
1) Ajouter 2 champs "taille" et "couleur" à la table spip_paniers_liens
Ca ne va pas être possible depuis l'interface des champs extras puisque c'est une table "technique" et du coup elle n'apparaîtra pas dans la liste des objets modifiables. Il faut utiliser directement l'API.
2) Au lieu d'utiliser un bouton d'action, il faut utiliser un formulaire (à créer).
Le formulaire doit avoir au moins 2 paramètres "objet" et "id_objet", et contenir les 2 sélecteurs de variante : "taille" et "couleur" (et éventuellement 'quantite').
ex : #FORMULAIRE_REMPLIR_PANIER{#OBJET,#ID_OBJET,#SELF}
Dans la fonction traiter, tu récupères dans un premier temps les traitements de l'action "remplir_panier". Ca va ajouter/mettre à jour l'objet dans le panier comme si le bouton d'action avait été utilisé.
Ensuite, il ne reste plus qu'à mettre à jour la ligne de l'objet en indiquant les variantes.
Ca pourrait ressembler à ça :
function formulaires_remplir_panier($objet='', $id_objet=0, $retour=''){
$res=array();
// on récupère le traitement normal du bouton d'action
// ajoute/met à jour la ligne correspondant à l'objet dans spip_paniers_liens
$quantite = _request('quantite');
$remplir_panier = charger_fonction('remplir_panier','action');
$remplir_panier($objet,$id_objet,$quantite);
// ensuite, s'occuper des variantes
// met à jour la ligne correspondant à l'objet dans spip_paniers_liens pour les champ 'taille' et 'couleur'
include_spip('inc/session');
$id_panier = session_get('id_panier'); // id du panier en cours
$set = array('taille'=>_request('taille'), 'couleur'=>_request('couleur')); // valeurs des variantes
sql_updateq(
'spip_paniers_liens',
$set,
'id_panier='.$id_panier.' and objet='.sql_quote($objet).' and id_objet='.$id_objet
);
if ($retour) $res['redirect'] = $retour;
return $res;
}
Bon, c'est au plus simple, il n'y a pas les messages de succès et d'erreur ni rien, mais c'est pour l'exemple.
Cela dit, je répète, c'est une bonne question ! J'essaierai de voir avec l'auteur du plugin pour voir ce qu'il en pense.
C.R
Le 21/05/2014 00:24, Victor-A MARCHISET a écrit :
Bonsoir,
Il y a quelques semaines, j'ai lancé un appel à l'aide pour la mise en
place d'un Panier ainsi que le système de Bon de Commandes. Ca, c'est
fonctionnel, grâce à l'aide précieuse de Nathalie.
MAIS !
Ce serait trop simple, forcément. Dans le panier doivent apparaître la
taille du produit (taille ou pointure, selon produit), et la couleur en
plus de ce qu'il y a de base (titre, prix, quantité, prix+quantité).
Il y a également un deuxième prix à rajouter, ça en bidouillant en tant
que codeur du dimanche, c'est passé et c'est fonctionnel.
Mais reste le coup des tailles/pointures/couleurs.
Je regarde le PHP, et même si j'arrive plus ou moins à comprendre ce qui
en ressort du code général, je reste impuissant...
Les valeurs taille, etc, sont données grâce aux Champs Extras. Quand le
client clique sur "ajouter au panier", il faut que les valeurs qu'il a
sélectionné soient transmises dans le panier. Si jamais la taille
diffère mais que l'article est le même, alors la valeur ''quantité'' du
premier article ne s'actualise pas et un nouvel article se rajoute.
Les valeurs en question se trouvent dans un "select".
Ca donne :
<select name="taille_dispo" value="#ENV{taille_dispo}">
<BOUCLE_tailles(POUR){tableau #LISTER_VALEURS**{taille_dispo}}>
[<option value="#ENV{#VALEUR}">[(#VALEUR)]</option>]
</BOUCLE_tailles>
</select>
Ici c'est surtout pour que vous puissiez visualiser la chose. Et c'est
donc la valeur sur laquelle se trouve le client qui doit être récupérée.
Et là, je suis dans un brouillard complet.
Sauriez-vous m'éclairez, s'il vous plaît ?
En vous remerciant d'avance,
Victor-Arnaud.