Jump to content
jpweber

Quantity Price Breaks

Recommended Posts

I have another question you might be able to help me with. It seems this contribution was designed to work with the basic install, I however have a template installed that is a narrow page and the product info page kind of pushes over to the right, I have been through the code on the product_info.php page for hours trying to figure out how to adjust this but just can't get there. I'm wondering if it maybe on another page that I have to adjust, I'm just lost. Any help would be great.

Problems like that are usually that the HTML is not correct. Overlapping tables etc. That can take hours to find.

 

If I were you I would take the PHP code and every time you see a table around where the body text begins add border="1" to the table tag. That might give a clue where things clash.

 

Not a simple thing with all the table and tr and td that the osC pages are made off.

Share this post


Link to post
Share on other sites

@dean0088

 

I seem to be the only person into validation .. but .. VALIDATE

 

I choose xhtml 1.0 transitional but you can just choose html 4.01 transitional

 

I'm a great believer in the benefits but in the case of the above post it would make your life so much easier.

Edited by FWR Media

Share this post


Link to post
Share on other sites
Since the field maxorder is also in the table products I think it would be the best to add the functionality to PriceFormatter and PriceFormatterStore.

Then you can adjust the quantity in adjustQty. You would need to test it though to see what happens if you update the quantity in the shopping cart (although update_quantity might only be called from within the function add_cart so that would be covered).

 

Jan,

 

Your advice was incredibly helpful, thank you. I followed it successfully, and am having one last, minor issue. When an item is in the cart, and the customer clicks "add to cart" from the product info page, the quantity in the shopping cart does not increase by 1. I should note that I did not use much of the code that came with this contrib, the shopping cart class changes, that's it - didn't use the quantity box or anything. Maybe that's where the problem lies - not using any of the code alterations for index.php or product_info.php, etc...

 

Here are my alterations based on your advice above, to make this contrib work with the maximum order quantity. In PriceFormatter, we pass the maximum order quantity along with the other relevant variables:

 

 /*
   Change support special prices
   If any price level has a price greater than the special
   price lower it to the special price
   If product is in the shopping_cart $this->price_breaks can be empty
   */
   if (true == $this->hasSpecialPrice && is_array($this->price_breaks)) {
     foreach($this->price_breaks as $key => $price_break) {
       $this->price_breaks[$key]['products_price'] = min($price_break['products_price'], $this->specialPrice);
     }
   }
   //end changes to support special prices


// BEGIN Case Discount		

$max_order_query = tep_db_query("select p.maxorder FROM " . TABLE_PRODUCTS . " p where p.products_id = '" . (int)$product_id . "'");
	while ($max_order = tep_db_fetch_array($max_order_query)) {
		$this->maxorder = $max_order['maxorder'];


}

// END Case Discount

 }



 function computePrice($qty, $nof_other_items_in_cart_same_cat = 0)

 

Then, in the AdjustQty function, we get the maximum order amount variable set above. If that value is not null (not null = maximum order quantity set), we readjust the $qty variable:

 

function adjustQty($qty, $qtyBlocks = NULL) {
   // Force QTY_BLOCKS granularity
   if(!tep_not_null($qtyBlocks))
   {
     $qtyBlocks = $this->getQtyBlocks();
   }

// BEGIN Case Discount

     $maxorder = $this->getmaxorder();

// END Case Discount


   if ($qty < 1)
     $qty = 1;

  // BEGIN Case Discount

  if (tep_not_null($maxorder)) {

  if ($qty >= $maxorder) {

  $qty = $maxorder;

	}

  }

  // END Case Discount


   if ($qtyBlocks >= 1)
   {
     if ($qty < $qtyBlocks)
       $qty = $qtyBlocks;

     if (($qty % $qtyBlocks) != 0)
       $qty += ($qtyBlocks - ($qty % $qtyBlocks));
   }
   return $qty;
 }

 function getQtyBlocks() {
   return $this->qtyBlocks;
 }

 function get_discount_category() {
   return $this->discount_categories_id;
 }

 // BEGIN Case Discount

 function getmaxorder() {
   return $this->maxorder;
 }

 // END Case Discount

 

In shopping cart.php, we query the maximum order amount. It is important to note that the quantity has already been adjusted to the maximum amount by the AdjustQty function:

 

 $products_name .= '    </td>' .
                       '  </tr>' .
                       '</table>';

     $info_box_contents[$cur_row][] = array('params' => 'class="productListing-data"',
                                            'text' => $products_name);

     $info_box_contents[$cur_row][] = array('align' => 'center',
                                            'params' => 'class="productListing-data" valign="top"',
                                            'text' => tep_draw_input_field('cart_quantity[]', $products[$i]['quantity'], 'size="4"') . tep_draw_hidden_field('products_id[]', $products[$i]['id']));

     $info_box_contents[$cur_row][] = array('align' => 'right',
                                            'params' => 'class="productListing-data" valign="top"',
                                            'text' => '<b>' . $currencies->display_price($products[$i]['final_price'], tep_get_tax_rate($products[$i]['tax_class_id']), $products[$i]['quantity']) . '</b>');

// BEGIN Case Discount

