osCommerce France : Accueil Forum Portail osCommerce France Réponses aux questions Foire aux contributions

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Transporteur en focntion d'un type de produits
ed130
posté 7 Feb 2011, 17:55
Message #1


Ceinture blanche+ OSC
Icône de groupe

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 wink.gif ! 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
Go to the top of the page
 
FoxP2
posté 7 Feb 2011, 19:24
Message #2


Ceinture marron OSC
Icône de groupe

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.
Go to the top of the page
 
ed130
posté 8 Feb 2011, 07:40
Message #3


Ceinture blanche+ OSC
Icône de groupe

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
Go to the top of the page
 
ed130
posté 8 Feb 2011, 08:45
Message #4


Ceinture blanche+ OSC
Icône de groupe

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
Go to the top of the page
 
FoxP2
posté 8 Feb 2011, 13:21
Message #5


Ceinture marron OSC
Icône de groupe

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)
Go to the top of the page
 
ed130
posté 8 Feb 2011, 17:02
Message #6


Ceinture blanche+ OSC
Icône de groupe

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
Go to the top of the page
 
FoxP2
posté 8 Feb 2011, 17:21
Message #7


Ceinture marron OSC
Icône de groupe

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)
Go to the top of the page
 
ed130
posté 8 Feb 2011, 17:23
Message #8


Ceinture blanche+ OSC
Icône de groupe

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
Go to the top of the page
 
FoxP2
posté 8 Feb 2011, 17:57
Message #9


Ceinture marron OSC
Icône de groupe

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




Go to the top of the page
 
ed130
posté 8 Feb 2011, 18:52
Message #10


Ceinture blanche+ OSC
Icône de groupe

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 wink.gif ) 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

Go to the top of the page
 
ed130
posté 9 Feb 2011, 11:02
Message #11


Ceinture blanche+ OSC
Icône de groupe

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
Go to the top of the page
 
ed130
posté 9 Feb 2011, 13:23
Message #12


Ceinture blanche+ OSC
Icône de groupe

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
Go to the top of the page
 
Rusti
posté 7 Nov 2011, 13:21
Message #13


Ceinture jaune+ OSC
Icône de groupe

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
Go to the top of the page
 

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



RSS Version bas débit Nous sommes le : 28th March 2024 - 11:33
Ce site est déclaré auprès de la commision Nationale
de l'Informatique et des Libertés (déclaration n°: 1043896)