Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Get 1 Free


kymation

Recommended Posts

Hi All

 

There is a fantastic addition to this add on by dmordred in the contributions page.

 

It puts a link on the main product - to the free product and it works great.

 

 

However, it would be nice to be able to display a message in the free product description page that links to the main product?

 

At the moment, I can't see how to do this.

 

Any suggestions?

 

Thanks

 

 

YES !

Modify catalog/product_info.php to obtain:

<?php
// start Get 1 Free
    // Is this product gratos somewhere ?
   $get_1_free_query = tep_db_query("select products_id,
                                            products_free_id,
                                            get_1_free_sheduled_date,
                                            get_1_free_expires_date
                                     from " . TABLE_GET_1_FREE . "
                                     where products_free_id = '" . (int)$product_info['products_id'] . "'
                                       and get_1_free_sheduled_date < now()
                                       and (get_1_free_expires_date > now()
                                       or  get_1_free_expires_date = 0 )
                                       and status = '1'"
                                   );
   // Yes ? give his name
   if (tep_db_num_rows($get_1_free_query) > 0) {
     $free_product = tep_db_fetch_array($get_1_free_query);
     $query_gratos= tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id='".$free_product['products_id']."' and language_id = '" . (int)$languages_id . "'");
     $genere_gratos=tep_db_fetch_array($query_gratos);
     echo TEXT_GET_1_FREE_GRATOS.$genere_gratos['products_name'].'<br>';
     }

   // Display promotional text if this product qualifies for free product(s)
   $get_1_free_query = tep_db_query("select pd.products_name,

 

and catalog/includes/languages/<your language>/product_info.php

define ('TEXT_GET_1_FREE_GRATOS','Voyez notre offre avec : ');
?>

 

2 problems remain:

What happens when more that one product is offered with this one ?

How make a link to the promoted product: rewriting causes an infinite loop when i use echo'<a href="'.tep_href_link( PRODUCT_INFO, $free_product['products_id']).'">'.TEXT_GET_1_FREE_GRATOS.$genere_gratos['products_name'].'</a><br>'; ( code by memory - verify)

 

I wait your anserws !

 

bebe cash 59

Version OSCOM CE Phoenix v1.0.5.9 + french language (v1.0.5.8 & Merge pull request #955 from gburton/1.0.5.9

php 7.1.3 MySQL 5.7.17  local with easyphp 

adds on: shipping spu 

common browser: Chrome

Shop multishop 2.2 with many addons.

Link to comment
Share on other sites

Sorry !

in post #299, i have forgotten a modification into catalog/admin/get_1_free.php:

 

?>
     <tr><form name="new_get_1_free" <?php echo 'action="' . tep_href_link(FILENAME_GET_1_FREE, tep_get_all_get_params(array('action', 'info', 'fID')) . 'action=' . $form_action, 'NONSSL') . '"'; ?> method="POST" ,enctype="multipart/form-data">
<?php 
     if ($form_action == 'update') echo tep_draw_hidden_field('get_1_free_id', $_GET['fID']); 
?>

 

editing is now forbidden --> new post !

Good night !

Hi All!

 

Hey ! my memory dump give errors !

Table get_1_free must be modified to have some place for sheduled_date:

in your base execute SQL:

ALTER TABLE `get_1_free` ADD `get_1_free_sheduled_date` DATETIME NULL DEFAULT NULL AFTER `get_1_free_last_modified` 

 

Sorry one more time !

 

The end

Version OSCOM CE Phoenix v1.0.5.9 + french language (v1.0.5.8 & Merge pull request #955 from gburton/1.0.5.9

php 7.1.3 MySQL 5.7.17  local with easyphp 

adds on: shipping spu 

common browser: Chrome

Shop multishop 2.2 with many addons.

Link to comment
Share on other sites

YES !

Modify catalog/product_info.php to obtain:

<?php
// start Get 1 Free
    // Is this product gratos somewhere ?
   $get_1_free_query = tep_db_query("select products_id,
                                            products_free_id,
                                            get_1_free_sheduled_date,
                                            get_1_free_expires_date
                                     from " . TABLE_GET_1_FREE . "
                                     where products_free_id = '" . (int)$product_info['products_id'] . "'
                                       and get_1_free_sheduled_date < now()
                                       and (get_1_free_expires_date > now()
                                       or  get_1_free_expires_date = 0 )
                                       and status = '1'"
                                   );
   // Yes ? give his name
 if (tep_db_num_rows($get_1_free_query)>0){
   echo TEXT_GET_1_FREE_GRATOS .'<ul>';
   while ($free_product = tep_db_fetch_array($get_1_free_query)) {
     $query_gratos= tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id='".$free_product['products_id']."' and language_id = '" . (int)$languages_id . "'");
     $genere_gratos=tep_db_fetch_array($query_gratos);
     echo '<li>'.'<a href="'.tep_href_link(FILENAME_PRODUCT_INFO,'products_id='.$free_product['products_id']).'">'.$genere_gratos['products_name'].'</a>'.'</li>';
   }
   echo '</ul>';
 }
   // Display promotional text if this product qualifies for free product(s)

 

Note that this code give ALL the items that can receive this same gratis product and a link to the info page that the customer choises.

 

This codes are very useful when a contrib as Salemaker contraries the installation of qproduct

 

I wait your anserws !

 

bebe cash 59

Version OSCOM CE Phoenix v1.0.5.9 + french language (v1.0.5.8 & Merge pull request #955 from gburton/1.0.5.9

php 7.1.3 MySQL 5.7.17  local with easyphp 

adds on: shipping spu 

common browser: Chrome

Shop multishop 2.2 with many addons.

Link to comment
Share on other sites

  • 2 months later...

Hi,

 

This Christmas we would like to let our customers choose one free product of their choise from whithin an specific category. The thing is:

 

- The customer should be able to receive ONE product for free from a category of our choice. Just one free product per purchase.

- It's not a buy one product and get 1 product free, but buy ANY product and get 1 product, of their choice, from a whole category for free.

- In any other case those free products have a price. That's it. ONE is free but if the customers adds more products from that categorie those should be charged.

 

We wondered if any of you would be willing to develop the Get-1-free mod to suit our needs. We would be willing to pay for that mod and we would be ready to share the contribution once the job has been done.

 

Anyone interested, please, PM me.

 

Thanks in advance,

 

Kind regards.

Link to comment
Share on other sites

Anybody know how to get the Buy One get one to show up under the Specials tab? Seeing as it is a "Sale" it would be great if that could also show up when someone Clicks on the "Specials". So if there is a product that is buy one get on free, a customer can see that promo when they look at other Sales items.

Link to comment
Share on other sites

Specials are triggered by an entry in the specials database table. You could add your product there as well, but that would be extra work and probably cause some undesirable side effects (strikeout price, for one.) It would be better to modify the specials box and the specials page to check the get_1_free table as well, then combine the results.

 

Regards

Jim

See my profile for a list of my addons and ways to get support.

Link to comment
Share on other sites

  • 2 weeks later...

I have a question about Get SAME free item as the item they purchased -

 

How can I check stock on shopping cart page in this case? Say I have 5 items in-stock, and they can buy one get one free. Currently if I input 5 as purchased qty, the free item shows as 1, which ends up 6 totally. And I can check out from that point. The stock check is by product id, but when 2 items are the same but show in 2 different rows, the same id will repeat twice in the array and both can pass the stock check, since 6 and 1 are both <= 5.

 

Another interesting thing I found is, if I bought 1 item in the cart, it shows 1 free item; but if I want to change qty in the cart, say buy 2, the qty stays same (1) if I do this change in the PURCHASED item qty box; but if do it in FREE ITEM qty box, it works - buy becomes 2, and free is still 1 (I have limited free to 1). Same thing if I want to decrease the qty that I buy. I have to change qty in free item qty box instead of buy qty box... which would definately confuses my customers.

 

Any fix for these 2 issues?

 

Thanks a bunch! I really want to make this great mod to work!

Edited by liz0
Link to comment
Share on other sites

That is a known bug in stock checking. There is no fix at this time.

 

I haven't seen the quantity change bug that you mentioned. I'll have to take a look at that when I get the time. Which will probably be next year.

 

Regards

Jim

See my profile for a list of my addons and ways to get support.

Link to comment
Share on other sites

  • 2 weeks later...

i have some questions about this, its what i want but not sure if it can do the following:

 

1. can the free product be specified by the admin (customer buys 30,000 flyers and gets 1 x A1 Poster free added to their cart)

2. can the customer remove the free product without having to reduce the quantity of there initial order

3. do you think it would be easy enough for me to modify this code to add the free product based on an attributes value rather than the products quantity ?

 

thanks,

 

- Andy

Link to comment
Share on other sites

1. Yes.

2. You already answered.

3. Depends on your level of expertise with PHP and osCommerce. It can certainly be done, but it involves changes to the cart class.

 

Regards

Jim

See my profile for a list of my addons and ways to get support.

Link to comment
Share on other sites

Hello,

 

I am looking for an add-on that will allow customers to get a discount on a third item (for example), if two other items are purchased. These can't need to all be the same item, as the store that this is for sells entirely one-of-a-kind merchandise. It looks like this add-on is close, but 1) can it handle a discount value instead of a zero value? 2) Early on there were a lot of people who were asking if it could be any item, not just multiples of one item; did that ever get implemented?

 

If this add-on isn't suited to my purposes, does anyone know of one that is a better fit? (I haven't spotted one in my searches of the community add-ons... at least not yet.)

 

Thanks!

Link to comment
Share on other sites

thanks for replying Jim im installing this contribution now but it appears there are files missing from "BUG FIX: wrong free product count in the includesclasses/shopping_cart.php" on the contribution page.

 

in the install it says catalog/admin/includes/functions/get_1_free.php but there is no folder "functions" i cant find it in some of the earlier updates either ?

Link to comment
Share on other sites

before i asked if its easy enough to add the free product based on an attributes value. i use an attribute called quantity as my quantities are 5,000 6,000, 10,000 (didnt want an editable user input)

 

so i created a function to check the quantity value and changed the get1free function in includes/classes/shopping_cart.php

 

i only had to change 1 line in this function:

 

$products_quantity = $this->contents[$products_id]['qty'];

change to

 

$products_quantity = $this->get_atrribute_quantity();

 

this works great and adds the product but i am unable to remove the free product, i suspect it is removing it but when the shopping cart page reloads its adding it again.

 

do you have any suggestions ?

Link to comment
Share on other sites

Get 1 Free was designed to add the free product automatically. This may make it impossible to remove the free product without removing the qualification for the free product.

 

Regards

Jim

See my profile for a list of my addons and ways to get support.

Link to comment
Share on other sites

just read your description of the contribution again my appologies i read it wrong, again. im blaming late nights and lack of sleep >_<

 

no worries though, ill create another function to ask the customer if they want the product or not. if yes then add product if not dont add product and add another field to the customers basket "wants_free_product" yes/no and have the get1free function checking this to stop it from adding automatically. thanks for the response & the contribution :thumbsup:

Link to comment
Share on other sites

  • 2 months later...

This addon is fantastic!

 

Hmm, something diden't work right...

 

 

What I would have written, was:

 

Is it possible, that instead of the product is added in the cart, as another product, it will add the free products under the bought product, like it was a product attribute - Or something else.

 

The problem for me, is that if the customer would like to delete the product in the cart, the customer will have to write "0" in both the bought product, and the free product, to get it out of the cart.

 

It would be smarter, that if the customer just delete the bought product, it also will remove the free product.

 

Possible?

Link to comment
Share on other sites

  • 3 months later...

I have spent he last two days trying to get this to work. I have the admin side working and the message on the product info page but the free product does not show up in the cart.

I have added the extra get 1 free mods and have been through the forum and the extra changes to this contribution. Can anyone help?

I am using rc2.2a with php 5.

Link to comment
Share on other sites

You've made an error in the installation. It's most likely in the shopping cart class file. Check all of your edits carefully by comparing your files to the ones supplied in the Get 1 Free package.

 

Regards

Jim

See my profile for a list of my addons and ways to get support.

Link to comment
Share on other sites

Hi Jim,

Here is my modified class/shopping_cart.php file.

I have used winmerge to compare the two files and checked it with webuilder. No syntax errors found. I also use MVs but you wrote that so it blends fine with Get 1 Free.

Please have a look and let me know what you see. I've tried everything.

<?php
/*
 $Id: shopping_cart.php 1739 2007-12-20 00:52:16Z hpdl $

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

 Copyright (c) 2003 osCommerce

 Released under the GNU General Public License
*/

 class shoppingCart {
   var $contents, $total, $weight, $cartID, $content_type;

   function shoppingCart() {
     $this->reset();
   }

   function restore_contents() {
     global $customer_id;

     if (!tep_session_is_registered('customer_id')) return false;

// insert current cart contents in database
     if (is_array($this->contents)) {
       reset($this->contents);
       while (list($products_id, ) = each($this->contents)) {
         $qty = $this->contents[$products_id]['qty'];
         $product_query = tep_db_query("select products_id from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "'");
         if (!tep_db_num_rows($product_query)) {
           tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET . " (customers_id, products_id, customers_basket_quantity, customers_basket_date_added) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id) . "', '" . tep_db_input($qty) . "', '" . date('Ymd') . "')");
           if (isset($this->contents[$products_id]['attributes'])) {
             reset($this->contents[$products_id]['attributes']);
             while (list($option, $value) = each($this->contents[$products_id]['attributes'])) {
               tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " (customers_id, products_id, products_options_id, products_options_value_id) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id) . "', '" . (int)$option . "', '" . (int)$value . "')");
             }
           }
         } else {
           tep_db_query("update " . TABLE_CUSTOMERS_BASKET . " set customers_basket_quantity = '" . tep_db_input($qty) . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "'");
         }
       }
     }

// reset per-session cart contents, but not the database contents
     $this->reset(false);

     $products_query = tep_db_query("select products_id, customers_basket_quantity from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . (int)$customer_id . "'");
     while ($products = tep_db_fetch_array($products_query)) {
       $this->contents[$products['products_id']] = array('qty' => $products['customers_basket_quantity']);
// attributes
       $attributes_query = tep_db_query("select products_options_id, products_options_value_id from " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products['products_id']) . "'");
       while ($attributes = tep_db_fetch_array($attributes_query)) {
         $this->contents[$products['products_id']]['attributes'][$attributes['products_options_id']] = $attributes['products_options_value_id'];
       }
     }

     $this->cleanup();
   }

   function reset($reset_database = false) {
     global $customer_id;

     $this->contents = array();
     $this->total = 0;
     $this->weight = 0;
     $this->content_type = false;

     if (tep_session_is_registered('customer_id') && ($reset_database == true)) {
       tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . (int)$customer_id . "'");
       tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " where customers_id = '" . (int)$customer_id . "'");
     }

     unset($this->cartID);
     if (tep_session_is_registered('cartID')) tep_session_unregister('cartID');
   }

   function add_cart($products_id, $qty = '1', $attributes = '', $notify = true) {
     global $new_products_id_in_cart, $customer_id;

     $products_id_string = tep_get_uprid($products_id, $attributes);
     $products_id = tep_get_prid($products_id_string);

     if (defined('MAX_QTY_IN_CART') && (MAX_QTY_IN_CART > 0) && ((int)$qty > MAX_QTY_IN_CART)) {
       $qty = MAX_QTY_IN_CART;
     }

     $attributes_pass_check = true;

     if (is_array($attributes)) {
       reset($attributes);
       while (list($option, $value) = each($attributes)) {
         if (!is_numeric($option) || !is_numeric($value)) {
           $attributes_pass_check = false;
           break;
         }
       }
     }

     if (is_numeric($products_id) && is_numeric($qty) && ($attributes_pass_check == true)) {
       $check_product_query = tep_db_query("select products_status from " . TABLE_PRODUCTS . " where products_id = '" . (int)$products_id . "'");
       $check_product = tep_db_fetch_array($check_product_query);

       if (($check_product !== false) && ($check_product['products_status'] == '1')) {
         if ($notify == true) {
           $new_products_id_in_cart = $products_id;
           tep_session_register('new_products_id_in_cart');
         }

         if ($this->in_cart($products_id_string)) {
           $this->update_quantity($products_id_string, $qty, $attributes);
         } else {
           $this->contents[$products_id_string] = array('qty' => (int)$qty);
// insert into database
           if (tep_session_is_registered('customer_id')) tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET . " (customers_id, products_id, customers_basket_quantity, customers_basket_date_added) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id_string) . "', '" . (int)$qty . "', '" . date('Ymd') . "')");

           if (is_array($attributes)) {
             reset($attributes);
             while (list($option, $value) = each($attributes)) {
               $this->contents[$products_id_string]['attributes'][$option] = $value;
// insert into database
               if (tep_session_is_registered('customer_id')) tep_db_query("insert into " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " (customers_id, products_id, products_options_id, products_options_value_id) values ('" . (int)$customer_id . "', '" . tep_db_input($products_id_string) . "', '" . (int)$option . "', '" . (int)$value . "')");
             }
           }
         }

         $this->cleanup();

// assign a temporary unique ID to the order contents to prevent hack attempts during the checkout procedure
         $this->cartID = $this->generate_cart_id();
       }
     }
   }

   function update_quantity($products_id, $quantity = '', $attributes = '') {
     global $customer_id;

     $products_id_string = tep_get_uprid($products_id, $attributes);
     $products_id = tep_get_prid($products_id_string);

     if (defined('MAX_QTY_IN_CART') && (MAX_QTY_IN_CART > 0) && ((int)$quantity > MAX_QTY_IN_CART)) {
       $quantity = MAX_QTY_IN_CART;
     }

     $attributes_pass_check = true;

     if (is_array($attributes)) {
       reset($attributes);
       while (list($option, $value) = each($attributes)) {
         if (!is_numeric($option) || !is_numeric($value)) {
           $attributes_pass_check = false;
           break;
         }
       }
     }

     if (is_numeric($products_id) && isset($this->contents[$products_id_string]) && is_numeric($quantity) && ($attributes_pass_check == true)) {
       $this->contents[$products_id_string] = array('qty' => (int)$quantity);
// update database
       if (tep_session_is_registered('customer_id')) tep_db_query("update " . TABLE_CUSTOMERS_BASKET . " set customers_basket_quantity = '" . (int)$quantity . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id_string) . "'");

       if (is_array($attributes)) {
         reset($attributes);
         while (list($option, $value) = each($attributes)) {
           $this->contents[$products_id_string]['attributes'][$option] = $value;
// update database
           if (tep_session_is_registered('customer_id')) tep_db_query("update " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " set products_options_value_id = '" . (int)$value . "' where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id_string) . "' and products_options_id = '" . (int)$option . "'");
         }
       }
     }
   }

   function cleanup() {
     global $customer_id;

     reset($this->contents);
     while (list($key,) = each($this->contents)) {
       if ($this->contents[$key]['qty'] < 1) {
         unset($this->contents[$key]);
// remove from database
         if (tep_session_is_registered('customer_id')) {
           tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($key) . "'");
           tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($key) . "'");
         }
       }
     }
   }

   function count_contents() {  // get total number of items in cart 
     $total_items = 0;
     if (is_array($this->contents)) {
       reset($this->contents);
       while (list($products_id, ) = each($this->contents)) {
         $total_items += $this->get_quantity($products_id);
// Get 1 free
         // If this product qualifies for free product(s) add in the number of free products
         if (is_array ($free_product = $this->get1free ($products_id))) {
           $total_items += $free_product['quantity'];
         }
// end Get 1 free
       }
     }

     return $total_items;
   }

   function get_quantity($products_id) {
     if (isset($this->contents[$products_id])) {
       return $this->contents[$products_id]['qty'];
     } else {
       return 0;
     }
   }

   function in_cart($products_id) {
     if (isset($this->contents[$products_id])) {
       return true;
     } else {
       return false;
     }
   }

   function remove($products_id) {
     global $customer_id;

     unset($this->contents[$products_id]);
// remove from database
     if (tep_session_is_registered('customer_id')) {
       tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "'");
       tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($products_id) . "'");
     }