$maximum_order_query = tep_db_query("select p.maxorder as max_quant FROM " . TABLE_PRODUCTS . " p where p.products_id = '".$products[$i]['id']."'");
	while ($maximum_order = tep_db_fetch_array($maximum_order_query))  {
		$maxquant=$maximum_order['max_quant'];
}

		if (($products[$i]['quantity']) == $maxquant) {

		 $quant = $maxquant;

		 $prodname = ($products[$i]['name']);

		 }

// END Case Discount											 

   }

   new productListingBox($info_box_contents);

 

Then, we flash a "maximum order limit" warning, if conditions are met:

 

<td class="stockWarning" align="center"><br><B><?php 

	// BEGIN Case Discount

	if ($quant > 0) {

	echo 'The Order Limit for the ' . $prodname . ' is ' . $quant . ' Bottles. Your cart has been updated to reflect this amount.'; 

	}

	// BEGIN Case Discount

	?></B></td>

 

I'm so close! Thank you so much in advance for your help.

Edited by clemptor

Share this post


Link to post
Share on other sites
When an item is in the cart, and the customer clicks "add to cart" from the product info page, the quantity in the shopping cart does not increase by 1. I should note that I did not use much of the code that came with this contrib, the shopping cart class changes, that's it - didn't use the quantity box or anything. Maybe that's where the problem lies - not using any of the code alterations for index.php or product_info.php, etc...

I don't think so, because it defaults to 1 if it is not set.

However, from the code you posted I see that you only query for the maxorder when the product is not yet in the cart. If it is already in the cart, the info is obtained from PriceFormatterStore.

 

Personally, I would add p.maxorder to the query $sql in PriceFormatterStore.php and to the query in PriceFormatter.php (that would save queries too).

Then in PriceFormatter I would insert (has to be done twice) in the declaration of $price_formatter_data:

		'maxorder' => $product_info['maxorder'],

Add then after the if/else add (don't know if you really need it but why not):

	  $this->maxorder = $price_formatter_data['maxorder'];

You can leave in the function getmaxorder(), looks like a good idea.

 

Note that if a product is already in the cart, at first the product handling is done by the add_cart function, but then hands it over to update_quantity.

Share this post


Link to post
Share on other sites
Is there a contrip fpr sppc?

I only found some old ones.

The old one works fine for price breaks (there is no support for the discount category) but is based on the older version of QPBPP. They are different enough not to be compatible. So if you already installed the new QPBPP version you have more work than if you didn't.

Share this post


Link to post
Share on other sites
The old one works fine for price breaks (there is no support for the discount category) but is based on the older version of QPBPP. They are different enough not to be compatible. So if you already installed the new QPBPP version you have more work than if you didn't.

 

 

Are you going to release a new version from QPBPP for latest SPPC in the future?

Share this post


Link to post
Share on other sites
I have error message like this :

 

Fatal error: Call to a member function on a non-object in c:\program files\easyphp1-8\www\marchebiologique\principale\includes\classes\shopping_cart.php on line 290

 

these message appear when I add one or several articles in the basket

On the other hand during install.html, by seeking this line in the file \catalog\includes\classes\shopping_cart.php,

global $currencies;

I never found it

It must be somewhere. Just put :

 

global $pfs; // for qpbpp added: $languages_id, $pfs

 

on the bottom of application_top.php then. If that still errors it, try moving it up. But that line must be somewhere...

 

Try searching for "global" with a text editor in that file. You are most likely glancing over it. Computer are better in that way :)

Share this post


Link to post
Share on other sites
Are you going to release a new version from QPBPP for latest SPPC in the future?

I'm on vacation at the moment but brought a laptop. Who knows? I'll first do Hide products from customer groups for SPPC though.

Share this post


Link to post
Share on other sites

@Jan Zonjee > first, thanks for your answer

 

If i use PHP 4.3.10 ; MYSQL : 4.1.9 ; is it good or not ?

 

1 - Before posting, in the file \catalog\includes\classes\shopping_cart.php, with notepad++, I checked by seeking global $

 

I found something similary like this :

 

<?php
/*
 $Id: application_top.php,v 1.280 2003/07/12 09:38:07 hpdl Exp $

 osCommerce, Open Source E-Commerce Solutions
 [url="http://www.oscommerce.com"]http://www.oscommerce.com[/url]

 Copyright © 2003 osCommerce

 Released under the GNU General Public License
*/

// start the timer for the page parse time log
 define('PAGE_PARSE_START_TIME', microtime());

// set the level of error reporting
 error_reporting(E_ALL & ~E_NOTICE);

// check if register_globals is enabled.
// since this is a temporary measure this message is hardcoded. The requirement will be removed before 2.2 is finalized.
 if (function_exists('ini_get')) {
   ini_get('register_globals') or exit('Server Requirement Error: register_globals is disabled in your PHP configuration. This can be enabled in your php.ini configuration file or in the .htaccess file in your catalog directory.');
 }

// Set the local configuration parameters - mainly for developers
 if (file_exists('includes/local/configure.php')) include('includes/local/configure.php');

// include server parameters
 require('includes/configure.php');

 if (strlen(DB_SERVER) < 1) {
   if (is_dir('install')) {
     header('Location: install/index.php');
   }
 }

