Latest News: (loading..)

Archived

This topic is now archived and is closed to further replies.

TerryK

Shipping: Duplicating Table Rate

19 posts in this topic

I've answered posts about how to duplicate the table-based shipping modules so many times that I thought it was time to post it here. (There are contributions available as well, but it seems that people frequently neglect to check there...)

 

Anyhow, it's simple! For osC 2.2-MS2, here's all you need to do:

 

Copy the following code (a customization of /catalog/includes/modules/shipping/table.php):

 

<?php
/*
 $Id: c1e.php,v 1.27 2003/02/05 22:41:52 hpdl Exp $

 osCommerce, Open Source E-Commerce Solutions
 http://www.oscommerce.com

 Copyright (c) 2003 osCommerce

 Released under the GNU General Public License
*/

 class c1e {
   var $code, $title, $description, $icon, $enabled;

// class constructor
   function c1e() {
     global $order;

     $this->code = 'c1e';
     $this->title = MODULE_SHIPPING_C1E_TEXT_TITLE;
     $this->description = MODULE_SHIPPING_C1E_TEXT_DESCRIPTION;
     $this->sort_order = MODULE_SHIPPING_C1E_SORT_ORDER;
     $this->icon = '';
     $this->tax_class = MODULE_SHIPPING_C1E_TAX_CLASS;
     $this->enabled = ((MODULE_SHIPPING_C1E_STATUS == 'True') ? true : false);

     if ( ($this->enabled == true) && ((int)MODULE_SHIPPING_C1E_ZONE > 0) ) {
       $check_flag = false;
       $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_SHIPPING_C1E_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
       while ($check = tep_db_fetch_array($check_query)) {
         if ($check['zone_id'] < 1) {
           $check_flag = true;
           break;
         } elseif ($check['zone_id'] == $order->delivery['zone_id']) {
           $check_flag = true;
           break;
         }
       }

       if ($check_flag == false) {
         $this->enabled = false;
       }
     }
   }

// class methods
   function quote($method = '') {
     global $order, $cart, $shipping_weight, $shipping_num_boxes;

     if (MODULE_SHIPPING_C1E_MODE == 'price') {
       $order_total = $cart->show_total();
     } else {
       $order_total = $shipping_weight;
     }

     $c1e_cost = split("[:,]" , MODULE_SHIPPING_C1E_COST);
     $size = sizeof($c1e_cost);
     for ($i=0, $n=$size; $i<$n; $i+=2) {
       if ($order_total <= $c1e_cost[$i]) {
         $shipping = $c1e_cost[$i+1];
         break;
       }
     }

     if (MODULE_SHIPPING_C1E_MODE == 'weight') {
       $shipping = $shipping * $shipping_num_boxes;
     }

     $this->quotes = array('id' => $this->code,
                           'module' => MODULE_SHIPPING_C1E_TEXT_TITLE,
                           'methods' => array(array('id' => $this->code,
                                                    'title' => MODULE_SHIPPING_C1E_TEXT_WAY,
                                                    'cost' => $shipping + MODULE_SHIPPING_C1E_HANDLING)));

     if ($this->tax_class > 0) {
       $this->quotes['tax'] = tep_get_tax_rate($this->tax_class, $order->delivery['country']['id'], $order->delivery['zone_id']);
     }

     if (tep_not_null($this->icon)) $this->quotes['icon'] = tep_image($this->icon, $this->title);

     return $this->quotes;
   }

   function check() {
     if (!isset($this->_check)) {
       $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_SHIPPING_C1E_STATUS'");
       $this->_check = tep_db_num_rows($check_query);
     }
     return $this->_check;
   }

   function install() {
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) VALUES ('Enable Table Method', 'MODULE_SHIPPING_C1E_STATUS', 'True', 'Do you want to offer table rate shipping?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Shipping Table', 'MODULE_SHIPPING_C1E_COST', '25:8.50,50:5.50,10000:0.00', 'The shipping cost is based on the total cost or weight of items. Example: 25:8.50,50:5.50,etc.. Up to 25 charge 8.50, from there to 50 charge 5.50, etc', '6', '0', now())");
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Table Method', 'MODULE_SHIPPING_C1E_MODE', 'weight', 'The shipping cost is based on the order total or the total weight of the items ordered.', '6', '0', 'tep_cfg_select_option(array(\'weight\', \'price\'), ', now())");
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Handling Fee', 'MODULE_SHIPPING_C1E_HANDLING', '0', 'Handling fee for this shipping method.', '6', '0', now())");
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Tax Class', 'MODULE_SHIPPING_C1E_TAX_CLASS', '0', 'Use the following tax class on the shipping fee.', '6', '0', 'tep_get_tax_class_title', 'tep_cfg_pull_down_tax_classes(', now())");
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Shipping Zone', 'MODULE_SHIPPING_C1E_ZONE', '0', 'If a zone is selected, only enable this shipping method for that zone.', '6', '0', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
     tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SHIPPING_C1E_SORT_ORDER', '0', 'Sort order of display.', '6', '0', now())");
   }

   function remove() {
     tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
   }

   function keys() {
     return array('MODULE_SHIPPING_C1E_STATUS', 'MODULE_SHIPPING_C1E_COST', 'MODULE_SHIPPING_C1E_MODE', 'MODULE_SHIPPING_C1E_HANDLING', 'MODULE_SHIPPING_C1E_TAX_CLASS', 'MODULE_SHIPPING_C1E_ZONE', 'MODULE_SHIPPING_C1E_SORT_ORDER');
   }
 }
?>

 

Paste it into a new blank file, and save it as, say, /catalog/includes/modules/shipping/usa1.php

 

With 'match case' enabled in your search, look for c1e and replace all instances with usa1.

 

Then do a second 'match case' search for C1E and replace all instances with USA1.

 

Now copy this code (a customization of /catalog/includes/languages/english/modules/shipping/table.php):

 

<?php
/*
 $Id: c1e.php,v 1.5 2002/11/19 01:48:08 dgw_ Exp $

 osCommerce, Open Source E-Commerce Solutions
 http://www.oscommerce.com

 Copyright (c) 2002 osCommerce

 Released under the GNU General Public License
*/

define('MODULE_SHIPPING_C1E_TEXT_TITLE', 'Canada Xpress Post: Region 1');
define('MODULE_SHIPPING_C1E_TEXT_DESCRIPTION', 'Canada Xpress Post: Region 1');
define('MODULE_SHIPPING_C1E_TEXT_WAY', '2-3 business days');
define('MODULE_SHIPPING_C1E_TEXT_WEIGHT', 'Weight');
define('MODULE_SHIPPING_C1E_TEXT_AMOUNT', 'Amount');
?>

 

Paste it into a new blank file, change the text to the way you want it, and save it as, say, /catalog/includes/languages/english/modules/shipping/usa1.php

 

With 'match case' enabled in your search, look for c1e and replace all instances with usa1.

 

Then do a second 'match case' search for C1E and replace all instances with USA1.

 

Upload the files to your server, then go to your admin screen -> modules -> shipping and install the new module. Then edit prices, etc. and you should be set.

 

For additional table methods, just repeat the steps above but with new search criteria (i.e. change c1e to usa2, C1E to USA2, etc. (or whatever you want to call them).

 

Something else to keep in mind...

 

In my store, I wanted to include delivery timeframes for each of my shipping methods. Using zone shipping, I couldn't find a way to specify a different comment for each zone, so my solution was to create 20+ different table rates to cover all of the situations. After installing the first 10, my shipping modules kept breaking on me. After two days of trying to find the error (recreating files, uninstalling and reinstalling, etc.), I finally thought to check my database to see if there was something wrong there. Bingo!

 

For shipping modules, the database table keeps track of all the shipping module file names in a field with a maximum of 255 characters. My initial file names were 15 characters or so each (including the .php extension at the end), and the total exceeded the allowable number of characters. By renaming all of my modules to

3-character names, I was able to fit all of them in, with a bit of room to spare!

 

HTH,

 

Terry

Share this post


Link to post
Share on other sites

Thamks Terry this tip saved me a lot of problems.

I will now move on to the next one. That is how to add a table method based on quantity ordered.

 

Ken Martin :D :D

Share this post


Link to post
Share on other sites

You little ripper :thumbsup: thanks. I'd been wanting to dublicate my Zone rates for Economy Mail and Air Mail shipping, and used the same priniciples on my files. Cheers!

Share this post


Link to post
Share on other sites

I tried your method and I am getting the error error in the admin:

 

1146 - Table 'ashantic_main.TABLE2_CONFIGURATION' doesn't exist

 

select configuration_value from TABLE2_CONFIGURATION where configuration_key = 'MODULE_SHIPPING_TABLE2_STATUS'

 

I posted a request on how to duplicate the table rate module. I happen to need two of them working independently.

 

http://forums.oscommerce.com/index.php?sho...=224872&hl=

 

I need to find that configuration and duplicat it as well

 

Any help will be greatly appreciated.

 

Thanks

Share this post


Link to post
Share on other sites
select configuration_value from TABLE2_CONFIGURATION where configuration_key = 'MODULE_SHIPPING_TABLE2_STATUS'

should be:

select configuration_value from TABLE_CONFIGURATION where configuration_key = 'MODULE_SHIPPING_TABLE2_STATUS'

 

unless you have more then one configuration table in the DB ;)

 

cheers,

Peter M

Share this post


Link to post
Share on other sites

 

Thanks for your great contribution (which other people obviously have working). However, having made the seperate files for the various (13) methods I need, I have hit a snag at the first hurdle:

 

I followed the instructions and from your line:

 

?class c1e {

? ?var $code, $title, $description, $icon, $enabled;

 

I have the following code:

  • Line 14: class doml {
    ?????????????var $code, $title, $description, $icon, $enabled;

Unfortunately, once installed and I login to admin/shipping, I get this error:

 

Fatal error: Cannot redeclare class doml in /************/includes/modules/shipping/dom_let.php on line 14

 

:huh:

I can't work out why I should be getting this problem if it seems to be working well for everyone else. Can you please help?

 

Cheers,

Steve

Share this post


Link to post
Share on other sites
I have the following code:
  • Line 14: class doml {
    ?????????????var $code, $title, $description, $icon, $enabled;

Unfortunately, once installed and I login to admin/shipping, I get this error:

 

Fatal error: Cannot redeclare class doml in /************/includes/modules/shipping/dom_let.php on line 14

 

:huh:

I can't work out why I should be getting this problem if it seems to be working well for everyone else. Can you please help?

 

Cheers,

Steve

 

Oops! :blush:

 

Sussed that problem, somehow managed to duplicate the file into the languages section.

 

However, I now seem to have a different problem - the tables are not appearing in the admin section when I "install" Table Rates!?! Is there something else I should be doing to get all the tables to appear??

Share this post


Link to post
Share on other sites

Exactly what I needed for seperate UK/Europe/USA/RestOfWorld shipping. Thank you!

 

I think another way to overcome that 255 character limit may be to alter the database field in PHPMyAdmin, perhaps to a bigger varchar field.

Share this post


Link to post
Share on other sites

is there a way to define "Number of Products" instead of "weight" or "price"?

Share this post


Link to post
Share on other sites

Without changing everything you could simply enter 1 as the weight for every product. Then ship based on weight. If people buy multiple quantities or multiple products then they will all add up to tell you how many things people have bought. :)

 

This wont work if you want multiple methods of shipping if one of them is based on actual weight.

Share this post


Link to post
Share on other sites
is there a way to define "Number of Products" instead of "weight" or "price"?

 

I did this by using the "weight" field when entering products. I just put a "1" on every product and then used table rate shipping based on weight.

 

In other words:

 

Pencil (product weight: 1)

Eraser (product weight: 1)

Thumbtack (product weight: 1)

 

Table rate shipping based on weight:

2:5.95,8:10.95

 

Then if you have 2 pencils and 4 erasers (weight of 6), it will charge $10.95 shipping.

 

It's a hack but I hope that helps.

Share this post


Link to post
Share on other sites

Hi,

 

First of all, thank you for your contribution. It makes things easier to understand and to mod. At least 99% easier.

Though I have something I wanted to ask you about.

 

I duplicated "table.php" following your advice in two other files in order to manage shipping to France and to WorldWide (france.php & world.php).

 

I tested the two files on my local version of oscommerce, which is an identical version of my production version (I downloaded and dumped the database from the online version) and it works perfectly. The french version will show up when I set the shipping address in France and the WorldWide version would be used if I set the address outside France.

 

When I upload the new files online and set them accordingly to my local version, they appear correctly in the admin but, weirdly enough, only the France version is working in the checkout shipping process. The WorldWide version won't show up when I set the shipping address outside France. And this despite the fact that I included all the countries in a region named 'International' and used it to set the "world.php" file.

 

The only thing that's different between the online and the local versions is that the online version still has the original "table.php" shipping module running since I didn't want to remove it before having the new ones working. I just set it to false since the french version is working perfectly. Really weird...

 

Do you have any idea or did something like that ever happened to you?

Share this post


Link to post
Share on other sites

Don't bother, I found my mistake.

I changed line 26:

 

$this->enabled = ((MODULE_SHIPPING_WORLD_STATUS == 'True') ? true : false);

 

Instead of 'True' I did set it to False because I wanted the module to be set on the false status when installed. Because in my mind the module needs to be set before being made available on the site. Instead I should have changed the line 94:

 

tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) VALUES ('Enable Table Method', 'MODULE_SHIPPING_WORLD_STATUS', 'True', 'Do you want to offer table rate shipping?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");

 

 

Anyway... the WorldWide shipping module now shows up and works perfectly, though I ran into some trouble again because I used semi-colon instead of comma to separate the shipping rates.

 

Thanks a million for your contribution TerryK, it saved me a lot of time!!

 

 

 

Hi,

 

First of all, thank you for your contribution. It makes things easier to understand and to mod. At least 99% easier.

Though I have something I wanted to ask you about.

 

I duplicated "table.php" following your advice in two other files in order to manage shipping to France and to WorldWide (france.php & world.php).

 

I tested the two files on my local version of oscommerce, which is an identical version of my production version (I downloaded and dumped the database from the online version) and it works perfectly. The french version will show up when I set the shipping address in France and the WorldWide version would be used if I set the address outside France.

 

When I upload the new files online and set them accordingly to my local version, they appear correctly in the admin but, weirdly enough, only the France version is working in the checkout shipping process. The WorldWide version won't show up when I set the shipping address outside France. And this despite the fact that I included all the countries in a region named 'International' and used it to set the "world.php" file.

 

The only thing that's different between the online and the local versions is that the online version still has the original "table.php" shipping module running since I didn't want to remove it before having the new ones working. I just set it to false since the french version is working perfectly. Really weird...

 

Do you have any idea or did something like that ever happened to you?

Share this post


Link to post
Share on other sites

Thanks a mill for this info.

 

Just a note of caution to those implementing it. DO NOT USE underscore character in your shipping modules' names. It all goes horribly wrong.

Share this post


Link to post
Share on other sites

Thanks a mill for this info.

 

Just a note of caution to those implementing it. DO NOT USE underscore character in your shipping modules' names. It all goes horribly wrong.

Share this post


Link to post
Share on other sites

Guys, all the information was extremely helpful! All the modules got installed correctly however; the checkout page does not show the shipping modules...

icon_shipping.gifStep 4: Select a Shipping Method Fill out your shipping address information above to calculate your shipping costs.

 

When i fill out a address, it does not show up... anywhere i should look?

Share this post


Link to post
Share on other sites