Jump to content



* * * * * 1 votes

Shipping: Duplicating Table Rate


This topic has been archived. This means that you cannot reply to this topic.
18 replies to this topic

#1   TerryK

TerryK
  • Members
  • 1,359 posts

Posted 20 February 2005 - 05:11 PM

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
Terry Kluytmans

Contribs Installed: Purchase Without Account (PWA); Big Images, Product Availability, Description in Product Listing, Graphical Infobox, Header Tags Controller, Login Box, Option Type Feature, plus many layout changes & other mods of my own, like:

Add order total to checkout_shipment
Add order total to checkout_payment
Add radio buttons at checkout_shipping (for backorder options, etc.)
Duplicate Table Rate Shipping Module
Better Product Review Flow

* If at first you don't succeed, find out if there's a prize for the loser. *

#2   oldfart

oldfart
  • Members
  • 19 posts

Posted 24 September 2005 - 05:59 AM

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

#3   Cowzor

Cowzor
  • Members
  • 79 posts

Posted 08 October 2005 - 03:40 AM

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!

#4   sagemedia

sagemedia
  • Members
  • 2 posts

Posted 26 August 2006 - 04:03 AM

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

#5   cannuck1964

cannuck1964

    Contract Coder

  • Partner
  • 1,136 posts

Posted 26 August 2006 - 12:27 PM

Quote

select configuration_value from TABLE2_CONFIGURATION where configuration_key = 'MODULE_SHIPPING_TABLE2_STATUS'
should be:

Quote

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

Edited by cannuck1964, 26 August 2006 - 12:29 PM.

Peter McGrath
-----------------------------

See my Profile (click here)  for more information and to contact me for professional osCommerce support that includes SEO development, custom development and security implementation

#6   porpoise1954

porpoise1954
  • Members
  • 178 posts

Posted 12 October 2006 - 01:48 PM

View PostTerryK, on Feb 20 2005, 06:11 PM, said:


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:

Quote

 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
*   *  *   *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
Porpoises are most happy when wet!
\ _    \ _   \ _   \ _   \ _   \ _    \ _   \ _  \ _   \ _    \ _   \ _

#7   porpoise1954

porpoise1954
  • Members
  • 178 posts

Posted 12 October 2006 - 02:20 PM

View Postporpoise1954, on Oct 12 2006, 02:48 PM, said:

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??
*   *  *   *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
Porpoises are most happy when wet!
\ _    \ _   \ _   \ _   \ _   \ _    \ _   \ _  \ _   \ _    \ _   \ _

#8   Hade

Hade
  • Members
  • 100 posts

Posted 10 February 2007 - 04:10 PM

Just what I needed. Thank you.
Read the forum rules...

#9   Hade

Hade
  • Members
  • 100 posts

Posted 18 February 2007 - 06:55 PM

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.

Edited by Hade, 18 February 2007 - 06:56 PM.

Read the forum rules...

#10   miamizx

miamizx
  • Members
  • 61 posts

Posted 24 May 2007 - 04:44 PM

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

#11   czarbjones

czarbjones
  • Members
  • 36 posts

Posted 06 July 2007 - 12:52 PM

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.

#12   proxykitten

proxykitten
  • Members
  • 16 posts

Posted 28 November 2007 - 02:54 PM

View Postmiamizx, on May 24 2007, 12:44 PM, said:

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.

#13   thonglith

thonglith
  • Members
  • 4 posts

Posted 05 January 2008 - 11:28 AM

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?

#14   thonglith

thonglith
  • Members
  • 4 posts

Posted 05 January 2008 - 02:08 PM

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!!



View Postthonglith, on Jan 5 2008, 12:28 PM, said:

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?


#15   simonzebu

simonzebu
  • Members
  • 27 posts

Posted 15 September 2008 - 09:39 AM

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.

#16   simonzebu

simonzebu
  • Members
  • 27 posts

Posted 15 September 2008 - 10:17 AM

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.

#17   lcsousa

lcsousa
  • Members
  • 1 posts

Posted 08 July 2011 - 05:34 PM

Six years after your post and is still usefull!
thanks for this ;)

#18   vashichino7

vashichino7
  • Members
  • 265 posts

Posted 25 January 2012 - 08:05 PM

Guys, all the information was extremely helpful! All the modules got installed correctly however; the checkout page does not show the shipping modules...
[img]https://www.savingshub.com/includes/checkout/images/icon_shipping.gif[/img] Step 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?

#19   vashichino7

vashichino7
  • Members
  • 265 posts

Posted 25 January 2012 - 10:19 PM

Okay seems like I got US and Canada Method working, however; international is not working... any clue?