// define the project version
 define('PROJECT_VERSION', 'osCommerce 2.2-MS2');

// set the type of request (secure or not)
 $request_type = (getenv('HTTPS') == 'on') ? 'SSL' : 'NONSSL';

// set php_self in the local scope
 if (!isset($PHP_SELF)) $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];

 if ($request_type == 'NONSSL') {
   define('DIR_WS_CATALOG', DIR_WS_HTTP_CATALOG);
 } else {
   define('DIR_WS_CATALOG', DIR_WS_HTTPS_CATALOG);
 }

// include the list of project filenames
 require(DIR_WS_INCLUDES . 'filenames.php');

// include the list of project database tables
 require(DIR_WS_INCLUDES . 'database_tables.php');

// customization for the design layout
 define('BOX_WIDTH', 125); // how wide the boxes should be in pixels (default: 125)

// include the database functions
 require(DIR_WS_FUNCTIONS . 'database.php');

// make a connection to the database... now
 tep_db_connect() or die('Unable to connect to database server!');

// set the application parameters
 $configuration_query = tep_db_query('select configuration_key as cfgKey, configuration_value as cfgValue from ' . TABLE_CONFIGURATION);
 while ($configuration = tep_db_fetch_array($configuration_query)) {
   define($configuration['cfgKey'], $configuration['cfgValue']);
 }

// if gzip_compression is enabled, start to buffer the output
 if ( (GZIP_COMPRESSION == 'true') && ($ext_zlib_loaded = extension_loaded('zlib')) && (PHP_VERSION >= '4') ) {
   if (($ini_zlib_output_compression = (int)ini_get('zlib.output_compression')) < 1) {
     if (PHP_VERSION >= '4.0.4') {
       ob_start('ob_gzhandler');
     } else {
       include(DIR_WS_FUNCTIONS . 'gzip_compression.php');
       ob_start();
       ob_implicit_flush();
     }
   } else {
     ini_set('zlib.output_compression_level', GZIP_LEVEL);
   }
 }

// set the HTTP GET parameters manually if search_engine_friendly_urls is enabled
 if (SEARCH_ENGINE_FRIENDLY_URLS == 'true') {
   if (strlen(getenv('PATH_INFO')) > 1) {
     $GET_array = array();
     $PHP_SELF = str_replace(getenv('PATH_INFO'), '', $PHP_SELF);
     $vars = explode('/', substr(getenv('PATH_INFO'), 1));
     for ($i=0, $n=sizeof($vars); $i<$n; $i++) {
       if (strpos($vars[$i], '[]')) {
         $GET_array[substr($vars[$i], 0, -2)][] = $vars[$i+1];
       } else {
         $HTTP_GET_VARS[$vars[$i]] = $vars[$i+1];
       }
       $i++;
     }

     if (sizeof($GET_array) > 0) {
       while (list($key, $value) = each($GET_array)) {
         $HTTP_GET_VARS[$key] = $value;
       }
     }
   }
 }

// define general functions used application-wide
 require(DIR_WS_FUNCTIONS . 'general.php');
 require(DIR_WS_FUNCTIONS . 'html_output.php');

// set the cookie domain
 $cookie_domain = (($request_type == 'NONSSL') ? HTTP_COOKIE_DOMAIN : HTTPS_COOKIE_DOMAIN);
 $cookie_path = (($request_type == 'NONSSL') ? HTTP_COOKIE_PATH : HTTPS_COOKIE_PATH);

// include cache functions if enabled
 if (USE_CACHE == 'true') include(DIR_WS_FUNCTIONS . 'cache.php');

// include shopping cart class
 require(DIR_WS_CLASSES . 'shopping_cart.php');

// include navigation history class
 require(DIR_WS_CLASSES . 'navigation_history.php');

// some code to solve compatibility issues
 require(DIR_WS_FUNCTIONS . 'compatibility.php');

// check if sessions are supported, otherwise use the php3 compatible session class
 if (!function_exists('session_start')) {
   define('PHP_SESSION_NAME', 'osCsid');
   define('PHP_SESSION_PATH', $cookie_path);
   define('PHP_SESSION_DOMAIN', $cookie_domain);
   define('PHP_SESSION_SAVE_PATH', SESSION_WRITE_DIRECTORY);

   include(DIR_WS_CLASSES . 'sessions.php');
 }

// define how the session functions will be used
 require(DIR_WS_FUNCTIONS . 'sessions.php');

// set the session name and save path
 tep_session_name('osCsid');
 tep_session_save_path(SESSION_WRITE_DIRECTORY);

// set the session cookie parameters
  if (function_exists('session_set_cookie_params')) {
   session_set_cookie_params(0, $cookie_path, $cookie_domain);
 } elseif (function_exists('ini_set')) {
   ini_set('session.cookie_lifetime', '0');
   ini_set('session.cookie_path', $cookie_path);
   ini_set('session.cookie_domain', $cookie_domain);
 }

// set the session ID if it exists
  if (isset($HTTP_POST_VARS[tep_session_name()])) {
    tep_session_id($HTTP_POST_VARS[tep_session_name()]);
  } elseif ( ($request_type == 'SSL') && isset($HTTP_GET_VARS[tep_session_name()]) ) {
    tep_session_id($HTTP_GET_VARS[tep_session_name()]);
  }

