TerryK Posted February 20, 2005 Share Posted February 20, 2005 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. * Link to comment Share on other sites More sharing options...
oldfart Posted September 24, 2005 Share Posted September 24, 2005 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 Link to comment Share on other sites More sharing options...
Cowzor Posted October 8, 2005 Share Posted October 8, 2005 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! Link to comment Share on other sites More sharing options...
Guest Posted August 26, 2006 Share Posted August 26, 2006 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://www.oscommerce.com/forums/index.php?sho...=224872&hl= I need to find that configuration and duplicat it as well Any help will be greatly appreciated. Thanks Link to comment Share on other sites More sharing options...
cannuck1964 Posted August 26, 2006 Share Posted August 26, 2006 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 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 Link to comment Share on other sites More sharing options...
porpoise1954 Posted October 12, 2006 Share Posted October 12, 2006 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 * * * * * * * * * * * * * * * * * * * * * Porpoises are most happy when wet! \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ Link to comment Share on other sites More sharing options...
porpoise1954 Posted October 12, 2006 Share Posted October 12, 2006 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! \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ Link to comment Share on other sites More sharing options...
Hade Posted February 10, 2007 Share Posted February 10, 2007 Just what I needed. Thank you. Read the forum rules... Link to comment Share on other sites More sharing options...
Hade Posted February 18, 2007 Share Posted February 18, 2007 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. Read the forum rules... Link to comment Share on other sites More sharing options...
miamizx Posted May 24, 2007 Share Posted May 24, 2007 is there a way to define "Number of Products" instead of "weight" or "price"? Link to comment Share on other sites More sharing options...
Guest Posted July 6, 2007 Share Posted July 6, 2007 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. Link to comment Share on other sites More sharing options...
proxykitten Posted November 28, 2007 Share Posted November 28, 2007 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. Link to comment Share on other sites More sharing options...
Guest Posted January 5, 2008 Share Posted January 5, 2008 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? Link to comment Share on other sites More sharing options...
Guest Posted January 5, 2008 Share Posted January 5, 2008 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? Link to comment Share on other sites More sharing options...
simonzebu Posted September 15, 2008 Share Posted September 15, 2008 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. Link to comment Share on other sites More sharing options...
simonzebu Posted September 15, 2008 Share Posted September 15, 2008 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. Link to comment Share on other sites More sharing options...
lcsousa Posted July 8, 2011 Share Posted July 8, 2011 Six years after your post and is still usefull! thanks for this ;) Link to comment Share on other sites More sharing options...
vashichino7 Posted January 25, 2012 Share Posted January 25, 2012 Guys, all the information was extremely helpful! All the modules got installed correctly however; the checkout page does not show the shipping modules... 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? Link to comment Share on other sites More sharing options...
vashichino7 Posted January 25, 2012 Share Posted January 25, 2012 Okay seems like I got US and Canada Method working, however; international is not working... any clue? Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.