Jan Zonjee Posted July 16, 2008 Share Posted July 16, 2008 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. Quote Link to comment Share on other sites More sharing options...
♥FWR Media Posted July 16, 2008 Share Posted July 16, 2008 (edited) @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 July 16, 2008 by FWR Media Quote Ultimate SEO Urls 5 PRO - Multi Language Modern, Powerful SEO Urls KissMT Dynamic SEO Meta & Canonical Header Tags KissER Error Handling and Debugging KissIT Image Thumbnailer Security Pro - Querystring protection against hackers ( a KISS contribution ) If you found my post useful please click the "Like This" button to the right. Please only PM me for paid work. Link to comment Share on other sites More sharing options...
clemptor Posted July 22, 2008 Share Posted July 22, 2008 (edited) 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 July 22, 2008 by clemptor Quote Link to comment Share on other sites More sharing options...
Jan Zonjee Posted July 22, 2008 Share Posted July 22, 2008 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. Quote Link to comment Share on other sites More sharing options...
Asia-Discounter.de Posted July 26, 2008 Share Posted July 26, 2008 hi there, is this contribution compatible with the 'separate pricing per customer'-module? Same question from me. Is there a contrip fpr sppc? I only found some old ones. Quote Link to comment Share on other sites More sharing options...
Jan Zonjee Posted July 26, 2008 Share Posted July 26, 2008 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. Quote Link to comment Share on other sites More sharing options...
cleroy61 Posted July 28, 2008 Share Posted July 28, 2008 Quote PHP 4.3.10 ; MYSQL : 4.1.9 ; Link to comment Share on other sites More sharing options...
Asia-Discounter.de Posted July 29, 2008 Share Posted July 29, 2008 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? Quote Link to comment Share on other sites More sharing options...
Jan Zonjee Posted July 30, 2008 Share Posted July 30, 2008 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 :) Quote Link to comment Share on other sites More sharing options...
Jan Zonjee Posted July 30, 2008 Share Posted July 30, 2008 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. Quote Link to comment Share on other sites More sharing options...
cleroy61 Posted July 31, 2008 Share Posted July 31, 2008 @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 Quote PHP 4.3.10 ; MYSQL : 4.1.9 ; Link to comment Share on other sites More sharing options...
clemptor Posted August 1, 2008 Share Posted August 1, 2008 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. Quote Link to comment Share on other sites More sharing options...
clemptor Posted August 2, 2008 Share Posted August 2, 2008 (edited) 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 August 2, 2008 by clemptor Quote Link to comment Share on other sites More sharing options...
Jan Zonjee Posted August 2, 2008 Share Posted August 2, 2008 @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 Quote Link to comment Share on other sites More sharing options...
cleroy61 Posted August 2, 2008 Share Posted August 2, 2008 @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 After I have 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€ 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 Quote PHP 4.3.10 ; MYSQL : 4.1.9 ; Link to comment Share on other sites More sharing options...
foxtoto2000 Posted August 5, 2008 Share Posted August 5, 2008 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 Quote Link to comment Share on other sites More sharing options...
Jan Zonjee Posted August 5, 2008 Share Posted August 5, 2008 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 :) ). Quote Link to comment Share on other sites More sharing options...
ryudr Posted August 5, 2008 Share Posted August 5, 2008 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! Quote Link to comment Share on other sites More sharing options...
ryudr Posted August 5, 2008 Share Posted August 5, 2008 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 :) Quote Link to comment Share on other sites More sharing options...
foxtoto2000 Posted August 5, 2008 Share Posted August 5, 2008 I work with Ryudr on the website This site is in production since several years and the credit car payment work since the beginning. Quote Link to comment Share on other sites More sharing options...
ryudr Posted August 5, 2008 Share Posted August 5, 2008 No one can help us ? :blink: Quote Link to comment Share on other sites More sharing options...
ryudr Posted August 5, 2008 Share Posted August 5, 2008 Thanks guys we resolved the problem :P The problem come from a french payment module ( CIC ) :rolleyes: Quote Link to comment Share on other sites More sharing options...
virtue Posted August 6, 2008 Share Posted August 6, 2008 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. Quote Link to comment Share on other sites More sharing options...
grrlscout Posted August 7, 2008 Share Posted August 7, 2008 (edited) 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 August 7, 2008 by grrlscout Quote Link to comment Share on other sites More sharing options...
gilesn Posted August 12, 2008 Share Posted August 12, 2008 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.