// start the session
 $session_started = false;
 if (SESSION_FORCE_COOKIE_USE == 'True') {
   tep_setcookie('cookie_test', 'please_accept_for_session', time()+60*60*24*30, $cookie_path, $cookie_domain);

   if (isset($HTTP_COOKIE_VARS['cookie_test'])) {
     tep_session_start();
     $session_started = true;
   }
 } elseif (SESSION_BLOCK_SPIDERS == 'True') {
   $user_agent = strtolower(getenv('HTTP_USER_AGENT'));
   $spider_flag = false;

   if (tep_not_null($user_agent)) {
     $spiders = file(DIR_WS_INCLUDES . 'spiders.txt');

     for ($i=0, $n=sizeof($spiders); $i<$n; $i++) {
       if (tep_not_null($spiders[$i])) {
         if (is_integer(strpos($user_agent, trim($spiders[$i])))) {
           $spider_flag = true;
           break;
         }
       }
     }
   }

   if ($spider_flag == false) {
     tep_session_start();
     $session_started = true;
   }
 } else {
   tep_session_start();
   $session_started = true;
 }

// set SID once, even if empty
 $SID = (defined('SID') ? SID : '');

// verify the ssl_session_id if the feature is enabled
 if ( ($request_type == 'SSL') && (SESSION_CHECK_SSL_SESSION_ID == 'True') && (ENABLE_SSL == true) && ($session_started == true) ) {
   $ssl_session_id = getenv('SSL_SESSION_ID');
   if (!tep_session_is_registered('SSL_SESSION_ID')) {
     $SESSION_SSL_ID = $ssl_session_id;
     tep_session_register('SESSION_SSL_ID');
   }

   if ($SESSION_SSL_ID != $ssl_session_id) {
     tep_session_destroy();
     tep_redirect(tep_href_link(FILENAME_SSL_CHECK));
   }
 }

// verify the browser user agent if the feature is enabled
 if (SESSION_CHECK_USER_AGENT == 'True') {
   $http_user_agent = getenv('HTTP_USER_AGENT');
   if (!tep_session_is_registered('SESSION_USER_AGENT')) {
     $SESSION_USER_AGENT = $http_user_agent;
     tep_session_register('SESSION_USER_AGENT');
   }

   if ($SESSION_USER_AGENT != $http_user_agent) {
     tep_session_destroy();
     tep_redirect(tep_href_link(FILENAME_LOGIN));
   }
 }

// verify the IP address if the feature is enabled
 if (SESSION_CHECK_IP_ADDRESS == 'True') {
   $ip_address = tep_get_ip_address();
   if (!tep_session_is_registered('SESSION_IP_ADDRESS')) {
     $SESSION_IP_ADDRESS = $ip_address;
     tep_session_register('SESSION_IP_ADDRESS');
   }

   if ($SESSION_IP_ADDRESS != $ip_address) {
     tep_session_destroy();
     tep_redirect(tep_href_link(FILENAME_LOGIN));
   }
 }

// create the shopping cart & fix the cart if necesary
 if (tep_session_is_registered('cart') && is_object($cart)) {
   if (PHP_VERSION < 4) {
     $broken_cart = $cart;
     $cart = new shoppingCart;
     $cart->unserialize($broken_cart);
   }
 } else {
   tep_session_register('cart');
   $cart = new shoppingCart;
 }

// include currencies class and create an instance
 require(DIR_WS_CLASSES . 'currencies.php');
 $currencies = new currencies();
 // BOF qpbpp
 // include the price formatter classes for the price breaks contribution
 require(DIR_WS_CLASSES . 'PriceFormatter.php');
 $pf = new PriceFormatter;
 require(DIR_WS_CLASSES . 'PriceFormatterStore.php');
 $pfs = new PriceFormatterStore;
 // EOF qpbpp


// include the mail classes
 require(DIR_WS_CLASSES . 'mime.php');
 require(DIR_WS_CLASSES . 'email.php');

// set the language
 if (!tep_session_is_registered('language') || isset($HTTP_GET_VARS['language'])) {
   if (!tep_session_is_registered('language')) {
     tep_session_register('language');
     tep_session_register('languages_id');
   }

   include(DIR_WS_CLASSES . 'language.php');
   $lng = new language();

   if (isset($HTTP_GET_VARS['language']) && tep_not_null($HTTP_GET_VARS['language'])) {
     $lng->set_language($HTTP_GET_VARS['language']);
   } else {
     $lng->get_browser_language();
   }

   $language = $lng->language['directory'];
   $languages_id = $lng->language['id'];
 }

// include the language translations
 require(DIR_WS_LANGUAGES . $language . '.php');

