Zen Cart Logo
Forums / Built-in Shipping and Payment Modules / Free Shipping Options module, how to exclude some categories?

Free Shipping Options module, how to exclude some categories?

Views: 6,157

Results 1 to 20 of 30
22 Jan 2011, 4:56 AM
#1
tj1 avatar

tj1

Totally Zenned

Join Date:
Mar 2005
Location:
California
Posts:
628
Plugin Contributions:
0

Free Shipping Options module, how to exclude some categories?

When using the Free Shipping Options module, if I want to exclude a category (say category id 35), can I do this simply by adding this?
AND $_SESSION['cart']->in_cart_check('master_categories_id') != 35

// final check for display of Free Options
      if ($this->ck_freeoptions_total or $this->ck_freeoptions_weight or $this->ck_freeoptions_items
AND $_SESSION['cart']->in_cart_check('master_categories_id') != 35
) {
        $this->enabled = true;
      } else {
        $this->enabled = false;
      }
22 Jan 2011, 5:46 AM
#2
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: Free Shipping Options module, how to exclude some categories?

You kind of have the right idea ...

Try this code up in the top of the file add the code in red below the code in black:

      // disable only when entire cart is free shipping
      if (zen_get_shipping_enabled($this->code)) {
          $this->enabled = ((MODULE_SHIPPING_FREEOPTIONS_STATUS == 'True') ? true : false);
      }

// bof: do not show if 1 or more products from master_categories_id 35 is in the cart
      global $cart;
      if (!IS_ADMIN_FLAG && $_SESSION['cart']->in_cart_check('master_categories_id', 35) > 0) {
        $this->enabled = false;
      }
// eof: do not show if 1 or more products from master_categories_id 35 is in the cart

22 Jan 2011, 6:22 AM
#3
tj1 avatar

tj1

Totally Zenned

Join Date:
Mar 2005
Location:
California
Posts:
628
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