// Get 1 free
         // If this product qualifies for free product(s) remove the free products
         if (is_array ($free_product = $this->get1free ($products_id))) {
           $pid = (int)$free_product['id'];
           unset($this->contents[$pid]);
           // remove from database
           if (tep_session_is_registered('customer_id')) {
             tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($pid) . "'");
             tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " where customers_id = '" . (int)$customer_id . "' and products_id = '" . tep_db_input($pid) . "'");
           }
         }
// end Get 1 free

// assign a temporary unique ID to the order contents to prevent hack attempts during the checkout procedure
     $this->cartID = $this->generate_cart_id();
     return $debug;
   }

   function remove_all() {
     $this->reset();
   }

   function get_product_id_list() {
     $product_id_list = '';
     if (is_array($this->contents)) {
       reset($this->contents);
       while (list($products_id, ) = each($this->contents)) {
         $product_id_list .= ', ' . $products_id;
       }
     }

     return substr($product_id_list, 2);
   }

   function calculate() {
     global $currencies;

     $this->total = 0;
     $this->weight = 0;
     if (!is_array($this->contents)) return 0;

     reset($this->contents);
     while (list($products_id, ) = each($this->contents)) {
       $qty = $this->contents[$products_id]['qty'];

// products price
       $product_query = tep_db_query("select products_id, products_price, products_tax_class_id, products_weight from " . TABLE_PRODUCTS . " where products_id = '" . (int)$products_id . "'");
       if ($product = tep_db_fetch_array($product_query)) {
         $prid = $product['products_id'];
         $products_tax = tep_get_tax_rate($product['products_tax_class_id']);
         $products_price = $product['products_price'];
         $products_weight = $product['products_weight'];

         $specials_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$prid . "' and status = '1'");
         if (tep_db_num_rows ($specials_query)) {
           $specials = tep_db_fetch_array($specials_query);
           $products_price = $specials['specials_new_products_price'];
         }

         $this->total += $currencies->calculate_price($products_price, $products_tax, $qty);
         $this->weight += ($qty * $products_weight);

// Get 1 free
         // If this product qualifies for free product(s) add in the total weight of free products
         if (is_array ($free_product = $this->get1free ($products_id))) {
           $this->weight += $free_product['quantity'] * $free_product['weight'];
         }
// end Get 1 free
       }

// attributes price
       if (isset($this->contents[$products_id]['attributes'])) {
         reset($this->contents[$products_id]['attributes']);
         while (list($option, $value) = each($this->contents[$products_id]['attributes'])) {
           $attribute_price_query = tep_db_query("select options_values_price, price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$prid . "' and options_id = '" . (int)$option . "' and options_values_id = '" . (int)$value . "'");
           $attribute_price = tep_db_fetch_array($attribute_price_query);
           if ($attribute_price['price_prefix'] == '+') {
             $this->total += $currencies->calculate_price($attribute_price['options_values_price'], $products_tax, $qty);
           } else {
             $this->total -= $currencies->calculate_price($attribute_price['options_values_price'], $products_tax, $qty);
           }
         }
       }
     }
   }