// currency
 if (!tep_session_is_registered('currency') || isset($HTTP_GET_VARS['currency']) || ( (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') && (LANGUAGE_CURRENCY != $currency) ) ) {
   if (!tep_session_is_registered('currency')) tep_session_register('currency');

   if (isset($HTTP_GET_VARS['currency'])) {
     if (!$currency = tep_currency_exists($HTTP_GET_VARS['currency'])) $currency = (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') ? LANGUAGE_CURRENCY : DEFAULT_CURRENCY;
   } else {
     $currency = (USE_DEFAULT_LANGUAGE_CURRENCY == 'true') ? LANGUAGE_CURRENCY : DEFAULT_CURRENCY;
   }
 }

// navigation history
 if (tep_session_is_registered('navigation')) {
   if (PHP_VERSION < 4) {
     $broken_navigation = $navigation;
     $navigation = new navigationHistory;
     $navigation->unserialize($broken_navigation);
   }
 } else {
   tep_session_register('navigation');
   $navigation = new navigationHistory;
 }
 $navigation->add_current_page();

// Shopping cart actions
 if (isset($HTTP_GET_VARS['action'])) {
// redirect the customer to a friendly cookie-must-be-enabled page if cookies are disabled
   if ($session_started == false) {
     tep_redirect(tep_href_link(FILENAME_COOKIE_USAGE));
   }

   if (DISPLAY_CART == 'true') {
     $goto =  FILENAME_SHOPPING_CART;
     $parameters = array('action', 'cPath', 'products_id', 'pid');
   } else {
     $goto = basename($PHP_SELF);
     if ($HTTP_GET_VARS['action'] == 'buy_now') {
       $parameters = array('action', 'pid', 'products_id');
     } else {
       $parameters = array('action', 'pid');
     }
   }
   switch ($HTTP_GET_VARS['action']) {
     // customer wants to update the product quantity in their shopping cart
     case 'update_product' : for ($i=0, $n=sizeof($HTTP_POST_VARS['products_id']); $i<$n; $i++) {
                               if (in_array($HTTP_POST_VARS['products_id'][$i], (is_array($HTTP_POST_VARS['cart_delete']) ? $HTTP_POST_VARS['cart_delete'] : array()))) {
                                 $cart->remove($HTTP_POST_VARS['products_id'][$i]);
                               } else {
                                 if (PHP_VERSION < 4) {
                                   // if PHP3, make correction for lack of multidimensional array.
                                   reset($HTTP_POST_VARS);
                                   while (list($key, $value) = each($HTTP_POST_VARS)) {
                                     if (is_array($value)) {
                                       while (list($key2, $value2) = each($value)) {
                                         if (ereg ("(.*)\]\[(.*)", $key2, $var)) {
                                           $id2[$var[1]][$var[2]] = $value2;
                                         }
                                       }
                                     }
                                   }
                                   $attributes = ($id2[$HTTP_POST_VARS['products_id'][$i]]) ? $id2[$HTTP_POST_VARS['products_id'][$i]] : '';
                                 } else {
                                   $attributes = ($HTTP_POST_VARS['id'][$HTTP_POST_VARS['products_id'][$i]]) ? $HTTP_POST_VARS['id'][$HTTP_POST_VARS['products_id'][$i]] : '';
                                 }
                                 $cart->add_cart($HTTP_POST_VARS['products_id'][$i], $HTTP_POST_VARS['cart_quantity'][$i], $attributes, false);
                               }
                             }
                             tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                             break;
     // customer adds a product from the products page
     case 'add_product' :    if (isset($HTTP_POST_VARS['products_id']) && is_numeric($HTTP_POST_VARS['products_id'])) {
                               //BOF qpbpp
                               //$cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], $HTTP_POST_VARS['id']))+1, $HTTP_POST_VARS['id']);
                               $cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], $HTTP_POST_VARS['id'])) + $HTTP_POST_VARS['cart_quantity'], $HTTP_POST_VARS['id']);
							//EOF qpbpp
                             }
                             tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                             break;
     // performed by the 'buy now' button in product listings and review page
     case 'buy_now' :        if (isset($HTTP_GET_VARS['products_id'])) {
                               if (tep_has_product_attributes($HTTP_GET_VARS['products_id'])) {
                                 tep_redirect(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id']));
                               } else {
                                 $cart->add_cart($HTTP_GET_VARS['products_id'], $cart->get_quantity($HTTP_GET_VARS['products_id'])+1);
                               }
                             }
                             tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                             break;
     case 'notify' :         if (tep_session_is_registered('customer_id')) {
                               if (isset($HTTP_GET_VARS['products_id'])) {
                                 $notify = $HTTP_GET_VARS['products_id'];
                               } elseif (isset($HTTP_GET_VARS['notify'])) {
                                 $notify = $HTTP_GET_VARS['notify'];
                               } elseif (isset($HTTP_POST_VARS['notify'])) {
                                 $notify = $HTTP_POST_VARS['notify'];
                               } else {
                                 tep_redirect(tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action', 'notify'))));
                               }
                               if (!is_array($notify)) $notify = array($notify);
                               for ($i=0, $n=sizeof($notify); $i<$n; $i++) {
                                 $check_query = tep_db_query("select count(*) as count from " . TABLE_PRODUCTS_NOTIFICATIONS . " where products_id = '" . $notify[$i] . "' and customers_id = '" . $customer_id . "'");
                                 $check = tep_db_fetch_array($check_query);
                                 if ($check['count'] < 1) {
                                   tep_db_query("insert into " . TABLE_PRODUCTS_NOTIFICATIONS . " (products_id, customers_id, date_added) values ('" . $notify[$i] . "', '" . $customer_id . "', now())");
                                 }
                               }
                               tep_redirect(tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action', 'notify'))));
                             } else {
                               $navigation->set_snapshot();
                               tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
                             }
                             break;
     case 'notify_remove' :  if (tep_session_is_registered('customer_id') && isset($HTTP_GET_VARS['products_id'])) {
                               $check_query = tep_db_query("select count(*) as count from " . TABLE_PRODUCTS_NOTIFICATIONS . " where products_id = '" . $HTTP_GET_VARS['products_id'] . "' and customers_id = '" . $customer_id . "'");
                               $check = tep_db_fetch_array($check_query);
                               if ($check['count'] > 0) {
                                 tep_db_query("delete from " . TABLE_PRODUCTS_NOTIFICATIONS . " where products_id = '" . $HTTP_GET_VARS['products_id'] . "' and customers_id = '" . $customer_id . "'");
                               }
                               tep_redirect(tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action'))));
                             } else {
                               $navigation->set_snapshot();
                               tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
                             }
                             break;
     case 'cust_order' :     if (tep_session_is_registered('customer_id') && isset($HTTP_GET_VARS['pid'])) {
                               if (tep_has_product_attributes($HTTP_GET_VARS['pid'])) {
                                 tep_redirect(tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['pid']));
                               } else {
                                 $cart->add_cart($HTTP_GET_VARS['pid'], $cart->get_quantity($HTTP_GET_VARS['pid'])+1);
                               }
                             }
                             tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));
                             break;
   }
 }

