Transporteur en focntion d'un type de produits |
Bienvenue invité ( Connexion | Inscription )
Transporteur en focntion d'un type de produits |
7 Feb 2011, 17:55
Message
#1
|
|
Ceinture blanche+ OSC Groupe : Membres Messages : 36 Inscrit : 1-February 07 Membre no 15049 |
Salut,
Je recherche une solution de livraison en fonction d'un type de produit commandé. Je m'explique : j'ai actuellement 4 types de livraison proposées : TNT (j+1), Collissimo (48h), Alloin (+ de 20 kg), et lettre max. Grace à la fonction que j'ai trouvé dans le FAQ, je propose une, l'autre ou plusieurs solutions de livraison et cela est basé sur le poids. ça marche au poils. Mais ! par ce qu'il y a toujours un mais ! mon souci est que je vends également des produits imflamable (du carburant pour hélico) et pour cela je dois impérativement passer par Alloin et ne pas proposer les autres solution de livraison. J'ai cherché une contibution mais là c'est la panne sèche. Quelqu'un aurait il une solution ? Tout mes carburants sont dans la même cat ! je pense partir de ce code qui est basé sur le poids de la commande pour metter enable=false si tel produit de tel catégorie mais il y a peut être plus simple Citation // disable the module if the order only weight > 10 global $PHP_SELF; if (basename($PHP_SELF) != FILENAME_MODULES) { global $cart; if ($this->enabled == true) { if ($cart->show_weight() > '10') { $this->enabled = false; } } } Merci d'avance si vous avez un bon plan à me proposer. Salut Ed |
|
7 Feb 2011, 19:24
Message
#2
|
|
Ceinture marron OSC Groupe : Membres Messages : 1665 Inscrit : 3-June 09 Membre no 25501 |
perso, je passerai directement par la super class shipping (en modifiant la méthode quote() ) pour n'avoir qu'alloin comme choix possible.
|
|
8 Feb 2011, 07:40
Message
#3
|
|
Ceinture blanche+ OSC Groupe : Membres Messages : 36 Inscrit : 1-February 07 Membre no 15049 |
Salut,
Merci pour ta réponse mais qu'est ce que tu appelles la super class shipping, je souhaites conserver les autres prestataire pour plusieurs raisons. J'ai l'impression que je vais devoir ajouter un champ dans la créa du produit. ou alors créé un table spécifique d'affectation produit/prestataire Je ne vois pas comment faire autrement. Ed |
|
8 Feb 2011, 08:45
Message
#4
|
|
Ceinture blanche+ OSC Groupe : Membres Messages : 36 Inscrit : 1-February 07 Membre no 15049 |
Est il pssible de récuperr les id des produits qui sont dans le panier quand on est la page checkout_shipping.php ?
j'ai essayé : $products = $products[$i]['id']; cela donne array $products = (int)$products[$i]['id']; cela donne 0 Je ne suis pas un pro des sessions. Si j'arrive à recupérer ls id de chaque produits qui sont dans le panier je pourrais établir des conditions d'affichage des transporteurs merci Ed |
|
8 Feb 2011, 13:21
Message
#5
|
|
Ceinture marron OSC Groupe : Membres Messages : 1665 Inscrit : 3-June 09 Membre no 25501 |
inutile de manipuler les sessions, l'orienté objet suffira.
tu précises dans ton premier message que Tout mes carburants sont dans la même cat à partir de là, ça simplifie les choses. dans le fichier checkout_shiiping (après l'instance de l'objet shipping) : Code // load all enabled shipping modules require(DIR_WS_CLASSES . 'shipping.php'); $shipping_modules = new shipping; tu ajoutes : Code $alloin_flag = false; $products = $cart->get_products(); $category_exclude_query = tep_db_query("select products_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " where categories_id = 10"); $category_exclude = tep_db_fetch_array($category_exclude_query); for ($i=0, $n=sizeof($products); $i<$n; $i++) { if(in_array($products[$i]['id'], $category_exclude)) $alloin_flag = true; } j'ai mis la catégorie 10 en exemple, à adapter à la tienne. ensuite, dans la super class shipping, dans la méthode quote, tu ajoutes à tes global le flag : $alloin_flag. tu n'as plus qu'à contrôler if($alloin_flag == true){ ---> $class = 'alloin' ... [à adapter avec le $code du module de livraison correspondant] je te file pas le code entier, je te laisse un peu réfléchir à la bonne manière de faire ... (et ça reste très simple) |
|
8 Feb 2011, 17:02
Message
#6
|
|
Ceinture blanche+ OSC Groupe : Membres Messages : 36 Inscrit : 1-February 07 Membre no 15049 |
Salut FoxP2
Tout d'abord merci pour tes conseils. c'est cool. Je cherche comme tu dis voilà ce que j'ai fait en partant de ton code. Au sein de checkout_shipping sur après Code $shipping_modules = new shipping; j'ai intégré ce code, j'ai mis une valeur num sur alloin_flag pour pouvoir faire un echo dans la page est voir si la valeur fonctionne Code // module pour utiliser Alloin shipping global $alloin_flag; $alloin_flag = '0'; $products = $cart->get_products(); $category_exclude_query = tep_db_query("select products_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " where categories_id = 10"); $category_exclude = tep_db_fetch_array($category_exclude_query); for ($i=0, $n=sizeof($products); $i<$n; $i++) { if(in_array($products[$i]['id'], $category_exclude)) $alloin_flag = '1'; } Dans le module shipping de TNT, j'ai tenté ceci : Code // class constructor function tnt() { $this->code = 'tnt'; $this->title = MODULE_SHIPPING_TNT_TEXT_TITLE; $this->description = MODULE_SHIPPING_TNT_TEXT_DESCRIPTION; $this->sort_order = MODULE_SHIPPING_TNT_SORT_ORDER; $this->icon = DIR_WS_ICONS . 'tnt.gif'; $this->tax_class = MODULE_SHIPPING_TNT_TAX_CLASS; $this->enabled = MODULE_SHIPPING_TNT_STATUS; // disable le module si le poids dépasse > 35 kg global $PHP_SELF; if (basename($PHP_SELF) != FILENAME_MODULES) { global $cart; if ($this->enabled == true) { if ($cart->show_weight() > '35') { $this->enabled = false; } } } //disable le module si au moins un produits de la cat 10 if ($this->enabled == true) { if ( $alloin_flag == '1') { $this->enabled = false; } else if ( $alloin_flag == '0') { $this->enabled = true; } } } J'ai bien un alloin_flag=1 affiché quand il y a un produit de la cat 10 et un alloin_flag=0 quand il n'y a pas de carburant mais le module TNT reste toujour affiché dans les deux cas, strange ! j'ai aussi essayé avec Code //disable le module si au moins un produits de la cat 10 if ( $alloin_flag == '1') { $this->enabled = false; } else if ( $alloin_flag == '0') { $this->enabled = true; } Je continue de chercher, je ne maitrise pas très bien les global je pense. Bien à toi Ed |
|
8 Feb 2011, 17:21
Message
#7
|
|
Ceinture marron OSC Groupe : Membres Messages : 1665 Inscrit : 3-June 09 Membre no 25501 |
que fout cette globale dans le code du fichier checkout_shipping ?
Code global $alloin_flag; par contre, dans ton module tnt, il te faut appeler la globale $alloin_flag Code .../... // disable le module si le poids dépasse > 35 kg global $PHP_SELF, $alloin_flag; if (basename($PHP_SELF) != FILENAME_MODULES) { global $cart; if ($this->enabled == true) { .../... en passant par la class shipping, tu pourrais t'éviter te coder dans chacun de tes modules de livraison. (c'est le dernier point que j'aborde dans le message précédent) |
|
8 Feb 2011, 17:23
Message
#8
|
|
Ceinture blanche+ OSC Groupe : Membres Messages : 36 Inscrit : 1-February 07 Membre no 15049 |
Si j'integre la variable alloin_flag dans le module TNT pour voir si elle est récupérée
exemple sur l'affiche de la ligne du transporteur Code $this->quotes['methods'][] = array('id' => $this->code, 'title' => 'toto' . ' ' . $alloin_flag . ' ' . 'tata' . ' ' . $shipping_weight . ' ' . MODULE_SHIPPING_TNT_TEXT_UNITS, 'cost' => $table[$i+1] + MODULE_SHIPPING_TNT_HANDLING); La valeur de alloin_flag n'apparait pas, donc je n'arrive pas à introduire alloin_flag dans le code TNT. désolé je suis un autodidacte en PHP d'un niveau peut être un peu faible malgré que je dev des sites avec BackOffice masi je n'ai jamais eu besoin de global. Je continu de chercher bien sûr Ed |
|
8 Feb 2011, 17:57
Message
#9
|
|
Ceinture marron OSC Groupe : Membres Messages : 1665 Inscrit : 3-June 09 Membre no 25501 |
c'est normal, la variable $alloin_flag est crée après les instances des modules shipping.
mon code est prévu pour fonctionner directement sur la super class shipping. par contre si tu mets le code suivant (dans le fichier checkout_shipping) Code $alloin_flag = false; $products = $cart->get_products(); $category_exclude_query = tep_db_query("select products_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " where categories_id = 10"); $category_exclude = tep_db_fetch_array($category_exclude_query); for ($i=0, $n=sizeof($products); $i<$n; $i++) { if(in_array($products[$i]['id'], $category_exclude)) $alloin_flag = true; } avant Code // load all enabled shipping modules require(DIR_WS_CLASSES . 'shipping.php'); $shipping_modules = new shipping; ensuite je teste par exemple dans le module 'item' (includes/modules/shipping/item.php) dans le constructeur, je rajoute la globale $alloin_flag : Code // class constructor function item() { global $order, $alloin_flag; je n'ai plus qu'à tester (toujours dans le constructeur): Code .../... $this->enabled = ((MODULE_SHIPPING_ITEM_STATUS == 'True') ? true : false); if ($alloin_flag == true) { $this->enabled = false; } .../... le module sera désactivé si un ou plusieurs produit de la cat 10 est présent. cqfd |
|
8 Feb 2011, 18:52
Message
#10
|
|
Ceinture blanche+ OSC Groupe : Membres Messages : 36 Inscrit : 1-February 07 Membre no 15049 |
Merci FoxP2
ça marche bien, j'avais fait autrement : J'ai repris ton code aloin_flag=flase ou true plûtôt que 1 et 0 mais j'incluais uniquement le if=true dans la fonction Code global $PHP_SELF, $alloin_flag; if (basename($PHP_SELF) != FILENAME_MODULES) { global $cart; if ($this->enabled == true) { if ($cart->show_weight() > '35') { $this->enabled = false; } if ($alloin_flag == true) { $this->enabled = false; } } } ça marchait aussi mais je prefère de loin (alloin ) ton code. J'ai fait cela pour colissomo et pout TNT et c'est ok. Je crois avoir compris la notion de super classes, c'est dans le fichier includes/classes/shipping.php, je ne savais pas où mettre le code. Merci pour le coup main sans toi j'y serais encore. Bonne soirée Ed |
|
9 Feb 2011, 11:02
Message
#11
|
|
Ceinture blanche+ OSC Groupe : Membres Messages : 36 Inscrit : 1-February 07 Membre no 15049 |
Salut FoxP2
excuse de te déranger encore mais juste une dernière question. Je réflechis à une éventuelle evolution de ma boutique. Actuellement les carburants sont dans une seule cat mais dans l'avenir s'il y avait plusieurs cat concernées. ou si simplement si je cherche à subdiviser mes cat en sous cat j'ai essayé avec Code $category_exclude_query = tep_db_query("SELECT products_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " WHERE categories_id >10 and categories_id<45 "); ou Code $category_exclude_query = tep_db_query("SELECT products_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " WHERE categories_id=10 AND categories_id=45 "); ou bien Code $valcat_min = 10; $valcat_max = 45; $category_exclude_query = tep_db_query("SELECT products_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " WHERE categories_id BETWEEN '$valcat_min' AND '$valcat_max' "); dans le cas où les id_cat se suivraient. Mais cela ne marche pas ! peut être que plutôt qu'une boucle FOR il faut faire un WHILE ? Je n'arrive pas bien à comprendre. je vais tester tout de même. Bien à toi Ed |
|
9 Feb 2011, 13:23
Message
#12
|
|
Ceinture blanche+ OSC Groupe : Membres Messages : 36 Inscrit : 1-February 07 Membre no 15049 |
Ok ça marche avec
Code $alloin_flag = false; $products = $cart->get_products(); $category_exclude_query = tep_db_query("SELECT products_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " WHERE categories_id between 9 and 45"); while ($category_exclude = tep_db_fetch_array($category_exclude_query)) { for ($i=0, $n=sizeof($products); $i<$n; $i++) { if(in_array($products[$i]['id'], $category_exclude)) $alloin_flag = true; } } Bonne journée Ed |
|
7 Nov 2011, 13:21
Message
#13
|
|
Ceinture jaune+ OSC Groupe : Membres Messages : 103 Inscrit : 11-October 10 Lieu : Villemomble Membre no 28103 |
Bonjour FoxP2
J'ai repris ton code car je voudrais aussi proposé certain mode de paiement en fonction des produits d'une catégorie je l'ai donc installé et sur mes premier test tout fonctionne enfin presque. Je me suis aperçu que si je mettait plusieurs produit dans la catégorie sur lequel je ne propose qu'un seul type de paiement et bien le premier produit supprime les module mais les autre produit ne les supprime pas. Aurait-il un problème avec le product_id j'ai essayé plusieurs chose sans résultat donc je viens vers toi pour savoir si tu aurai une petite idée. Merci EDIT: Bon après un autre test je me suis aperçu que le problème survenais quand je fait de la duplication de produit apparemment il n'aime pas sa pourtant le product_id est bien différent. Ce message a été modifié par Rusti - 7 Nov 2011, 13:30. -------------------- osCommerce v2.3
|
|
Version bas débit | Nous sommes le : 29th March 2024 - 16:20 |
Ce site est déclaré auprès de la commision Nationale de l'Informatique et des Libertés (déclaration n°: 1043896) |