Thank you.
If I wanted to exclude more categories, can it be done like this? (I took this from another example you had mentioned, but not sure if it's applied correctly here)

global $cart;
$chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id','1');
$chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id','2');
$chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id','3');
if (!IS_ADMIN_FLAG && $chk_exclude_categories > 0) {
$this->enabled = false;
}
22 Jan 2011, 6:29 AM
#4
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: Free Shipping Options module, how to exclude some categories?

I have not tested it but that looks about right but it is 1:30am and I am very sleepy ... so be sure to test this ...

22 Jan 2011, 7:52 AM
#5
tj1 avatar

tj1

Totally Zenned

Join Date:
Mar 2005
Location:
California
Posts:
628
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

Ajeh:

You kind of have the right idea ...

Try this code up in the top of the file add the code in red below the code in black:

  // disable only when entire cart is free shipping
  if (zen_get_shipping_enabled($this->code)) {
      $this->enabled = ((MODULE_SHIPPING_FREEOPTIONS_STATUS == 'True') ? true : false);
  }

// bof: do not show if 1 or more products from master_categories_id 35 is in the cart
global $cart;
if (!IS_ADMIN_FLAG && $_SESSION['cart']->in_cart_check('master_categories_id', 35) > 0) {
$this->enabled = false;
}
// eof: do not show if 1 or more products from master_categories_id 35 is in the cart


Just testing now, this did not work, free options is still showing when products from this category are in the cart.
Should the code be placed somewhere else?
22 Jan 2011, 7:48 PM
#6
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: Free Shipping Options module, how to exclude some categories?

Post your whole file ...

22 Jan 2011, 8:16 PM
#7
tj1 avatar

tj1

Totally Zenned

Join Date:
Mar 2005
Location:
California
Posts:
628
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

Thank you for looking into this.
The only modifications to the file are this new code to try to exclude the categories, the code to exclude several categories is there on the file, but it's commented out because it gave an error on the admin side. So currently the only active modification is the code to exclude a single category.
Also, in the final check I had previously changed an OR to an AND.
I have highlighted the changes in red.

<?php
/**
 * @package shippingMethod
 * @copyright Copyright 2003-2006 Zen Cart Development Team
 * @copyright Portions Copyright 2003 osCommerce
 * @license [url]http://www.zen-cart.com/license/2_0.txt[/url] GNU Public License V2.0
 * @version $Id: freeoptions.php 4238 2006-08-24 10:01:04Z drbyte $
 */

  class freeoptions extends base {
    var $code, $title, $description, $icon, $enabled;
    var $ck_freeoptions_total, $ck_freeoptions_weight, $ck_freeoptions_items;

// class constructor
    function freeoptions() {
      global $order, $db;

      $this->code = 'freeoptions';
      $this->title = MODULE_SHIPPING_FREEOPTIONS_TEXT_TITLE;
      $this->description = MODULE_SHIPPING_FREEOPTIONS_TEXT_DESCRIPTION;
      $this->sort_order = MODULE_SHIPPING_FREEOPTIONS_SORT_ORDER;
      $this->icon = '';
      $this->tax_class = MODULE_SHIPPING_FREEOPTIONS_TAX_CLASS;
      $this->tax_basis = MODULE_SHIPPING_FREEOPTIONS_TAX_BASIS;

      // disable only when entire cart is free shipping
      if (zen_get_shipping_enabled($this->code)) {
          $this->enabled = ((MODULE_SHIPPING_FREEOPTIONS_STATUS == 'True') ? true : false);
      }
      
// bof: do not show if 1 or more products from master_categories_id 35 is in the cart
      global $cart;
      if (!IS_ADMIN_FLAG && $_SESSION['cart']->in_cart_check('master_categories_id', 35) > 0) {
        $this->enabled = false;
      }
// eof: do not show if 1 or more products from master_categories_id 35 is in the cart
      
/* this not working yet
global $cart;
$chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id','1');
$chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id','35');
$chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id','25');
if (!IS_ADMIN_FLAG && $chk_exclude_categories > 0) {
$this->enabled = false;
}
*/

      if ( ($this->enabled == true) && ((int)MODULE_SHIPPING_FREEOPTIONS_ZONE > 0) ) {
        $check_flag = false;
        $check = $db->Execute("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_SHIPPING_FREEOPTIONS_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
        while (!$check->EOF) {
          if ($check->fields['zone_id'] < 1) {
            $check_flag = true;
            break;
          } elseif ($check->fields['zone_id'] == $order->delivery['zone_id']) {
            $check_flag = true;
            break;
          }
		  $check->MoveNext();
        }

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

// class methods
    function quote($method = '') {
      global $order;
      $order_weight = round($_SESSION['cart']->show_weight(),9);

      // check if anything is configured for total, weight or item
      if ((MODULE_SHIPPING_FREEOPTIONS_TOTAL_MIN !='' or MODULE_SHIPPING_FREEOPTIONS_TOTAL_MAX !='')) {
        $this->ck_freeoptions_total = true;
      } else {
        $this->ck_freeoptions_total = false;
      }
      if ((MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MIN !='' or MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MAX !='')) {
        $this->ck_freeoptions_weight = true;
      } else {
        $this->ck_freeoptions_weight = false;
      }
      if ((MODULE_SHIPPING_FREEOPTIONS_ITEMS_MIN !='' or MODULE_SHIPPING_FREEOPTIONS_ITEMS_MAX !='')) {
        $this->ck_freeoptions_items = true;
      } else {
        $this->ck_freeoptions_items = false;
      }
      if ($this->ck_freeoptions_total or $this->ck_freeoptions_weight or $this->ck_freeoptions_items) {
        $this->enabled = true;
      } else {
        $this->enabled = false;
      }

      // disabled if nothing validates for total, weight or item
      if ($this->enabled) {
        if ($this->ck_freeoptions_total) {
          switch (true) {
          case ((MODULE_SHIPPING_FREEOPTIONS_TOTAL_MIN !='' and MODULE_SHIPPING_FREEOPTIONS_TOTAL_MAX !='')):
// free shipping total should not need adjusting
//            if (($_SESSION['cart']->show_total() - $_SESSION['cart']->free_shipping_prices()) >= MODULE_SHIPPING_FREEOPTIONS_TOTAL_MIN and ($_SESSION['cart']->show_total() - $_SESSION['cart']->free_shipping_prices()) <= MODULE_SHIPPING_FREEOPTIONS_TOTAL_MAX) {
            if (($_SESSION['cart']->show_total()) >= MODULE_SHIPPING_FREEOPTIONS_TOTAL_MIN and ($_SESSION['cart']->show_total()) <= MODULE_SHIPPING_FREEOPTIONS_TOTAL_MAX) {
              $this->ck_freeoptions_total = true;
            } else {
              $this->ck_freeoptions_total = false;
            }
            break;
          case ((MODULE_SHIPPING_FREEOPTIONS_TOTAL_MIN !='')):
//            if (($_SESSION['cart']->show_total() - $_SESSION['cart']->free_shipping_prices()) >= MODULE_SHIPPING_FREEOPTIONS_TOTAL_MIN) {
            if (($_SESSION['cart']->show_total()) >= MODULE_SHIPPING_FREEOPTIONS_TOTAL_MIN) {
              $this->ck_freeoptions_total = true;
            } else {
              $this->ck_freeoptions_total = false;
            }
            break;
          case ((MODULE_SHIPPING_FREEOPTIONS_TOTAL_MAX !='')):
//            if (($_SESSION['cart']->show_total() - $_SESSION['cart']->free_shipping_prices()) <= MODULE_SHIPPING_FREEOPTIONS_TOTAL_MAX) {
            if (($_SESSION['cart']->show_total()) <= MODULE_SHIPPING_FREEOPTIONS_TOTAL_MAX) {
              $this->ck_freeoptions_total = true;
            } else {
              $this->ck_freeoptions_total = false;
            }
            break;
          }
        }

        if ($this->ck_freeoptions_weight) {
          switch (true) {
          case ((MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MIN !='' and MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MAX !='')):
            if ($order_weight >= MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MIN and $order_weight <= MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MAX) {
              $this->ck_freeoptions_weight = true;
            } else {
              $this->ck_freeoptions_weight = false;
            }
            break;
          case ((MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MIN !='')):
            if ($order_weight >= MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MIN) {
              $this->ck_freeoptions_weight = true;
            } else {
              $this->ck_freeoptions_weight = false;
            }
            break;
          case ((MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MAX !='')):
            if ($order_weight <= MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MAX) {
              $this->ck_freeoptions_weight = true;
            } else {
              $this->ck_freeoptions_weight = false;
            }
            break;
          }
        }

        if ($this->ck_freeoptions_items) {
          switch (true) {
          case ((MODULE_SHIPPING_FREEOPTIONS_ITEMS_MIN !='' and MODULE_SHIPPING_FREEOPTIONS_ITEMS_MAX !='')):
// free shipping items should not need adjusting
//            if (($_SESSION['cart']->count_contents() - $_SESSION['cart']->free_shipping_items()) >= MODULE_SHIPPING_FREEOPTIONS_ITEMS_MIN and ($_SESSION['cart']->count_contents() - $_SESSION['cart']->free_shipping_items()) <= MODULE_SHIPPING_FREEOPTIONS_ITEMS_MAX) {
            if (($_SESSION['cart']->count_contents()) >= MODULE_SHIPPING_FREEOPTIONS_ITEMS_MIN and ($_SESSION['cart']->count_contents()) <= MODULE_SHIPPING_FREEOPTIONS_ITEMS_MAX) {
              $this->ck_freeoptions_items = true;
            } else {
              $this->ck_freeoptions_items = false;
            }
            break;
          case ((MODULE_SHIPPING_FREEOPTIONS_ITEMS_MIN !='')):
//            if (($_SESSION['cart']->count_contents() - $_SESSION['cart']->free_shipping_items()) >= MODULE_SHIPPING_FREEOPTIONS_ITEMS_MIN) {
            if (($_SESSION['cart']->count_contents()) >= MODULE_SHIPPING_FREEOPTIONS_ITEMS_MIN) {
              $this->ck_freeoptions_items = true;
            } else {
              $this->ck_freeoptions_items = false;
            }
            break;
          case ((MODULE_SHIPPING_FREEOPTIONS_ITEMS_MAX !='')):
//            if (($_SESSION['cart']->count_contents() - $_SESSION['cart']->free_shipping_items())<= MODULE_SHIPPING_FREEOPTIONS_ITEMS_MAX) {
            if (($_SESSION['cart']->count_contents())<= MODULE_SHIPPING_FREEOPTIONS_ITEMS_MAX) {
              $this->ck_freeoptions_items = true;
            } else {
              $this->ck_freeoptions_items = false;
            }
            break;
          }
        }
      }

/*
echo 'I see count: ' . $_SESSION['cart']->count_contents() . ' free count: ' . $_SESSION['cart']->free_shipping_items() . '<br>' .
'I see weight: ' . $_SESSION['cart']->show_weight() . '<br>' .
'I see total: ' . $_SESSION['cart']->show_total() . ' free price: ' . $_SESSION['cart']->free_shipping_prices() . '<br>' .
'Final check ' . ($this->ck_freeoptions_total ? 'T: YES ' : 'T: NO ') . ($this->ck_freeoptions_weight ? 'W: YES ' : 'W: NO ') . ($this->ck_freeoptions_items ? 'I: YES ' : 'I: NO ') . '<br>';
*/

// final check for display of Free Options
      if ($this->ck_freeoptions_total AND $this->ck_freeoptions_weight or $this->ck_freeoptions_items) {
        $this->enabled = true;
      } else {
        $this->enabled = false;
      }
      
      if ($this->enabled) {
        $this->quotes = array('id' => $this->code,
                              'module' => MODULE_SHIPPING_FREEOPTIONS_TEXT_TITLE,
                              'methods' => array(array('id' => $this->code,
                                                       'title' => MODULE_SHIPPING_FREEOPTIONS_TEXT_WAY,
                                                       'cost'  => MODULE_SHIPPING_FREEOPTIONS_COST + MODULE_SHIPPING_FREEOPTIONS_HANDLING)));
      }

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

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

      return $this->quotes;
    }

    function check() {
      global $db;
      if (!isset($this->_check)) {
        $check_query = $db->Execute("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_SHIPPING_FREEOPTIONS_STATUS'");
        $this->_check = $check_query->RecordCount();
      }
      return $this->_check;
    }

    function install() {
      global $db;
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Free Options Shipping', 'MODULE_SHIPPING_FREEOPTIONS_STATUS', 'True', 'Free Options is used to display a Free Shipping option when other Shipping Modules are displayed.
It can be based on: Always show, Order Total, Order Weight or Order Item Count.
The Free Options module does not show when Free Shipper is displayed.<br /><br />
Setting Total to >= 0.00 and <= nothing (leave blank) will activate this module to show with all shipping modules, except for Free Shipping - freeshipper.<br /><br />
NOTE: Leaving all settings for Total, Weight and Item count blank will deactivate this module.<br /><br />
NOTE: Free Shipping Options does not display if Free Shipping is used based on 0 weight is Free Shipping.
See: freeshipper<br /><br />Do you want to offer per freeoptions rate shipping?', '6', '0', 'zen_cfg_select_option(array(\'True\', \'False\'), ', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Shipping Cost', 'MODULE_SHIPPING_FREEOPTIONS_COST', '0.00', 'The shipping cost will be $0.00', '6', '0', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Handling Fee', 'MODULE_SHIPPING_FREEOPTIONS_HANDLING', '0', 'Handling fee for this shipping method.', '6', '0', now())");

      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Total >=', 'MODULE_SHIPPING_FREEOPTIONS_TOTAL_MIN', '0.00', 'Free Shipping when Total >=', '6', '0', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Total <=', 'MODULE_SHIPPING_FREEOPTIONS_TOTAL_MAX', '', 'Free Shipping when Total <=', '6', '0', now())");

      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Weight >=', 'MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MIN', '', 'Free Shipping when Weight >=', '6', '0', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Weight <=', 'MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MAX', '', 'Free Shipping when Weight <=', '6', '0', now())");

      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Item Count >=', 'MODULE_SHIPPING_FREEOPTIONS_ITEMS_MIN', '', 'Free Shipping when Item Count >=', '6', '0', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Item Count <=', 'MODULE_SHIPPING_FREEOPTIONS_ITEMS_MAX', '', 'Free Shipping when Item Count <=', '6', '0', now())");

      $db->Execute("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_FREEOPTIONS_TAX_CLASS', '0', 'Use the following tax class on the shipping fee.', '6', '0', 'zen_get_tax_class_title', 'zen_cfg_pull_down_tax_classes(', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Tax Basis', 'MODULE_SHIPPING_FREEOPTIONS_TAX_BASIS', 'Shipping', 'On what basis is Shipping Tax calculated. Options are<br />Shipping - Based on customers Shipping Address<br />Billing Based on customers Billing address<br />Store - Based on Store address if Billing/Shipping Zone equals Store zone', '6', '0', 'zen_cfg_select_option(array(\'Shipping\', \'Billing\', \'Store\'), ', now())");
      $db->Execute("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_FREEOPTIONS_ZONE', '0', 'If a zone is selected, only enable this shipping method for that zone.', '6', '0', 'zen_get_zone_class_title', 'zen_cfg_pull_down_zone_classes(', now())");
      $db->Execute("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort Order', 'MODULE_SHIPPING_FREEOPTIONS_SORT_ORDER', '0', 'Sort order of display.', '6', '0', now())");
    }

   function remove() {
     global $db;
     $db->Execute("delete from " . TABLE_CONFIGURATION . " where configuration_key LIKE  'MODULE_SHIPPING_FREEOPTIONS_%'");
   }

    function keys() {
      return array('MODULE_SHIPPING_FREEOPTIONS_STATUS', 'MODULE_SHIPPING_FREEOPTIONS_COST', 'MODULE_SHIPPING_FREEOPTIONS_HANDLING', 'MODULE_SHIPPING_FREEOPTIONS_TOTAL_MIN', 'MODULE_SHIPPING_FREEOPTIONS_TOTAL_MAX', 'MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MIN', 'MODULE_SHIPPING_FREEOPTIONS_WEIGHT_MAX', 'MODULE_SHIPPING_FREEOPTIONS_ITEMS_MIN', 'MODULE_SHIPPING_FREEOPTIONS_ITEMS_MAX', 'MODULE_SHIPPING_FREEOPTIONS_TAX_CLASS', 'MODULE_SHIPPING_FREEOPTIONS_TAX_BASIS', 'MODULE_SHIPPING_FREEOPTIONS_ZONE', 'MODULE_SHIPPING_FREEOPTIONS_SORT_ORDER');
    }
  }
?>
22 Jan 2011, 11:37 PM
#8
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: Free Shipping Options module, how to exclude some categories?

What happens if you uncomment your code so it can run?

NOTE: You will need to change the code a little so it can run in the Admin ...

      // disable only when entire cart is free shipping
      if (zen_get_shipping_enabled($this->code)) {
          $this->enabled = ((MODULE_SHIPPING_FREEOPTIONS_STATUS == 'True') ? true : false);
      }

      if (!IS_ADMIN_FLAG) {
        global $cart;
        $chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id','1');
        $chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id','35');
        $chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id','25');
        if ($chk_exclude_categories > 0) {
          $this->enabled = false;
        }
      }

      if ( ($this->enabled == true) && ((int)MODULE_SHIPPING_FREEOPTIONS_ZONE > 0) ) {
22 Jan 2011, 11:39 PM
#9
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: Free Shipping Options module, how to exclude some categories?

Also, what are your settings that you are using an AND and OR on the final check?

23 Jan 2011, 5:25 AM
#10
tj1 avatar

tj1

Totally Zenned

Join Date:
Mar 2005
Location:
California
Posts:
628
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

I have figured it out the reason why it was not working was because I was using the top level category id, I thought that would automatically apply to subcategories, but it doesn't.

So now the question is, is there a way to just enter the top level category id and have that apply to all subcategories as well?

23 Jan 2011, 2:59 PM
#11
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: Free Shipping Options module, how to exclude some categories?

You could write an extensive piece of code for it ...

I thought somewhere over the last few months I wrote something for a shipping module to take the top level category and build something for that but I cannot recall what or where it might be on the forum ...

24 Jan 2011, 1:08 AM
#12
tj1 avatar

tj1

Totally Zenned

Join Date:
Mar 2005
Location:
California
Posts:
628
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

I went through all 30 pages of the similar thread 'Different shipping methods for different categories' (http://www.zen-cart.com/forum/showthread.php?t=91394&page=30) and 'exclude certain products from free shipping' (http://www.zen-cart.com/forum/showthread.php?t=52890&highlight=top+level+category&page=3), but could not find a solution for looking up all subcategories.

I found some code somewhere else on the web and this is what I've come up with:

/**
 * Get all the subcategory IDs of the parent category whose ID
 * is specified.
 *
 * @param integer $parentID
 * @return array
 */
function getSubcategories ($parentID, $self = false) {
$subs = array ();
if ($self) {
$subs[] = $parentID;
}
_getSubcategories ($parentID, &$subs);
return $subs;
}
 
/**
 * Help function for getSubcategories()
 *
 * @param integer $pid
 * @param array $cats
 * @see getSubcategories()
 */
function _getSubcategories ($pid, &$cats) {
global $db;
$sql = "SELECT c.categories_id FROM " . TABLE_CATEGORIES . " c WHERE c.parent_id=$pid";
$result = $db->Execute($sql);
while (!$result->EOF) {
$cats[] = $result->fields['categories_id'];
_getSubcategories ($result->fields['categories_id'], &$cats);
$result->MoveNext();
}
}

$top_cat_ids = array('1','25','35');
$exclude_categories = getSubcategories($top_cat_ids, true)      
            
      global $cart;
      if (!IS_ADMIN_FLAG && $_SESSION['cart']->in_cart_check('master_categories_id', $exclude_categories) > 0) {
        $this->enabled = false;
      }

Would this work?

27 Jan 2011, 4:34 PM
#13
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: Free Shipping Options module, how to exclude some categories?

I believe the problem is in the $sendto variable ...

    $account_query = $db->Execute("select
    entry_postcode from 
    " . TABLE_ADDRESS_BOOK . " where address_book_id = '" . (int)$sendto . "'");
    $klient['kod']=$account_query->fields['entry_postcode'];

From what I can see, that variable doesn't equal anything, unless you happen to go to the Shipping Estimator and then it will be set to what the customer is looking at on the shipping estimator but not necessarily what they select on checkout ...

What if instead you use for $sendto:
$_SESSION['sendto']

28 Jan 2011, 3:45 AM
#14
tj1 avatar

tj1

Totally Zenned

Join Date:
Mar 2005
Location:
California
Posts:
628
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

The function works, I've put it in the extra functions folder.

Now I've got all the category ids in an array called $all_cats_exclude

I'm trying to get it to work here by using

      global $cart;
      if (!IS_ADMIN_FLAG && $_SESSION['cart']->in_cart_check('master_categories_id', $all_cats_exclude) > 0) {
        $this->enabled = false;
      }

But this is not working.

Does the function $_SESSION['cart']->in_cart_check('master_categories_id') work with an array or would I need to create a loop to run through all the values in the array?

(sorry for all the questions, as you can see my php knowledge is very basic)

28 Jan 2011, 4:58 AM
#15
tj1 avatar

tj1

Totally Zenned

Join Date:
Mar 2005
Location:
California
Posts:
628
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

This is what I'm using and it seems to finally work.

     if (!IS_ADMIN_FLAG) {
        global $cart;
        foreach($all_cats_exclude as $key => $cat_id_value){
        $chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id',$cat_id_value);
        }
        if ($chk_exclude_categories > 0) {
          $this->enabled = false;
        }
      }

For the file with the function to get the all the subcategories, it should go in the extra functions folder both in the catalog and admin; otherwise in the admin section it will give the 'call to undefined function" error.

28 Jan 2011, 2:23 PM
#16
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: Free Shipping Options module, how to exclude some categories?

How are you building your array: $all_cats_exclude

28 Jan 2011, 9:34 PM
#17
tj1 avatar

tj1

Totally Zenned

Join Date:
Mar 2005
Location:
California
Posts:
628
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

sorry, I forgot to include that, here's the complete code that goes in the freeoptions.php file
Just enter your top category ids in $top_cat_ids = array('1','2','3');

$top_cat_ids = array('1','2','3');
$all_cats_exclude = array();
foreach($top_cat_ids as $key => $top_id_value){
$subcat_results = getSubcategories($top_id_value, true);
	foreach($subcat_results as $key => $ind_cat_id_value){
		$all_cats_exclude[] = $ind_cat_id_value;
	} 

}

     if (!IS_ADMIN_FLAG) {
        global $cart;
        foreach($all_cats_exclude as $key => $cat_id_value){
        $chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id',$cat_id_value);
        }
        if ($chk_exclude_categories > 0) {
          $this->enabled = false;
        }
      }

Hope this helps someone, I saw many posts asking how to get all the subcategories by entering the top level category, but I could find any available solution.

25 Feb 2011, 5:54 AM
#18
geodave avatar

geodave

New Zenner

Join Date:
Apr 2009
Posts:
17
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

I was so happy when I found this, but auugh, I just cannot get it to exclude a category from the free shipping option.

// disable only when entire cart is free shipping
      if (zen_get_shipping_enabled($this->code)) {
          $this->enabled = ((MODULE_SHIPPING_FREEOPTIONS_STATUS == 'True') ? true : false);
      }

      //Magical free shipping category exclusion code
      $top_cat_ids = array('108','9999','9999');
      $all_cats_exclude = array();
      foreach($top_cat_ids as $key => $top_id_value){
        $subcat_results = getSubcategories($top_id_value, true);
        foreach($subcat_results as $key => $ind_cat_id_value){
          $all_cats_exclude[] = $ind_cat_id_value;
        } 
      }

      if (!IS_ADMIN_FLAG) {
        global $cart;
        foreach($all_cats_exclude as $key => $cat_id_value){
          $chk_exclude_categories += $_SESSION['cart']->in_cart_check('master_categories_id',$cat_id_value);
        }
        if ($chk_exclude_categories > 0) {
          $this->enabled = false;
        }
      }
      //end category exclusion code

I have that in my freeoptions.php file. When I have a shopping cart that qualifies for free shipping, then I add a product of master category 108, it still just offers free shipping.

Am I missing something crucial here?

25 Feb 2011, 2:20 PM
#19
ajeh avatar

ajeh

Oba-san

Join Date:
Sep 2003
Location:
Ohio
Posts:
62,757
Plugin Contributions:
1

Re: Free Shipping Options module, how to exclude some categories?

Make sure that when you use the 108 that this is actually the master_categories_id in the products table ...

You can check this by going to the Catalog ... Categories/Products ... and find the Product and click E for edit and see what it reads for the:
Product Master Category:

What are your settings in the Free Shipping Options freeoptions shipping module that you see when you click on it and look at the right panel?

1 Mar 2011, 6:28 AM
#20
geodave avatar

geodave

New Zenner

Join Date:
Apr 2009
Posts:
17
Plugin Contributions:
0

Re: Free Shipping Options module, how to exclude some categories?

Yep, it's definitely the master categories ID.
In addition, my settings for the Free Shipping Options are unchanged from the default.

I cannot seem to get the addition of a product from category 108 to void the free shipping option and present regular shipping options. My category ID should be in the all_cats_exclude() array in the above code, right? I've tried it in both arrays and still I just get a free shipping option.