// include the who's online functions
 require(DIR_WS_FUNCTIONS . 'whos_online.php');
 tep_update_whos_online();

// include the password crypto functions
 require(DIR_WS_FUNCTIONS . 'password_funcs.php');

// include validation functions (right now only email address)
 require(DIR_WS_FUNCTIONS . 'validations.php');

// split-page-results
 require(DIR_WS_CLASSES . 'split_page_results.php');

// infobox
 require(DIR_WS_CLASSES . 'boxes.php');

// auto activate and expire banners
 require(DIR_WS_FUNCTIONS . 'banner.php');
 tep_activate_banners();
 tep_expire_banners();

// auto expire special products
 require(DIR_WS_FUNCTIONS . 'specials.php');
 tep_expire_specials();

// calculate category path
 if (isset($HTTP_GET_VARS['cPath'])) {
   $cPath = $HTTP_GET_VARS['cPath'];
 } elseif (isset($HTTP_GET_VARS['products_id']) && !isset($HTTP_GET_VARS['manufacturers_id'])) {
   $cPath = tep_get_product_path($HTTP_GET_VARS['products_id']);
 } else {
   $cPath = '';
 }

 if (tep_not_null($cPath)) {
   $cPath_array = tep_parse_category_path($cPath);
   $cPath = implode('_', $cPath_array);
   $current_category_id = $cPath_array[(sizeof($cPath_array)-1)];
 } else {
   $current_category_id = 0;
 }

// include the breadcrumb class and start the breadcrumb trail
 require(DIR_WS_CLASSES . 'breadcrumb.php');
 $breadcrumb = new breadcrumb;

 $breadcrumb->add(HEADER_TITLE_TOP, HTTP_SERVER);
 $breadcrumb->add(HEADER_TITLE_CATALOG, tep_href_link(FILENAME_DEFAULT));

