babyarmadillo Posted October 6, 2004 Share Posted October 6, 2004 www.ipodxtras.com There ya go... thanks! :) Let me know what you think... <{POST_SNAPBACK}> Well apart from the font being different when the price appears (which makes it look a little clunky) it seems fine... Did you have teething problems with it? I have a deadline to get this up and sorted cos I have magazine ads running in a couple of weeks! Quote Link to comment Share on other sites More sharing options...
Guest Posted October 6, 2004 Share Posted October 6, 2004 So for qtpro 3.0, what is the correct SQL??? It tries to drop a nonexistant table while adding an existing table. What should it be doing? Quote Link to comment Share on other sites More sharing options...
Guest Posted October 6, 2004 Share Posted October 6, 2004 also, is it just me, or is there an admin/stock.php file that is missing from this contrib? There is stock.php in admin/includes/languages/english/ but not in the admin directory. Quote Link to comment Share on other sites More sharing options...
mijman2 Posted October 6, 2004 Share Posted October 6, 2004 Not sure about qtpro 3.0... I dont think anyone has got it working yet... Use the version before that, that Tom ediited Quote Link to comment Share on other sites More sharing options...
maniac101 Posted October 7, 2004 Share Posted October 7, 2004 Hi, I installed QTpro3.0 then reverted to the SQL from 2.3 and found the issues with missing LOW_STAT filename in the admin filenames.php and so far its sort of working okay. I can add stock and the stock shows up fine as expected in product_info - even makes the qty correct for all options together in the stock qty for the product in admin. But i have a simple problem now - should be simple! i get a fatal error: Fatal error: Call to undefined function: tep_check_stock_new() in both checkout_payment.php and shopping_cart.php. But.. this function is in /includes/general.php which is included via application_top.php (which is included via both the two files where it is used) so i am a little confused as to why this function isnt being found..?? How do i troubleshoot the cause of this ? Thanks Quote Regards Mark Brindle Link to comment Share on other sites More sharing options...
maniac101 Posted October 7, 2004 Share Posted October 7, 2004 Ah fixed the problem. Didnt realise the fatal error meant my function def was no good - i have another contrib for stock status messages too in general.php which i accidently screwed in the process. Quote Regards Mark Brindle Link to comment Share on other sites More sharing options...
maniac101 Posted October 7, 2004 Share Posted October 7, 2004 Hi Ive just been testing 2.3/3.0 with single and multiple attributes. With single attributes i get correct 'out of stock messages' in product_info, but i am allowed to checkout these products if i do not explicitly set the stock value of the attribute to zero in the admin stock page. So this is not so good, but setting zero is a workaround that should probably be good practice to do. With multiple attributes, i get 'out of stock' messages in product_info for all products even when all of the attribute combinations are set correctly with stock levels in admin stock. The database table of PRODUCT_STOCK is correct - i see the attribute pairs correctly - one pair for each attribute in a comma delimited list. The appropriate bit (i think) of product_info.php code looks like this: //START get attribute stock values $attribute_stock_query = tep_db_query("select products_stock_quantity from " . TABLE_PRODUCTS_STOCK . " where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and products_stock_attributes = '" . (int)$products_options['options_id'] . "-" . (int)$products_options['options_values_id'] . "'"); $attributes_stock = tep_db_fetch_array($attribute_stock_query); $option_stock = $attributes_stock['products_stock_quantity']; //END get attribute stock values if ($option_stock == 0) { $products_options_array[] = array('id' => $products_options['products_options_values_id'], 'text' => 'Out of Stock - ' . $products_options['products_options_values_name']); } else { $products_options_array[] = array('id' => $products_options['products_options_values_id'], 'text' => $products_options['products_options_values_name']); } In theory the query is returning a zero value for qty - but my PHP is no good yet, so can someone look at this section of code and see if it really would get a zero when the sql entry is something like 1-26,2-35 (meaning attrib option 1 is 26 and attrib option 2 is 35. Ive got a php book now so im gonna try to work it out, but if anyone gets time first please help.. I assume it would be simple task to modify product_info to not display the option at all (as some people have asked for) instead of marking the attribute out of stock. In theory that should look okay if you used it in conjunction with another change that displayed a out of stock message for the product as a whole. Thanks for any help on this. Quote Regards Mark Brindle Link to comment Share on other sites More sharing options...
sinryder Posted October 8, 2004 Share Posted October 8, 2004 hello guys , i am getting this error add the product to my cart Fatal error: Call to undefined function: tep_check_stock() in /home2/mghwor/public_html/shopping_cart.php on line 135 any help is greatly appreciated thankyou Quote Link to comment Share on other sites More sharing options...
mijman2 Posted October 8, 2004 Share Posted October 8, 2004 what are lines 130-140 of shopping_cart.php? Quote Link to comment Share on other sites More sharing options...
judebert Posted October 11, 2004 Share Posted October 11, 2004 Just wanted to throw in my thanks for this contribution. Quite useful, not as computaionally expensive as the one I would have programmed... all-around impressive. Some problems with the 2.3 install, but the forums were useful for figuring it out. It was even easy to modify: my drop-downs no longer say "Out of Stock", but "Check Availability" instead; and it was easy enough to put it at the end of the string instead of the front. Thanks! Once I actually implement the "Check Availability" button, I'll post a link to the store. Quote If this were easy, everybody would do it. Link to comment Share on other sites More sharing options...
judebert Posted October 11, 2004 Share Posted October 11, 2004 Incidentally, if you're getting a 404 error for admin/stats_low_stock_attrib.php, it's because 2.3 put it in the catalog directory, not the admin directory. Move it, and everything will be fine. Quote If this were easy, everybody would do it. Link to comment Share on other sites More sharing options...
sinryder Posted October 13, 2004 Share Posted October 13, 2004 hello guys , any one got QTPRO 3.0 to work yet ? i have already installed to many contributions and in QTPRO v2.3 , there are no installation instructions :( thankyou Quote Link to comment Share on other sites More sharing options...
sinryder Posted October 13, 2004 Share Posted October 13, 2004 (edited) Guys i am getting SQL error that table already exits . its for v 3.0 Edited October 13, 2004 by sinryder Quote Link to comment Share on other sites More sharing options...
sinryder Posted October 13, 2004 Share Posted October 13, 2004 Guys i am getting SQL error that table already exits . its for v 3.0 <{POST_SNAPBACK}> hello , the sql problem is solved , i used the sql file that came with v 2.3 instead of the one in v3.0 . I just have one little problem . in admin - product attributes the special tab works opposite , when i turn the special to No , the attribute works but when i Edit it to YES , it wont work. is it suppose to be like this or the other way around. thanks Quote Link to comment Share on other sites More sharing options...
bubbasplitshot Posted October 13, 2004 Share Posted October 13, 2004 hello , the sql problem is solved , i used the sql file that came with v 2.3 instead of the one in v3.0 . I just have one little problem . in admin - product attributes the special tab works opposite , when i turn the special to No , the attribute works but when i Edit it to YES , it wont work. is it suppose to be like this or the other way around. thanks <{POST_SNAPBACK}> sinryder, are you saying you're getting the mulitple attributes to work?! :) So that you're not seeing the "Out of Stock -" message? If so, could you explain in more detail what solved it? I'd really like to get this fixed. Thanks! Quote Link to comment Share on other sites More sharing options...
sinryder Posted October 13, 2004 Share Posted October 13, 2004 hello bubbasplitshot yes its working fine but i am still testing it to look for any erros, i do have few problems so if any one can please help me out with it. i am getting this error when i try to add the product to my cart Fatal error: Call to undefined function: tep_check_stock() in /home2/bannerle/public_html/test/shopping_cart.php on line 135 this is the code around line 135 $info_box_contents[$cur_row][] = array('align' => 'center', 'params' => 'class="productListing-data" valign="top"', 'text' => tep_draw_checkbox_field('cart_delete[]', $products[$i]['id'])); $products_name = '<table border="0" cellspacing="2" cellpadding="2">' . ' <tr>' . ' <td class="productListing-data" align="center"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products[$i]['id']) . '">' . tep_image(DIR_WS_IMAGES . $products[$i]['image'], $products[$i]['name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT) . '</a></td>' . ' <td class="productListing-data" valign="top"><a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products[$i]['id']) . '"><b>' . $products[$i]['name'] . '</b></a>'; if (STOCK_CHECK == 'true') { if (isset($products[$i]['attributes']) && is_array($products[$i]['attributes'])) { $stock_check = tep_check_stock_new($products[$i]['id'], $products[$i]['attributes'], $products[$i]['quantity']); }else{ $stock_check = tep_check_stock($products[$i]['id'], $products[$i]['quantity']); } if (tep_not_null($stock_check)) { $any_out_of_stock = 1; $products_name .= $stock_check; } } if (isset($products[$i]['attributes']) && is_array($products[$i]['attributes'])) { reset($products[$i]['attributes']); while (list($option, $value) = each($products[$i]['attributes'])) { $products_name .= '<br><small><i> - ' . $products[$i][$option]['products_options_name'] . ' ' . $products[$i][$option]['products_options_values_name'] . '</i></small>'; } } and this is the code on line 135 $stock_check = tep_check_stock_new($products[$i]['id'], $products[$i]['attributes'], $products[$i]['quantity']); but if i remove this code $stock_check = tep_check_stock_new($products[$i]['id'], $products[$i]['attributes'], $products[$i]['quantity']); the whole QTP works fine without any errors. so can any one please tell me if this code is important or not or how can i fix this. bubbasplitshot whats the problem with your code ? if you need any help let me know. thanks Quote Link to comment Share on other sites More sharing options...
TomThumb Posted October 13, 2004 Share Posted October 13, 2004 You should have two functions in /catalog/includes/functions/general tep_check_stock // Check if the required stock is available // If insufficent stock is available return an out of stock message function tep_check_stock($products_id, $products_quantity) { $stock_left = tep_get_products_stock($products_id) - $products_quantity; $out_of_stock = ''; if ($stock_left < 0) { $out_of_stock = '<span class="markProductOutOfStock">' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . '</span>'; } return $out_of_stock; } tep_check_stock_new // Check if the required stock is available // If insufficent stock is available return an out of stock message function tep_check_stock($products_id, $products_quantity) { $stock_left = tep_get_products_stock($products_id) - $products_quantity; $out_of_stock = ''; if ($stock_left < 0) { $out_of_stock = '<span class="markProductOutOfStock">' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . '</span>'; } return $out_of_stock; } // Begin add for qtpro function tep_check_stock_new($products_id, $products_attibutes, $products_quantity) { global $languages_id; $products_id = tep_get_prid($products_id); $arr1=array(); // if (preg_match("/^(\d+)/",$products_id,$m)) $products_id=$m[1]; asort($products_attibutes); while(list($v1,$v2)=each($products_attibutes)) { $arr1[]=$v1; } $arr1=implode(",",$arr1); $q=tep_db_query("select products_options_id, special from " . TABLE_PRODUCTS_OPTIONS . " where products_options_id in ($arr1) and language_id= '" . (int)$languages_id . "'"); while($rec=tep_db_fetch_array($q)) { $special[$rec[products_options_id]]=$rec[special]; } $attr=array(); reset($products_attibutes); while(list($v1,$v2)=each($products_attibutes)) { if (!$special[$v1]) $attr[]="$v1-$v2"; } $attr=implode(",",$attr); $q=tep_db_query("select products_stock_quantity as quantity from " . TABLE_PRODUCTS_STOCK . " where products_id='". (int)$products_id . "' and products_stock_attributes='$attr'"); if (tep_db_num_rows($q)>0) { $rec=tep_db_fetch_array($q); $quantity=$rec[quantity]; } else { $quantity = tep_get_products_stock($products_id); } $stock_left=$quantity-$products_quantity; $out_of_stock = ''; if ($stock_left < 0) { $out_of_stock = '<span class="markProductOutOfStock">' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . '</span>'; } return $out_of_stock; } //// End add for qtpro Quote while (!succeed) {try()}; GMT -6:00 Link to comment Share on other sites More sharing options...
sinryder Posted October 14, 2004 Share Posted October 14, 2004 hey tom , thanks for replying . my general php is a little diff then what you posted. Can you please take a look at the code and let me know if any thing is wrong in it. catalog/includes/functions/general.php <?php/* $Id: general.php,v 1.231 2003/07/09 01:15:48 hpdl Exp $ osCommerce, Open Source E-Commerce Solutions http://www.oscommerce.com Copyright (c) 2003 osCommerce Released under the GNU General Public License*/ ////// Stop from parsing any further PHP code function tep_exit() { tep_session_close(); exit(); } ////// Redirect to another page or site function tep_redirect($url) { if ( (ENABLE_SSL == true) && (getenv('HTTPS') == 'on') ) { // We are loading an SSL page if (substr($url, 0, strlen(HTTP_SERVER)) == HTTP_SERVER) { // NONSSL url $url = HTTPS_SERVER . substr($url, strlen(HTTP_SERVER)); // Change it to SSL } } header('Location: ' . $url); tep_exit(); } ////// Parse the data used in the html tags to ensure the tags will not break function tep_parse_input_field_data($data, $parse) { return strtr(trim($data), $parse); } function tep_output_string($string, $translate = false, $protected = false) { if ($protected == true) { return htmlspecialchars($string); } else { if ($translate == false) { return tep_parse_input_field_data($string, array('"' => '"')); } else { return tep_parse_input_field_data($string, $translate); } } } function tep_output_string_protected($string) { return tep_output_string($string, false, true); } function tep_sanitize_string($string) { $string = ereg_replace(' +', ' ', trim($string)); return preg_replace("/[<>]/", '_', $string); } ////// Return a random row from a database query function tep_random_select($query) { $random_product = ''; $random_query = tep_db_query($query); $num_rows = tep_db_num_rows($random_query); if ($num_rows > 0) { $random_row = tep_rand(0, ($num_rows - 1)); tep_db_data_seek($random_query, $random_row); $random_product = tep_db_fetch_array($random_query); } return $random_product; } ////// Return a product's name// TABLES: products function tep_get_products_name($product_id, $language = '') { global $languages_id; if (empty($language)) $language = $languages_id; $product_query = tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$product_id . "' and language_id = '" . (int)$language . "'"); $product = tep_db_fetch_array($product_query); return $product['products_name']; } ////// Return a product's special price (returns nothing if there is no offer)// TABLES: products function tep_get_products_special_price($product_id) { $product_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . (int)$product_id . "' and status"); $product = tep_db_fetch_array($product_query); return $product['specials_new_products_price']; } ////// Return a product's stock// TABLES: products function tep_get_products_stock($products_id) { $products_id = tep_get_prid($products_id); $stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . (int)$products_id . "'"); $stock_values = tep_db_fetch_array($stock_query); return $stock_values['products_quantity']; } ////// Check if the required stock is available// If insufficent stock is available return an out of stock message function tep_check_stock_new($products_id, $products_attibutes, $products_quantity) { global $languages_id; $products_id = tep_get_prid($products_id); $arr1=array(); // if (preg_match("/^(\d+)/",$products_id,$m)) $products_id=$m[1]; asort($products_attibutes); while(list($v1,$v2)=each($products_attibutes)) { $arr1[]=$v1; } $arr1=implode(",",$arr1); $q=tep_db_query("select products_options_id, special from " . TABLE_PRODUCTS_OPTIONS . " where products_options_id in ($arr1) and language_id= '" . (int)$languages_id . "'"); while($rec=tep_db_fetch_array($q)) { $special[$rec[products_options_id]]=$rec[special]; } $attr=array(); reset($products_attibutes); while(list($v1,$v2)=each($products_attibutes)) { if (!$special[$v1]) $attr[]="$v1-$v2"; } $attr=implode(",",$attr); $q=tep_db_query("select products_stock_quantity as quantity from " . TABLE_PRODUCTS_STOCK . " where products_id='". (int)$products_id . "' and products_stock_attributes='$attr'"); if (tep_db_num_rows($q)>0) { $rec=tep_db_fetch_array($q); $quantity=$rec[quantity]; } else { $quantity = tep_get_products_stock($products_id); } $stock_left=$quantity-$products_quantity; $out_of_stock = ''; if ($stock_left < 0) { $out_of_stock = '<span class="markProductOutOfStock">' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . '</span>'; } return $out_of_stock; } ////// Break a word in a string if it is longer than a specified length ($len) function tep_break_string($string, $len, $break_char = '-') { $l = 0; $output = ''; for ($i=0, $n=strlen($string); $i<$n; $i++) { $char = substr($string, $i, 1); if ($char != ' ') { $l++; } else { $l = 0; } if ($l > $len) { $l = 1; $output .= $break_char; } $output .= $char; } return $output; } ////// Return all HTTP GET variables, except those passed as a parameter function tep_get_all_get_params($exclude_array = '') { global $HTTP_GET_VARS; if (!is_array($exclude_array)) $exclude_array = array(); $get_url = ''; if (is_array($HTTP_GET_VARS) && (sizeof($HTTP_GET_VARS) > 0)) { reset($HTTP_GET_VARS); while (list($key, $value) = each($HTTP_GET_VARS)) { if ( (strlen($value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y') ) { $get_url .= $key . '=' . rawurlencode(stripslashes($value)) . '&'; } } } return $get_url; } ////// Returns an array with countries// TABLES: countries function tep_get_countries($countries_id = '', $with_iso_codes = false) { $countries_array = array(); if (tep_not_null($countries_id)) { if ($with_iso_codes == true) { $countries = tep_db_query("select countries_name, countries_iso_code_2, countries_iso_code_3 from " . TABLE_COUNTRIES . " where countries_id = '" . (int)$countries_id . "' order by countries_name"); $countries_values = tep_db_fetch_array($countries); $countries_array = array('countries_name' => $countries_values['countries_name'], 'countries_iso_code_2' => $countries_values['countries_iso_code_2'], 'countries_iso_code_3' => $countries_values['countries_iso_code_3']); } else { $countries = tep_db_query("select countries_name from " . TABLE_COUNTRIES . " where countries_id = '" . (int)$countries_id . "'"); $countries_values = tep_db_fetch_array($countries); $countries_array = array('countries_name' => $countries_values['countries_name']); } } else { $countries = tep_db_query("select countries_id, countries_name from " . TABLE_COUNTRIES . " order by countries_name"); while ($countries_values = tep_db_fetch_array($countries)) { $countries_array[] = array('countries_id' => $countries_values['countries_id'], 'countries_name' => $countries_values['countries_name']); } } return $countries_array; } ////// Alias function to tep_get_countries, which also returns the countries iso codes function tep_get_countries_with_iso_codes($countries_id) { return tep_get_countries($countries_id, true); } ////// Generate a path to categories function tep_get_path($current_category_id = '') { global $cPath_array; if (tep_not_null($current_category_id)) { $cp_size = sizeof($cPath_array); if ($cp_size == 0) { $cPath_new = $current_category_id; } else { $cPath_new = ''; $last_category_query = tep_db_query("select parent_id from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$cPath_array[($cp_size-1)] . "'"); $last_category = tep_db_fetch_array($last_category_query); $current_category_query = tep_db_query("select parent_id from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$current_category_id . "'"); $current_category = tep_db_fetch_array($current_category_query); if ($last_category['parent_id'] == $current_category['parent_id']) { for ($i=0; $i<($cp_size-1); $i++) { $cPath_new .= '_' . $cPath_array[$i]; } } else { for ($i=0; $i<$cp_size; $i++) { $cPath_new .= '_' . $cPath_array[$i]; } } $cPath_new .= '_' . $current_category_id; if (substr($cPath_new, 0, 1) == '_') { $cPath_new = substr($cPath_new, 1); } } } else { $cPath_new = implode('_', $cPath_array); } return 'cPath=' . $cPath_new; } ////// Returns the clients browser function tep_browser_detect($component) { global $HTTP_USER_AGENT; return stristr($HTTP_USER_AGENT, $component); } ////// Alias function to tep_get_countries() function tep_get_country_name($country_id) { $country_array = tep_get_countries($country_id); return $country_array['countries_name']; } ////// Returns the zone (State/Province) name// TABLES: zones function tep_get_zone_name($country_id, $zone_id, $default_zone) { $zone_query = tep_db_query("select zone_name from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country_id . "' and zone_id = '" . (int)$zone_id . "'"); if (tep_db_num_rows($zone_query)) { $zone = tep_db_fetch_array($zone_query); return $zone['zone_name']; } else { return $default_zone; } } ////// Returns the zone (State/Province) code// TABLES: zones function tep_get_zone_code($country_id, $zone_id, $default_zone) { $zone_query = tep_db_query("select zone_code from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country_id . "' and zone_id = '" . (int)$zone_id . "'"); if (tep_db_num_rows($zone_query)) { $zone = tep_db_fetch_array($zone_query); return $zone['zone_code']; } else { return $default_zone; } } ////// Wrapper function for round() function tep_round($number, $precision) { if (strpos($number, '.') && (strlen(substr($number, strpos($number, '.')+1)) > $precision)) { $number = substr($number, 0, strpos($number, '.') + 1 + $precision + 1); if (substr($number, -1) >= 5) { if ($precision > 1) { $number = substr($number, 0, -1) + ('0.' . str_repeat(0, $precision-1) . '1'); } elseif ($precision == 1) { $number = substr($number, 0, -1) + 0.1; } else { $number = substr($number, 0, -1) + 1; } } else { $number = substr($number, 0, -1); } } return $number; } ////// Returns the tax rate for a zone / class// TABLES: tax_rates, zones_to_geo_zones function tep_get_tax_rate($class_id, $country_id = -1, $zone_id = -1) { global $customer_zone_id, $customer_country_id; if ( ($country_id == -1) && ($zone_id == -1) ) { if (!tep_session_is_registered('customer_id')) { $country_id = STORE_COUNTRY; $zone_id = STORE_ZONE; } else { $country_id = $customer_country_id; $zone_id = $customer_zone_id; } } $tax_query = tep_db_query("select sum(tax_rate) as tax_rate from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . (int)$country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . (int)$zone_id . "') and tr.tax_class_id = '" . (int)$class_id . "' group by tr.tax_priority"); if (tep_db_num_rows($tax_query)) { $tax_multiplier = 1.0; while ($tax = tep_db_fetch_array($tax_query)) { $tax_multiplier *= 1.0 + ($tax['tax_rate'] / 100); } return ($tax_multiplier - 1.0) * 100; } else { return 0; } } ////// Return the tax description for a zone / class// TABLES: tax_rates; function tep_get_tax_description($class_id, $country_id, $zone_id) { $tax_query = tep_db_query("select tax_description from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . (int)$country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . (int)$zone_id . "') and tr.tax_class_id = '" . (int)$class_id . "' order by tr.tax_priority"); if (tep_db_num_rows($tax_query)) { $tax_description = ''; while ($tax = tep_db_fetch_array($tax_query)) { $tax_description .= $tax['tax_description'] . ' + '; } $tax_description = substr($tax_description, 0, -3); return $tax_description; } else { return TEXT_UNKNOWN_TAX_RATE; } } ////// Add tax to a products price function tep_add_tax($price, $tax) { global $currencies; if ( (DISPLAY_PRICE_WITH_TAX == 'true') && ($tax > 0) ) { return tep_round($price, $currencies->currencies[DEFAULT_CURRENCY]['decimal_places']) + tep_calculate_tax($price, $tax); } else { return tep_round($price, $currencies->currencies[DEFAULT_CURRENCY]['decimal_places']); } } // Calculates Tax rounding the result function tep_calculate_tax($price, $tax) { global $currencies; return tep_round($price * $tax / 100, $currencies->currencies[DEFAULT_CURRENCY]['decimal_places']); } ////// Return the number of products in a category// TABLES: products, products_to_categories, categories function tep_count_products_in_category($category_id, $include_inactive = false) { $products_count = 0; if ($include_inactive == true) { $products_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_id = p2c.products_id and p2c.categories_id = '" . (int)$category_id . "'"); } else { $products_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_id = p2c.products_id and p.products_status = '1' and p2c.categories_id = '" . (int)$category_id . "'"); } $products = tep_db_fetch_array($products_query); $products_count += $products['total']; $child_categories_query = tep_db_query("select categories_id from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$category_id . "'"); if (tep_db_num_rows($child_categories_query)) { while ($child_categories = tep_db_fetch_array($child_categories_query)) { $products_count += tep_count_products_in_category($child_categories['categories_id'], $include_inactive); } } return $products_count; } ////// Return true if the category has subcategories// TABLES: categories function tep_has_category_subcategories($category_id) { $child_category_query = tep_db_query("select count(*) as count from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$category_id . "'"); $child_category = tep_db_fetch_array($child_category_query); if ($child_category['count'] > 0) { return true; } else { return false; } } ////// Returns the address_format_id for the given country// TABLES: countries; function tep_get_address_format_id($country_id) { $address_format_query = tep_db_query("select address_format_id as format_id from " . TABLE_COUNTRIES . " where countries_id = '" . (int)$country_id . "'"); if (tep_db_num_rows($address_format_query)) { $address_format = tep_db_fetch_array($address_format_query); return $address_format['format_id']; } else { return '1'; } } ////// Return a formatted address// TABLES: address_format function tep_address_format($address_format_id, $address, $html, $boln, $eoln) { $address_format_query = tep_db_query("select address_format as format from " . TABLE_ADDRESS_FORMAT . " where address_format_id = '" . (int)$address_format_id . "'"); $address_format = tep_db_fetch_array($address_format_query); $company = tep_output_string_protected($address['company']); if (isset($address['firstname']) && tep_not_null($address['firstname'])) { $firstname = tep_output_string_protected($address['firstname']); $lastname = tep_output_string_protected($address['lastname']); } elseif (isset($address['name']) && tep_not_null($address['name'])) { $firstname = tep_output_string_protected($address['name']); $lastname = ''; } else { $firstname = ''; $lastname = ''; } $street = tep_output_string_protected($address['street_address']); $suburb = tep_output_string_protected($address['suburb']); $city = tep_output_string_protected($address['city']); $state = tep_output_string_protected($address['state']); if (isset($address['country_id']) && tep_not_null($address['country_id'])) { $country = tep_get_country_name($address['country_id']); if (isset($address['zone_id']) && tep_not_null($address['zone_id'])) { $state = tep_get_zone_code($address['country_id'], $address['zone_id'], $state); } } elseif (isset($address['country']) && tep_not_null($address['country'])) { $country = tep_output_string_protected($address['country']); } else { $country = ''; } $postcode = tep_output_string_protected($address['postcode']); $zip = $postcode; if ($html) {// HTML Mode $HR = '<hr>'; $hr = '<hr>'; if ( ($boln == '') && ($eoln == "\n") ) { // Values not specified, use rational defaults $CR = '<br>'; $cr = '<br>'; $eoln = $cr; } else { // Use values supplied $CR = $eoln . $boln; $cr = $CR; } } else {// Text Mode $CR = $eoln; $cr = $CR; $HR = '----------------------------------------'; $hr = '----------------------------------------'; } $statecomma = ''; $streets = $street; if ($suburb != '') $streets = $street . $cr . $suburb; if ($country == '') $country = tep_output_string_protected($address['country']); if ($state != '') $statecomma = $state . ', '; $fmt = $address_format['format']; eval("\$address = \"$fmt\";"); if ( (ACCOUNT_COMPANY == 'true') && (tep_not_null($company)) ) { $address = $company . $cr . $address; } return $address; } ////// Return a formatted address// TABLES: customers, address_book function tep_address_label($customers_id, $address_id = 1, $html = false, $boln = '', $eoln = "\n") { $address_query = tep_db_query("select entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customers_id . "' and address_book_id = '" . (int)$address_id . "'"); $address = tep_db_fetch_array($address_query); $format_id = tep_get_address_format_id($address['country_id']); return tep_address_format($format_id, $address, $html, $boln, $eoln); } function tep_row_number_format($number) { if ( ($number < 10) && (substr($number, 0, 1) != '0') ) $number = '0' . $number; return $number; } function tep_get_categories($categories_array = '', $parent_id = '0', $indent = '') { global $languages_id; if (!is_array($categories_array)) $categories_array = array(); $categories_query = tep_db_query("select c.categories_id, cd.categories_name from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where parent_id = '" . (int)$parent_id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "' order by sort_order, cd.categories_name"); while ($categories = tep_db_fetch_array($categories_query)) { $categories_array[] = array('id' => $categories['categories_id'], 'text' => $indent . $categories['categories_name']); if ($categories['categories_id'] != $parent_id) { $categories_array = tep_get_categories($categories_array, $categories['categories_id'], $indent . ' '); } } return $categories_array; } function tep_get_manufacturers($manufacturers_array = '') { if (!is_array($manufacturers_array)) $manufacturers_array = array(); $manufacturers_query = tep_db_query("select manufacturers_id, manufacturers_name from " . TABLE_MANUFACTURERS . " order by manufacturers_name"); while ($manufacturers = tep_db_fetch_array($manufacturers_query)) { $manufacturers_array[] = array('id' => $manufacturers['manufacturers_id'], 'text' => $manufacturers['manufacturers_name']); } return $manufacturers_array; } ////// Return all subcategory IDs// TABLES: categories function tep_get_subcategories(&$subcategories_array, $parent_id = 0) { $subcategories_query = tep_db_query("select categories_id from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$parent_id . "'"); while ($subcategories = tep_db_fetch_array($subcategories_query)) { $subcategories_array[sizeof($subcategories_array)] = $subcategories['categories_id']; if ($subcategories['categories_id'] != $parent_id) { tep_get_subcategories($subcategories_array, $subcategories['categories_id']); } } } // Output a raw date string in the selected locale date format// $raw_date needs to be in this format: YYYY-MM-DD HH:MM:SS function tep_date_long($raw_date) { if ( ($raw_date == '0000-00-00 00:00:00') || ($raw_date == '') ) return false; $year = (int)substr($raw_date, 0, 4); $month = (int)substr($raw_date, 5, 2); $day = (int)substr($raw_date, 8, 2); $hour = (int)substr($raw_date, 11, 2); $minute = (int)substr($raw_date, 14, 2); $second = (int)substr($raw_date, 17, 2); return strftime(DATE_FORMAT_LONG, mktime($hour,$minute,$second,$month,$day,$year)); } ////// Output a raw date string in the selected locale date format// $raw_date needs to be in this format: YYYY-MM-DD HH:MM:SS// NOTE: Includes a workaround for dates before 01/01/1970 that fail on windows servers function tep_date_short($raw_date) { if ( ($raw_date == '0000-00-00 00:00:00') || empty($raw_date) ) return false; $year = substr($raw_date, 0, 4); $month = (int)substr($raw_date, 5, 2); $day = (int)substr($raw_date, 8, 2); $hour = (int)substr($raw_date, 11, 2); $minute = (int)substr($raw_date, 14, 2); $second = (int)substr($raw_date, 17, 2); if (@date('Y', mktime($hour, $minute, $second, $month, $day, $year)) == $year) { return date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, $year)); } else { return ereg_replace('2037' . '$', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037))); } } ////// Parse search string into indivual objects function tep_parse_search_string($search_str = '', &$objects) { $search_str = trim(strtolower($search_str)); // Break up $search_str on whitespace; quoted string will be reconstructed later $pieces = split('[[:space:]]+', $search_str); $objects = array(); $tmpstring = ''; $flag = ''; for ($k=0; $k<count($pieces); $k++) { while (substr($pieces[$k], 0, 1) == '(') { $objects[] = '('; if (strlen($pieces[$k]) > 1) { $pieces[$k] = substr($pieces[$k], 1); } else { $pieces[$k] = ''; } } $post_objects = array(); while (substr($pieces[$k], -1) == ')') { $post_objects[] = ')'; if (strlen($pieces[$k]) > 1) { $pieces[$k] = substr($pieces[$k], 0, -1); } else { $pieces[$k] = ''; } } // Check individual words if ( (substr($pieces[$k], -1) != '"') && (substr($pieces[$k], 0, 1) != '"') ) { $objects[] = trim($pieces[$k]); for ($j=0; $j<count($post_objects); $j++) { $objects[] = $post_objects[$j]; } } else {/* This means that the $piece is either the beginning or the end of a string. So, we'll slurp up the $pieces and stick them together until we get to the end of the string or run out of pieces.*/ // Add this word to the $tmpstring, starting the $tmpstring $tmpstring = trim(ereg_replace('"', ' ', $pieces[$k])); // Check for one possible exception to the rule. That there is a single quoted word. if (substr($pieces[$k], -1 ) == '"') {// Turn the flag off for future iterations $flag = 'off'; $objects[] = trim($pieces[$k]); for ($j=0; $j<count($post_objects); $j++) { $objects[] = $post_objects[$j]; } unset($tmpstring); // Stop looking for the end of the string and move onto the next word. continue; } // Otherwise, turn on the flag to indicate no quotes have been found attached to this word in the string. $flag = 'on'; // Move on to the next word $k++; // Keep reading until the end of the string as long as the $flag is on while ( ($flag == 'on') && ($k < count($pieces)) ) { while (substr($pieces[$k], -1) == ')') { $post_objects[] = ')'; if (strlen($pieces[$k]) > 1) { $pieces[$k] = substr($pieces[$k], 0, -1); } else { $pieces[$k] = ''; } } // If the word doesn't end in double quotes, append it to the $tmpstring. if (substr($pieces[$k], -1) != '"') {// Tack this word onto the current string entity $tmpstring .= ' ' . $pieces[$k]; // Move on to the next word $k++; continue; } else {/* If the $piece ends in double quotes, strip the double quotes, tack the $piece onto the tail of the string, push the $tmpstring onto the $haves, kill the $tmpstring, turn the $flag "off", and return.*/ $tmpstring .= ' ' . trim(ereg_replace('"', ' ', $pieces[$k])); // Push the $tmpstring onto the array of stuff to search for $objects[] = trim($tmpstring); for ($j=0; $j<count($post_objects); $j++) { $objects[] = $post_objects[$j]; } unset($tmpstring); // Turn off the flag to exit the loop $flag = 'off'; } } } } // add default logical operators if needed $temp = array(); for($i=0; $i<(count($objects)-1); $i++) { $temp[] = $objects[$i]; if ( ($objects[$i] != 'and') && ($objects[$i] != 'or') && ($objects[$i] != '(') && ($objects[$i+1] != 'and') && ($objects[$i+1] != 'or') && ($objects[$i+1] != ')') ) { $temp[] = ADVANCED_SEARCH_DEFAULT_OPERATOR; } } $temp[] = $objects[$i]; $objects = $temp; $keyword_count = 0; $operator_count = 0; $balance = 0; for($i=0; $i<count($objects); $i++) { if ($objects[$i] == '(') $balance --; if ($objects[$i] == ')') $balance ++; if ( ($objects[$i] == 'and') || ($objects[$i] == 'or') ) { $operator_count ++; } elseif ( ($objects[$i]) && ($objects[$i] != '(') && ($objects[$i] != ')') ) { $keyword_count ++; } } if ( ($operator_count < $keyword_count) && ($balance == 0) ) { return true; } else { return false; } } ////// Check date function tep_checkdate($date_to_check, $format_string, &$date_array) { $separator_idx = -1; $separators = array('-', ' ', '/', '.'); $month_abbr = array('jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'); $no_of_days = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); $format_string = strtolower($format_string); if (strlen($date_to_check) != strlen($format_string)) { return false; } $size = sizeof($separators); for ($i=0; $i<$size; $i++) { $pos_separator = strpos($date_to_check, $separators[$i]); if ($pos_separator != false) { $date_separator_idx = $i; break; } } for ($i=0; $i<$size; $i++) { $pos_separator = strpos($format_string, $separators[$i]); if ($pos_separator != false) { $format_separator_idx = $i; break; } } if ($date_separator_idx != $format_separator_idx) { return false; } if ($date_separator_idx != -1) { $format_string_array = explode( $separators[$date_separator_idx], $format_string ); if (sizeof($format_string_array) != 3) { return false; } $date_to_check_array = explode( $separators[$date_separator_idx], $date_to_check ); if (sizeof($date_to_check_array) != 3) { return false; } $size = sizeof($format_string_array); for ($i=0; $i<$size; $i++) { if ($format_string_array[$i] == 'mm' || $format_string_array[$i] == 'mmm') $month = $date_to_check_array[$i]; if ($format_string_array[$i] == 'dd') $day = $date_to_check_array[$i]; if ( ($format_string_array[$i] == 'yyyy') || ($format_string_array[$i] == 'aaaa') ) $year = $date_to_check_array[$i]; } } else { if (strlen($format_string) == 8 || strlen($format_string) == 9) { $pos_month = strpos($format_string, 'mmm'); if ($pos_month != false) { $month = substr( $date_to_check, $pos_month, 3 ); $size = sizeof($month_abbr); for ($i=0; $i<$size; $i++) { if ($month == $month_abbr[$i]) { $month = $i; break; } } } else { $month = substr($date_to_check, strpos($format_string, 'mm'), 2); } } else { return false; } $day = substr($date_to_check, strpos($format_string, 'dd'), 2); $year = substr($date_to_check, strpos($format_string, 'yyyy'), 4); } if (strlen($year) != 4) { return false; } if (!settype($year, 'integer') || !settype($month, 'integer') || !settype($day, 'integer')) { return false; } if ($month > 12 || $month < 1) { return false; } if ($day < 1) { return false; } if (tep_is_leap_year($year)) { $no_of_days[1] = 29; } if ($day > $no_of_days[$month - 1]) { return false; } $date_array = array($year, $month, $day); return true; } ////// Check if year is a leap year function tep_is_leap_year($year) { if ($year % 100 == 0) { if ($year % 400 == 0) return true; } else { if (($year % 4) == 0) return true; } return false; } ////// Return table heading with sorting capabilities function tep_create_sort_heading($sortby, $colnum, $heading) { global $PHP_SELF; $sort_prefix = ''; $sort_suffix = ''; if ($sortby) { $sort_prefix = '<a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('page', 'info', 'sort')) . 'page=1&sort=' . $colnum . ($sortby == $colnum . 'a' ? 'd' : 'a')) . '" title="' . tep_output_string(TEXT_SORT_PRODUCTS . ($sortby == $colnum . 'd' || substr($sortby, 0, 1) != $colnum ? TEXT_ASCENDINGLY : TEXT_DESCENDINGLY) . TEXT_BY . $heading) . '" class="productListing-heading">'; $sort_suffix = (substr($sortby, 0, 1) == $colnum ? (substr($sortby, 1, 1) == 'a' ? '+' : '-') : '') . '</a>'; } return $sort_prefix . $heading . $sort_suffix; } ////// Recursively go through the categories and retreive all parent categories IDs// TABLES: categories function tep_get_parent_categories(&$categories, $categories_id) { $parent_categories_query = tep_db_query("select parent_id from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$categories_id . "'"); while ($parent_categories = tep_db_fetch_array($parent_categories_query)) { if ($parent_categories['parent_id'] == 0) return true; $categories[sizeof($categories)] = $parent_categories['parent_id']; if ($parent_categories['parent_id'] != $categories_id) { tep_get_parent_categories($categories, $parent_categories['parent_id']); } } } ////// Construct a category path to the product// TABLES: products_to_categories function tep_get_product_path($products_id) { $cPath = ''; $category_query = tep_db_query("select p2c.categories_id from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p.products_id = '" . (int)$products_id . "' and p.products_status = '1' and p.products_id = p2c.products_id limit 1"); if (tep_db_num_rows($category_query)) { $category = tep_db_fetch_array($category_query); $categories = array(); tep_get_parent_categories($categories, $category['categories_id']); $categories = array_reverse($categories); $cPath = implode('_', $categories); if (tep_not_null($cPath)) $cPath .= '_'; $cPath .= $category['categories_id']; } return $cPath; } ////// Return a product ID with attributes function tep_get_uprid($prid, $params) { $uprid = $prid; if ( (is_array($params)) && (!strstr($prid, '{')) ) { while (list($option, $value) = each($params)) { $uprid = $uprid . '{' . $option . '}' . $value; } } return $uprid; } ////// Return a product ID from a product ID with attributes function tep_get_prid($uprid) { $pieces = explode('{', $uprid); return $pieces[0]; } ////// Return a customer greeting function tep_customer_greeting() { global $customer_id, $customer_first_name; if (tep_session_is_registered('customer_first_name') && tep_session_is_registered('customer_id')) { $greeting_string = sprintf(TEXT_GREETING_PERSONAL, tep_output_string_protected($customer_first_name), tep_href_link(FILENAME_PRODUCTS_NEW)); } else { $greeting_string = sprintf(TEXT_GREETING_GUEST, tep_href_link(FILENAME_LOGIN, '', 'SSL'), tep_href_link(FILENAME_CREATE_ACCOUNT, '', 'SSL')); } return $greeting_string; } //////! Send email (text/html) using MIME// This is the central mail function. The SMTP Server should be configured// correct in php.ini// Parameters:// $to_name The name of the recipient, e.g. "Jan Wildeboer"// $to_email_address The eMail address of the recipient,// e.g. jan.wildeboer@gmx.de// $email_subject The subject of the eMail// $email_text The text of the eMail, may contain HTML entities// $from_email_name The name of the sender, e.g. Shop Administration// $from_email_adress The eMail address of the sender,// e.g. info@mytepshop.com function tep_mail($to_name, $to_email_address, $email_subject, $email_text, $from_email_name, $from_email_address) { if (SEND_EMAILS != 'true') return false; &nbs Quote Link to comment Share on other sites More sharing options...
TomThumb Posted October 14, 2004 Share Posted October 14, 2004 sinryder, just add this above tep_check_stock_new function tep_check_stock($products_id, $products_quantity) { $stock_left = tep_get_products_stock($products_id) - $products_quantity; $out_of_stock = ''; if ($stock_left < 0) { $out_of_stock = '<span class="markProductOutOfStock">' . STOCK_MARK_PRODUCT_OUT_OF_STOCK . '</span>'; } return $out_of_stock; } Quote while (!succeed) {try()}; GMT -6:00 Link to comment Share on other sites More sharing options...
sinryder Posted October 14, 2004 Share Posted October 14, 2004 Thanks Tom , that error is gone :) but a little more problem . Every thing woks fine but when i try to confirm the order this is what i get: 1054 - Unknown column 'products_attributes_quantity' in 'field list' insert into orders_products_attributes (orders_id, orders_products_id, products_options, products_options_values, options_values_price, price_prefix, products_attributes_quantity) values ('934', '1723', 'Size', 'S', '0.0000', '+', '') [TEP STOP] i guess this will be my last problem , Every thing else is working fine :) thanks again for the help Quote Link to comment Share on other sites More sharing options...
mijman2 Posted October 14, 2004 Share Posted October 14, 2004 Can you please post your website so we an see please? That is an SQL error did you run the SQL script in phpmyAdmin? I think it is buggy in 3.0 .... Might just want to go through manually and see what name corresponds with what option... Quote Link to comment Share on other sites More sharing options...
sinryder Posted October 14, 2004 Share Posted October 14, 2004 Can you please post your website so we an see please? That is an SQL error did you run the SQL script in phpmyAdmin? I think it is buggy in 3.0 .... Might just want to go through manually and see what name corresponds with what option... <{POST_SNAPBACK}> hey steve , heres my site , please feel free to create an account and place an order , you will see when you hit the confirm button it gives the error. if i remove this code from checkout_process.php . the whole thing works fine. 'products_attributes_quantity' => $attributs_values['products_attributes_quantity']); but is it ok to remove it ? thanks for the help guys Quote Link to comment Share on other sites More sharing options...
TomThumb Posted October 14, 2004 Share Posted October 14, 2004 sinryder, yes, it is ok remove all references to 'products_attributes_quantity' Quote while (!succeed) {try()}; GMT -6:00 Link to comment Share on other sites More sharing options...
sinryder Posted October 14, 2004 Share Posted October 14, 2004 hello , i have removed it , Can you guys please test it and see if its working fine. thanks for the help Guys. Quote Link to comment Share on other sites More sharing options...
sinryder Posted October 14, 2004 Share Posted October 14, 2004 Testing Site 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.