//////
//MVS Start
//  New method to provide cost, weight, quantity, and product IDs by vendor
//////
//Output array structure (example):
//shoppingcart Object
//(
//  [vendor_shipping] => array
//    (
//      [0] => array   //Number is the vendor_id
//        (
//          [weight] => 22.59
//          [cost] => 12.95
//          [qty] => 2
//          [products_id] => array
//            (
//              [0] => 12
//              [1] => 47
//            )
//        )
//      [12] => array
//        (
//          [weight] => 32.74
//          [cost] => 109.59
//          [qty] => 5
//          [products_id] => array
//            (
//              [0] => 2
//              [1] => 3
//              [2] => 37
//              [3] => 49
//            )
//        )
//    )
//)
   function vendor_shipping() {

     if (!is_array($this->contents)) return 0;  //Cart is empty

     $this->vendor_shipping = array();  //Initialize the output array
     reset($this->contents);            //  and reset the input array
     foreach ($this->contents as $products_id => $value) {  //$value is never used
       $quantity = $this->contents[$products_id]['qty'];

//mod IndvShip, added products_ship_price
       $products_query = tep_db_query("select products_id,
                                              products_price,
										   products_ship_price,
                                              products_tax_class_id,
                                              products_weight,
                                              vendors_id
                                       from " . TABLE_PRODUCTS . "
                                       where products_id = '" . (int)$products_id . "'"
                                     );
       if ($products = tep_db_fetch_array($products_query)) {
         $products_price = $products['products_price'];
//mod IndvShip
	  $products_ship_price = $products['products_ship_price'];
         $products_weight = $products['products_weight'];
         $vendors_id = ($products['vendors_id'] <= 0) ? 1 : $products['vendors_id'];
         $products_tax = tep_get_tax_rate($products['products_tax_class_id']);

         //Find special prices (if any)
         $specials_query = tep_db_query("select specials_new_products_price
                                         from " . TABLE_SPECIALS . "
                                         where products_id = '" . (int)$products_id . "'
                                           and status = '1'"
                                       );
         if (tep_db_num_rows ($specials_query)) {
           $specials = tep_db_fetch_array($specials_query);
           $products_price = $specials['specials_new_products_price'];
         }

         //Add values to the output array
         $this->vendor_shipping[$vendors_id]['weight'] += ($quantity * $products_weight);
         $this->vendor_shipping[$vendors_id]['cost'] += tep_add_tax($products_price, $products_tax) * $quantity;
         $this->vendor_shipping[$vendors_id]['qty'] += $quantity;
//mod IndvShip
	  $this->vendor_shipping[$vendors_id]['ship_cost'] += ($quantity * $products_ship_price);		  		  
         $this->vendor_shipping[$vendors_id]['products_id'][] = $products_id; //There can be more than one product
       }

       // Add/subtract attributes prices (if any)
       if (isset($this->contents[$products_id]['attributes'])) {
         reset($this->contents[$products_id]['attributes']);
         foreach ($this->contents[$products_id]['attributes'] as $option => $value) {
           $attribute_price_query = tep_db_query("select options_values_price, price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$products_id . "' and options_id = '" . (int)$option . "' and options_values_id = '" . (int)$value . "'");
           $attribute_price = tep_db_fetch_array($attribute_price_query);
           if ($attribute_price['price_prefix'] == '+') {
             $this->vendor_shipping[$vendors_id]['cost'] += $quantity * tep_add_tax($attribute_price['options_values_price'], $products_tax);
           } else {
             $this->vendor_shipping[$vendors_id]['cost'] -= $quantity * tep_add_tax($attribute_price['options_values_price'], $products_tax);
           }
         }
       }
     }

     return $this->vendor_shipping;
   }
//MVS End

   function attributes_price($products_id) {
     $attributes_price = 0;

     if (isset($this->contents[$products_id]['attributes'])) {
       reset($this->contents[$products_id]['attributes']);
       while (list($option, $value) = each($this->contents[$products_id]['attributes'])) {
         $attribute_price_query = tep_db_query("select options_values_price, price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$products_id . "' and options_id = '" . (int)$option . "' and options_values_id = '" . (int)$value . "'");
         $attribute_price = tep_db_fetch_array($attribute_price_query);
         if ($attribute_price['price_prefix'] == '+') {
           $attributes_price += $attribute_price['options_values_price'];
         } else {
           $attributes_price -= $attribute_price['options_values_price'];
         }
       }
     }

     return $attributes_price;
   }

//MVS - added function to only retrieve specific vendors products
   function get_vendors_products($vendor) {
     global $languages_id;

     if (!is_array($this->contents)) return false;

     $products_array = array();
     reset($this->contents);
     while (list($products_id, ) = each($this->contents)) {
       $products_query = tep_db_query("select p.products_id, pd.products_name, p.products_model, p.products_image, p.products_price, p.products_weight, p.products_length, p.products_width, p.products_height, p.products_ready_to_ship, p.products_tax_class_id, v.vendors_id, v.vendors_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_VENDORS . " v where p.products_id = '" . (int)$products_id . "' and pd.products_id = p.products_id and v.vendors_id = '" . $vendor . "' and p.vendors_id = '" . $vendor . "' and pd.language_id = '" . (int)$languages_id . "'");
       //upsxml dimensions end
       //MVS end
       if ($products = tep_db_fetch_array($products_query)) {
         $prid = $products['products_id'];
         $products_price = $products['products_price'];

         $specials_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$prid . "' and status = '1'");
         if (tep_db_num_rows($specials_query)) {
           $specials = tep_db_fetch_array($specials_query);
           $products_price = $specials['specials_new_products_price'];
         }

         $products_array[] = array('id' => $products_id,
                                   'name' => $products['products_name'],
                                   'qproduct' => '', 
                                   'model' => $products['products_model'],
                                   'image' => $products['products_image'],
                                   'price' => $products_price,
                                   'quantity' => $this->contents[$products_id]['qty'],
                                   'weight' => $products['products_weight'],
//upsxml dimensions start
                                   'length' => ($products['product_free_shipping'] == '1' ? 0 : $products['products_length']),
         			                    'width' => ($products['product_free_shipping'] == '1' ? 0 : $products['products_width']),
         			                    'height' => ($products['product_free_shipping'] == '1' ? 0 : $products['products_height']),
         			                    'ready_to_ship' => $products['products_ready_to_ship'],
//upsxml dimensions end
                                   'final_price' => ($products_price + $this->attributes_price($products_id)),
                                   'tax_class_id' => $products['products_tax_class_id'],
                                   //MVS start
                                   'vendors_id' => $products['vendors_id'],
                                   'vendors_name' => $products['vendors_name'],
                                   //MVS end
                                   'attributes' => (isset($this->contents[$products_id]['attributes']) ? $this->contents[$products_id]['attributes'] : ''));
// Get 1 free
if (is_array ($free_product = $this->get1free ($products_id))) {
               // Add the free product to the shopping cart (Customer cannot alter this)
               $products_array[] = array('id' => $free_product['id'],
                                     'name' => $free_product['name'],
				  'qproduct' => '<br><span class="stockWarning">Free with <b>' . $products['products_name'] . '</b> purchase</span>', 
                                     'model' => $free_product['model'],
                                     'image' => $free_product['image'],
                                     'price' => 0,
                                     'quantity' => $free_product['quantity'],
                                     'weight' => $free_product['weight'],
                                     'final_price' => 0,
                                     'tax_class_id' => $products['products_tax_class_id'],
                                     'attributes' => '',
                                     'free' => 1
                                    );
         } //if (is_array
// end Get 1 free
       }
     }

     return $products_array;
   }
//MVS - upsxml end

   function get_products() {
     global $languages_id;

     if (!is_array($this->contents)) return false;

     $products_array = array();
     reset($this->contents);
     while (list($products_id, ) = each($this->contents)) {
//MVS
//upsxml dimensions - added  p.products_length, p.products_width, p.products_height, p.products_ready_to_ship, 
       $products_query = tep_db_query("select p.products_id, pd.products_name, p.products_model, p.products_image, p.products_price, p.products_weight, p.products_length, p.products_width, p.products_height, p.products_ready_to_ship, p.products_tax_class_id, v.vendors_id, v.vendors_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_VENDORS . " v where p.products_id = '" . (int)$products_id . "' and pd.products_id = p.products_id and v.vendors_id = p.vendors_id and pd.language_id = '" . (int)$languages_id . "'");
       if ($products = tep_db_fetch_array($products_query)) {
         $prid = $products['products_id'];
         $products_price = $products['products_price'];

         $specials_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$prid . "' and status = '1'");
         if (tep_db_num_rows($specials_query)) {
           $specials = tep_db_fetch_array($specials_query);
           $products_price = $specials['specials_new_products_price'];
         }

         $products_array[] = array('id' => $products_id,
                                   'name' => $products['products_name'],
                                   'model' => $products['products_model'],
                                   'image' => $products['products_image'],
                                   'price' => $products_price,
                                   'quantity' => $this->contents[$products_id]['qty'],
                                   'weight' => $products['products_weight'],
//upsxml dimensions start
                                   'length' => ($products['product_free_shipping'] == '1' ? 0 : $products['products_length']),
         			                    'width' => ($products['product_free_shipping'] == '1' ? 0 : $products['products_width']),
         			                    'height' => ($products['product_free_shipping'] == '1' ? 0 : $products['products_height']),
//uspxml dimensions end
                                   'ready_to_ship' => $products['products_ready_to_ship'],
                                   'final_price' => ($products_price + $this->attributes_price($products_id)),
                                   'tax_class_id' => $products['products_tax_class_id'],
//MVS start
                                   'vendors_id' => $products['vendors_id'],
                                   'vendors_name' => $products['vendors_name'],
//MVS end
                                   'attributes' => (isset($this->contents[$products_id]['attributes']) ? $this->contents[$products_id]['attributes'] : ''));
       }
     }

     return $products_array;
   }

   function show_total() {
     $this->calculate();

     return $this->total;
   }

   function show_weight() {
     $this->calculate();

     return $this->weight;
   }

   function generate_cart_id($length = 5) {
     return tep_create_random_value($length, 'digits');
   }

   function get_content_type() {
     $this->content_type = false;

     if ( (DOWNLOAD_ENABLED == 'true') && ($this->count_contents() > 0) ) {
       reset($this->contents);
       while (list($products_id, ) = each($this->contents)) {
         if (isset($this->contents[$products_id]['attributes'])) {
           reset($this->contents[$products_id]['attributes']);
           while (list(, $value) = each($this->contents[$products_id]['attributes'])) {
             $virtual_check_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad where pa.products_id = '" . (int)$products_id . "' and pa.options_values_id = '" . (int)$value . "' and pa.products_attributes_id = pad.products_attributes_id");
             $virtual_check = tep_db_fetch_array($virtual_check_query);

             if ($virtual_check['total'] > 0) {
               switch ($this->content_type) {
                 case 'physical':
                   $this->content_type = 'mixed';

                   return $this->content_type;
                   break;
                 default:
                   $this->content_type = 'virtual';
                   break;
               }
             } else {
               switch ($this->content_type) {
                 case 'virtual':
                   $this->content_type = 'mixed';

                   return $this->content_type;
                   break;
                 default:
                   $this->content_type = 'physical';
                   break;
               }
             }
           }
         } else {
           switch ($this->content_type) {
             case 'virtual':
               $this->content_type = 'mixed';

               return $this->content_type;
               break;
             default:
               $this->content_type = 'physical';
               break;
           }
         }
       }
     } else {
       $this->content_type = 'physical';
     }

     return $this->content_type;
   }

   function unserialize($broken) {
     for(reset($broken);$kv=each($broken);) {
       $key=$kv['key'];
       if (gettype($this->$key)!="user function")
       $this->$key=$kv['value'];
     }
   }
// start Get 1 Free
   function get1free ($products_id) {
     global $languages_id;
     $get_1_free_query = tep_db_query("select products_free_id, products_free_quantity, products_qualify_quantity, products_multiple, get_1_free_expires_date from " . TABLE_GET_1_FREE . " where products_id = '" . (int)$products_id . "' and status = '1'");
     if (tep_db_num_rows($get_1_free_query) > 0) {
       $get_1_free = tep_db_fetch_array($get_1_free_query);
       //Check that the offer has not expired
        //MNK bugfix 13.08.2007
       if (($get_1_free['get_1_free_expires_date'] <= date('Y-m-d H:i:s')) && ($get_1_free['get_1_free_expires_date'] != '0000-00-00 00:00:00')) {
         //offer has expired, so update the database and return false
         tep_db_query("update " . TABLE_GET_1_FREE . " set status = '0', date_status_change = now() where products_id = '" . (int)$products_id . "'");
         return false;
       } else {
         // Offer is valid, so check if the quantity qualifies
         $products_quantity = $this->contents[$products_id]['qty'];
         if ($products_quantity >= $get_1_free['products_qualify_quantity']) {
           // Qualifies, so get the quantity of free products
           $free_quantity = 1;
           if ($get_1_free['products_multiple'] > 1) {
          //BOF fischo bugfix 10.04.2009
             //$free_quantity = floor ($products_quantity / $get_1_free['products_qualify_quantity']);
             $free_quantity = floor ($products_quantity / $get_1_free['products_qualify_quantity']) * $get_1_free['products_free_quantity'];
          //EOF fischo bugfix 10.04.2009
             if ($free_quantity > $get_1_free['products_multiple']) {
               $free_quantity = $get_1_free['products_multiple'];
             }
           }
           // Get the info on the free product
           $products_free_query = tep_db_query("select pd.products_name, p.products_model,p.products_image,p.products_weight from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = '" . (int)$get_1_free['products_free_id'] . "' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "'");
           $products_free = tep_db_fetch_array($products_free_query);
           // Return an array of free product values
           $output = array ( 'id' => $get_1_free['products_free_id'],
                             'quantity' => $free_quantity,
                             'name' => $products_free['products_name'],
                             'model' => $products_free['products_model'],
                             'image' => $products_free['products_image'],
                             'weight' => $products_free['products_weight']);
           return $output;
         } //if ($products_quantity
       } //else
     }//if (tep_db_num_rows
     // offer was not valid (disabled or expired)
     return false;
   }//function
// end Get 1 Free


// get_products_for_packaging is a special function for split product support in the class packing
// assumes that you have added the sql for upsxml, which adds the table products_split
  function get_products_for_packaging() {
     if (!is_array($this->contents)) return false;
     $products_array = array();
     // get the list of product information
     $products = $this->get_products();
     // cycle through list
     foreach ($products as $product) {
       $split_query = tep_db_query("select * from " . TABLE_PRODUCTS_SPLIT . " where products_id = " . (int)$product['id']);
       // is this a split product?
       if (tep_db_num_rows($split_query) > 0) {
         // save the total prices of the split product
         $product_price = $product['price'];
         $product_final_price = $product['final_price'];
         while ($split_info = tep_db_fetch_array($split_query)) {
           // for each piece of the product replace only the information that is unique to the piece
           // other information from the product will remain unchanged
           $product['weight'] = $split_info['products_weight'];
           $product['length'] = $split_info['products_length'];
           $product['width'] = $split_info['products_width'];
           $product['height'] = $split_info['products_height'];
           $product['ready_to_ship'] = $split_info['products_ready_to_ship'];
           $product['price'] = round(($split_info['value_fraction'] * $product_price), 4);
           $product['final_price'] = round(($split_info['value_fraction'] * $product_final_price), 4);
           // save the updated product piece
           $products_array[] = $product;
         } // end while
       } else {
         // not a split product, save it directly
         $products_array[] = $product;
       }
     } // end foreach

     return $products_array;
  }

 }
?>

Link to comment
Share on other sites

Well i'm stumped. I re checked everything and its all there. I did notice that the mods txt file has changes in product_info.php with g1f. db callouts. The sql file does not have these. Could this be the issue?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...