// add category names or the manufacturer name to the breadcrumb trail
 if (isset($cPath_array)) {
   for ($i=0, $n=sizeof($cPath_array); $i<$n; $i++) {
     $categories_query = tep_db_query("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$cPath_array[$i] . "' and language_id = '" . (int)$languages_id . "'");
     if (tep_db_num_rows($categories_query) > 0) {
       $categories = tep_db_fetch_array($categories_query);
       $breadcrumb->add($categories['categories_name'], tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', array_slice($cPath_array, 0, ($i+1)))));
     } else {
       break;
     }
   }
 } elseif (isset($HTTP_GET_VARS['manufacturers_id'])) {
   $manufacturers_query = tep_db_query("select manufacturers_name from " . TABLE_MANUFACTURERS . " where manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'");
   if (tep_db_num_rows($manufacturers_query)) {
     $manufacturers = tep_db_fetch_array($manufacturers_query);
     $breadcrumb->add($manufacturers['manufacturers_name'], tep_href_link(FILENAME_DEFAULT, 'manufacturers_id=' . $HTTP_GET_VARS['manufacturers_id']));
   }
 }

// add the products model to the breadcrumb trail
 if (isset($HTTP_GET_VARS['products_id'])) {
   $model_query = tep_db_query("select products_model from " . TABLE_PRODUCTS . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "'");
   if (tep_db_num_rows($model_query)) {
     $model = tep_db_fetch_array($model_query);
     $breadcrumb->add($model['products_model'], tep_href_link(FILENAME_PRODUCT_INFO, 'cPath=' . $cPath . '&products_id=' . $HTTP_GET_VARS['products_id']));
   }
 }

// initialize the message stack for output messages
 require(DIR_WS_CLASSES . 'message_stack.php');
 $messageStack = new messageStack;

// set which precautions should be checked
 define('WARN_INSTALL_EXISTENCE', 'true');
 define('WARN_CONFIG_WRITEABLE', 'true');
 define('WARN_SESSION_DIRECTORY_NOT_WRITEABLE', 'true');
 define('WARN_SESSION_AUTO_START', 'true');
 define('WARN_DOWNLOAD_DIRECTORY_NOT_READABLE', 'true');
?>

 

In the file \catalog\includes\application_top.php, I found this line :

 

// include currencies class and create an instance
 require(DIR_WS_CLASSES . 'currencies.php');
 $currencies = new currencies();

 

2 - From the file install.html, in the file catalog\admin\categories.php, you show

 

After (around line 384):

} elseif (tep_not_null($HTTP_POST_VARS)) {
$pInfo->objectInfo($HTTP_POST_VARS);

 

replace with :

// BOF qpbpp
  $price_breaks_array = array();
  for ($count = 0; $count <= (PRICE_BREAK_NOF_LEVELS - 1); $count++) {
	if(isset($HTTP_POST_VARS['products_price' . $count]) && tep_not_null($HTTP_POST_VARS['products_price' . $count]) &&
	   isset($HTTP_POST_VARS['products_qty' . $count]) && tep_not_null($HTTP_POST_VARS['products_qty' . $count])) {
	  $price_breaks_array[] = array(
		'products_price' => $HTTP_POST_VARS['products_price' . $count],
		'products_qty' => $HTTP_POST_VARS['products_qty' . $count],
		'products_delete' => (isset($HTTP_POST_VARS['products_delete' . $count]) && tep_not_null($HTTP_POST_VARS['products_delete' . $count])));
	}
  }
// EOF qpbpp

 

Is it not replace with, but ADD, isn't it ? Can you confirm this because I don't replace this 10-12 lines by the next lines, there are like more 600 lines. So, after, I ADD, but not replace with.

 

With my thanks

 

Christophe


PHP 4.3.10 ; MYSQL : 4.1.9 ;

Share this post


Link to post
Share on other sites
I don't think so, because it defaults to 1 if it is not set.

However, from the code you posted I see that you only query for the maxorder when the product is not yet in the cart. If it is already in the cart, the info is obtained from PriceFormatterStore.

 

Jan,

 

I made your changes, and they worked well. However, I am still having the problem with updating cart quantity. When trying to "Add to Cart" a product that is already there, the Cart Quantity does still not seem to update.

 

Here is the URL to my test site, if you'd like. You have to enter into the "catalog level" of the site, accessing by the domain name alone will eventually redirect you to a "live" site.

 

www.londerwine.com/catalog

 

Thanks in advance. The NL is a lovely country.

Share this post


Link to post
Share on other sites
Jan,

 

When trying to "Add to Cart" a product that is already there, the Cart Quantity does still not seem to update.

 

Jan,

 

I think I figured it out. It has to do with the replaced code in application_top, and the fact that I didn't change my index and product_info pages. This is the piece of code in question:

 

//BOF qpbpp
//$cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], 
$HTTP_POST_VARS['id']))+1, $HTTP_POST_VARS['id']);
$cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], 
$HTTP_POST_VARS['id'])) + $HTTP_POST_VARS['cart_quantity'], $HTTP_POST_VARS['id']);
//EOF qpbpp

 

I changed it back to the original code, since I am not using the product_info/index page quantity box feature from this contrib. It seems to work just fine. Does this seem to make sense to you?

 

Thank you so much for all your hard work.

Edited by clemptor

Share this post


Link to post
Share on other sites
@Jan Zonjee > first, thanks for your answer

 

If i use PHP 4.3.10 ; MYSQL : 4.1.9 ; is it good or not ?

 

1 - Before posting, in the file \catalog\includes\classes\shopping_cart.php, with notepad++, I checked by seeking global $

You have no business looking in there. You have to make that particular change in catalog/includes/application_top.php

Share this post


Link to post
Share on other sites

@jan, thanks

 

In the file \includes\classes\shopping_cart.php of the contribution qpbpp v1.3.4, published this file and sought global $currencies

 

I found this code :

return substr($product_id_list, 2);
}

function calculate() {
  global $currencies, $languages_id, $pfs; // for qpbpp added: $languages_id, $pfs

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

 

In the file \includes\classes\shopping_cart.php of french version oscommerce-2.2ms2-FR-060817

 

I found this code :

return substr($product_id_list, 2);
}

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

 

I added as it is indicated in the file install.html after function calculate() {

 

global $currencies, $languages_id, $pfs; // for qpbpp added: $languages_id, $pfs

 

Before I had

 

1216970602d8qvv9a.png

 

After I have

 

1217673432sy1q5q8.jpg

 

others errors in principale\admin\categories.php, but I start again categories.php in install.html ; it's OK now

 

Last thing, that display From 36.00€

 

1216970911yduyl19.png

 

But I would want something like this :

 

Exemple

 

@jan

You have no business looking in there. You have to make that particular change in catalog/includes/application_top.php

But I don't kown what I must change or add :

 

I followed the correct procedure in the file install.php

 

After (around line 259):
// include currencies class and create an instance
 require(DIR_WS_CLASSES . 'currencies.php');
 $currencies = new currencies();

Add:
// BOF qpbpp
 // include the price formatter classes for the price breaks contribution
 require(DIR_WS_CLASSES . 'PriceFormatter.php');
 $pf = new PriceFormatter;
 require(DIR_WS_CLASSES . 'PriceFormatterStore.php');
 $pfs = new PriceFormatterStore;
// EOF qpbpp

Find
$cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], $HTTP_POST_VARS['id']))+1, $HTTP_POST_VARS['id']);

