Aide - Recherche - Membres - Calendrier
Version complète : Limiter le choix des méthodes de paiement pour des articles d'une catégorie précise
Forum osCommerce-fr > Adapter OsCommerce MS2 > Modules de Paiement et de Livraison
Mawashigeri
Bonjour à tous,

J'ai bien sûr cherché longtemps une réponse avant de vous la poster. smile.gif

Je cherche à pouvoir limiter les modes de paiement pour une catégorie (et sous-cat) précise.
Donc: Proposer tous les modes de paiement dans tous les cas, sauf si un client rajoute un article d'une (de) catégorie(s) précise(s).

Donc imaginons ceci:
J'ai 3 modes de paiement.
- carte de crédit
- chèque
- virement

Ce que je veux faire:
Si j'ajoute dans mon panier un article de la catégorie x, une fois le client dans la page checkout_paiement.php, le paiement par chèque n'apparait pas.
Si le client retire cet article(de la catégorie x) de son panier, mais à un autre article de la catégorie y, le paiement par chèque réapparait.

Il doit bien y avoir une condition à ajouter quelque part, mais malgré mes heures de chipo, je n'arrive à rien.

Pouvez-vous m'aider ou me donner quelques pistes ?
Je vous remercie d'avance. smile.gif
laurent54
Hello,

Un peu de lecture :
http://www.oscommerce-fr.info/forum/lofive...php?t67937.html
Havock
En très rapide pour le principe général :

Dans checkout_payment avant la partie ou on va afficher les différents types de paiement (donc avant $selection = $payment_modules->selection(); )
tu initialises une variable de test

$test_affichagecheque =0;

Tu testes ensuite pour chacun des produits de ton panier la catégorie parent ; pour cela :
Tu fais une boucle pour parcourir l'objet $order en récupérant les products_id et dans ta boucle tu fais une requête du style

Code
$test_category_query = tep_db_query("select categories_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " where products_id = '" . (int)XXXl'id du produitXXX . "'");
$test_category = tep_db_fetch_array($test_category_query);

if ($test_category['categories_id'] ==YYY) {    //  si le produit traité dans la boucle est dans la catégorie qui t'intéresse et dont l'id est YYY tu change la variable de test
$test_affichagecheque = 1;
}


Ensuite dans includes/modules/paiement/ tu modifies le fichier correspondant au paiement par chèque (pour moi c'est moneyorder.php)
Dans la fonction function update_status ; tout à la fin de ta fonction (avant le }) tu ajoutes :


Code
if ($this->enabled == true) {
if ($test_affichagecheque >0) {
$this->enabled = false;
}


si ta variable de test est >0 (donc si dans ton panier tu as un produit de la catégorie en question) ça va désactiver l'affichage du paiement par chèque.
Mawashigeri
Merci pour vos réponses si rapides ! smile.gif

Je vais voir comment je peux me débrouiller et vous tiens au courant au + vite !
FoxP2
le tableau order n'existe pas quand on est dans la page de paiement.
la commande est créée par checkout_process.
ou alors je suis très fatigué...
seules les tables customers_basket_* et l'objet $cart (en session) permette de savoir le contenu des achats du client.
Donc la réponse de laurent54 est plus appropriée.
Havock
Code
le tableau order n'existe pas quand on est dans la page de paiement.


Le tableau order non mais l'objet $order oui biggrin.gif
FoxP2
excl.gif un objet n'est pas un tableau.
de plus la class order est alimentée par la class shopping_cart(object $cart, donc autant se servir de celui là qui est plus léger), class qui elle même possède des méthodes toutes prêtes, telle que :
$cart->get_product_id_list()
il sera nécessaire également d'utiliser le fonction tep_get_prid (fichier general.php) pour capter l'id des produits achetés avec des attributs.
il est tout aussi inutile d'écrire une requête pour la catégorie, puisque il existe la function tep_count_products_in_category() (fichier general.php)
pour terminer, c'est avec la function native php in_array qu'on check une valeur dans un tableau.(il en existe pleins d'autres sur la manipulation des array)

permets moi donc de ne toujours pas être d'accord avec ta méthode.


dernière chose : il est tout à fait possible de passer des arguments à la methode selection() de la class payment sans devoir pour autant modifier chacun des modules de paiement en place.(déjà démontré dans un autre sujet sur lequel je suis intervenu)
Havock
Citation
excl.gif un objet n'est pas un tableau.


J'ai parlé d'array simplement parceque je n'ai pas bien relu mon texte (mais ne t'inquiète pas je sais faire la différence smile.gif )

Citation ( @ 19 Apr 2011, 10:18) *
de plus la class order est alimentée par la class shopping_cart(object $cart, donc autant se servir de celui là qui est plus léger), class qui elle même possède des méthodes toutes prêtes, telle que :
$cart->get_product_id_list()


Sur ce point je suis d'accord avec toi c'est plus efficace mais les deux solutions marchent.

Citation (FoxP2 @ 19 Apr 2011, 10:18) *
il est tout aussi inutile d'écrire une requête pour la catégorie, puisque il existe la function tep_count_products_in_category() (fichier general.php)


Avec tep_count_products_in_category tu récupères juste le nombre de produit dans une catégorie donc ici ça n'a pas d'utilité (ou bien j'ai loupé quelquechose blink.gif )

Citation (FoxP2 @ 19 Apr 2011, 10:18) *
permets moi donc de ne toujours pas être d'accord avec ta méthode.


Je permet (je n'ai jamais prétendu avoir la solution optimale smile.gif )


Citation (FoxP2 @ 19 Apr 2011, 10:18) *
dernière chose : il est tout à fait possible de passer des arguments à la methode selection() de la class payment sans devoir pour autant modifier chacun des modules de paiement en place.(déjà démontré dans un autre sujet sur lequel je suis intervenu)


C'est tout à fait exact, mais là il suffit de modifier le module des paiements par chèque et pas les autres, donc ça n'est pas plus compliqué smile.gif
FoxP2
quand je dis que je fatigue... effectivement c'est pas la bonne fonction pour les categories (au demeurant, il n'en existe pas)
à ma décharge, je ne travaille plus du tout sur les versions 2.x.x, mais uniquement sur la 3.0.x
quand à l'optimisation : plus on est feignant, plus on y a recours. happy.gif -> je suis concerné.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2013 Invision Power Services, Inc.