Replace with:
//BOF qpbpp
							//$cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], $HTTP_POST_VARS['id']))+1, $HTTP_POST_VARS['id']);
							$cart->add_cart($HTTP_POST_VARS['products_id'], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'], $HTTP_POST_VARS['id'])) + $HTTP_POST_VARS['cart_quantity'], $HTTP_POST_VARS['id']);
//EOF qpbpp

 

Can you give me some hints to add code ?

 

Have a nice day

 

Christophe


PHP 4.3.10 ; MYSQL : 4.1.9 ;

Share this post


Link to post
Share on other sites

Hello,

 

First, sorry for my poor english..

 

I try to install this contribution and it seems to works well but...

I have a problem only with my credit card payment.(cybermut on MS2.2 FR)

After credit card payment, the order is not save and the shopping cart is not empty?

Do you know this problem?

 

Thanks to reply

 

Jerome

Share this post


Link to post
Share on other sites
I try to install this contribution and it seems to works well but...

I have a problem only with my credit card payment.(cybermut on MS2.2 FR)

After credit card payment, the order is not save and the shopping cart is not empty?

Do you know this problem?

I don't think this has something to do with QPBPP. Could it be that the customer does not go back to your site after having paid (there are only about half a milliion topics on that with PayPal :) ).

Share this post


Link to post
Share on other sites
I don't think this has something to do with QPBPP. Could it be that the customer does not go back to your site after having paid (there are only about half a milliion topics on that with PayPal :) ).

No, we tested it, we gone back to the site and the order is not saved in the admin section. I think there is a problem with the install, when you say to replace global $currencies;

( that we can't find it on a 2.2 MS2 )

I'm sure that the problem comes catalog\includes\classes\shopping_cart.ph.

 

 

Thanks for helping us!

Share this post


Link to post
Share on other sites

The only file who affect the payment is catalog\includes\classes\shopping_cart.php, this is the reason why i'm thinking that the problem comes from the file.

I notice that we have Credit Class & Gift Voucher modifications in this same file.

 

Thanks again :)

Share this post


Link to post
Share on other sites

Thanks guys we resolved the problem :P

 

The problem come from a french payment module ( CIC )

 

:rolleyes:

Share this post


Link to post
Share on other sites

Hi, I am really sorry if this has already been answered but have done a good long search on the forum without results.

 

So.

 

How do I display the cheapest price break price in the product info page and on the search results page instead of the dearest?

 

eg. Product is 1-10qty. $10ea , 11-99qty $8ea, 100+ qty $4.00ea

 

I would like the product info/search results to display... " Priced From $4.00 "

as most products are sold in the largest quantity.

 

Thanks for your help and all the great work on this contribution!

 

Cheers, Kristy.

Share this post


Link to post
Share on other sites

OK, so, first off, I'm not at all a php/mySQL person.

 

But I completed the install, and followed all the steps. I even managed to fix a few problems - I think!

 

But now I'm really stuck. When I click on Categories / Products, I get the following error:

 

fatal error: Call to undefined function: tep_hide_session_id() in /home/content/r/y/a/ryanprinting/html/shop/catalog/admin/categories.php on line 917

 

line 917 in that file says:

 

   echo tep_hide_session_id() . '</form>';

 

Also, I don't know if it is relevant or not, but when I click on Discount Categories, I get:

 

Discount categories	   	Search:
Sort dcID --> 1-2-3 From Top Sort dcID --> 3-2-1 From Top
dcID 	Sort Name --> A-B-C From Top Sort Name --> Z-X-Y From Top
Name

 

Any idea where I should start to solve this?

 

Thanks in advance!

Edited by grrlscout

Share this post


Link to post
Share on other sites
Seems that the $price_breaks_array is empty, so the most logical explanation would be that the query to get those is either not there or misplaced. Should be somewhere close to the (HTML) start of the page:

	  $pInfo->objectInfo($product);
// BOF qpbpp
  $price_breaks_array = array();
  $price_breaks_query = tep_db_query("select products_price, products_qty from " . TABLE_PRODUCTS_PRICE_BREAK . " where products_id = '" . tep_db_input($pInfo->products_id) . "' order by products_qty");
  while ($price_break = tep_db_fetch_array($price_breaks_query)) {
	$price_breaks_array[] = $price_break;
  }
// EOF qpbpp

 

I have an identical problem, price breaks not there when subsequently editing products. I have checked categories.php and it has the above code at line 463, is this the correct place for it , could there be another reason for loosing the price level and quantity data. (the quantity block data is intact)

 

Thanks Giles

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×