Jump to content
Johnson

Master Products - MS2

Recommended Posts

Everything works great now, but I have a question. I want to sort my slave products by price, in ascending order. I edited my catalog/includes/modules/master_listing.php file with the following, but it doesnt work:

 

 $products_options = tep_db_query("select pov.products_options_values_id, pov.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_PRODUCTS_OPTIONS_VALUES . " pov where pa.products_id = '" . (int)$listing['products_id'] . "' and pa.options_id = '" . (int)$products_options_name_values['products_options_id'] . "' and pa.options_values_id = pov.products_options_values_id and pov.language_id = '" . (int)$languages_id . "' ORDER BY pa.options_values_price ASC");

 

Any ideas what may work? Thanks.

Share this post


Link to post
Share on other sites

Luckyno can you please describe what the addons do...my site has MasterProducts working properly for long time and am curious to see what you added to it.

 

These are not my addons, but users' addons from past. The first one adds a popup to open up slave products in the master product page, the other one adds a checkbox instead of an input field for quantity. It is written into the addons names :)


I love oscommerce and OS software! I'm not a programmer, I'm only a learning boy and a translator :) I love full contribution packages!

Share this post


Link to post
Share on other sites

These are not my addons, but users' addons from past. The first one adds a popup to open up slave products in the master product page, the other one adds a checkbox instead of an input field for quantity. It is written into the addons names :)

 

Ok thanks. Would you or anyone else happen to know if there is a way to redirect slaves links to their corresponding masters?

 

Example:

 

Some of my slaves are getting good search engine results, but when a visitor comes to the Slave's page they cannot buy or find a button to buy what they are looking for. It would be great if visitors were redirected to their corresponding Master instead.

 

This is the only issue I have ever had with this module which I have been using in my store for almost 2 years.

 

Any help will be appreciated

 

Thanks in advance!

 

Ricardo

Share this post


Link to post
Share on other sites

Hi all,

 

I have a problem I have been trying to repair and haven't had much luck finding the answers for it. After adding the contribution, a master product appears (the photo is there, you can click on the photo to go to the master page) BUT: the product descriptoin is simply "...", and the "Details" button below the image that should take you to the page has a missing "product_id" code in the link. Can anyone tell me how to get this to work correctly or point me in the right direction? Has anyone had this problem?

 

Best,

 

Matt

Share this post


Link to post
Share on other sites

Ok, I just tried to install this and now I am having some major problems.

 

First problem:

 

When I go to the admin panel (ex. site.com/catalog/admin/index.php), this massive series of code and errors shows up:

 

/* $Id: general.php 1739 2007-12-20 00:52:16Z hpdl $ osCommerce, Open Source E-Commerce Solutions http://www.oscommerce.com Copyright (c) 2007 osCommerce Released under the GNU General Public License */ //// // Redirect to another page or site function tep_redirect($url) { global $logger; if ( (strstr($url, "\n") != false) || (strstr($url, "\r") != false) ) { tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false)); } header('Location: ' . $url); if (STORE_PAGE_PARSE_TIME == 'true') { if (!is_object($logger)) $logger = new logger; $logger->timer_stop(); } 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(' +', ' ', $string); return preg_replace("/[<>]/", '_', $string); } function tep_customers_name($customers_id) { $customers = tep_db_query("select customers_firstname, customers_lastname from " . TABLE_CUSTOMERS . " where customers_id = '" . (int)$customers_id . "'"); $customers_values = tep_db_fetch_array($customers); return $customers_values['customers_firstname'] . ' ' . $customers_values['customers_lastname']; } function tep_get_path($current_category_id = '') { global $cPath_array; if ($current_category_id == '') { $cPath_new = implode('_', $cPath_array); } else { if (sizeof($cPath_array) == 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[(sizeof($cPath_array)-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, $n = sizeof($cPath_array) - 1; $i < $n; $i++) { $cPath_new .= '_' . $cPath_array[$i]; } } else { for ($i = 0, $n = sizeof($cPath_array); $i < $n; $i++) { $cPath_new .= '_' . $cPath_array[$i]; } } $cPath_new .= '_' . $current_category_id; if (substr($cPath_new, 0, 1) == '_') { $cPath_new = substr($cPath_new, 1); } } } return 'cPath=' . $cPath_new; } function tep_get_all_get_params($exclude_array = '') { global $HTTP_GET_VARS; if ($exclude_array == '') $exclude_array = array(); $get_url = ''; reset($HTTP_GET_VARS); while (list($key, $value) = each($HTTP_GET_VARS)) { if (($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array))) $get_url .= $key . '=' . $value . '&'; } return $get_url; } 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') || ($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))); } } function tep_datetime_short($raw_datetime) { if ( ($raw_datetime == '0000-00-00 00:00:00') || ($raw_datetime == '') ) return false; $year = (int)substr($raw_datetime, 0, 4); $month = (int)substr($raw_datetime, 5, 2); $day = (int)substr($raw_datetime, 8, 2); $hour = (int)substr($raw_datetime, 11, 2); $minute = (int)substr($raw_datetime, 14, 2); $second = (int)substr($raw_datetime, 17, 2); return strftime(DATE_TIME_FORMAT, mktime($hour, $minute, $second, $month, $day, $year)); } function tep_get_category_tree($parent_id = '0', $spacing = '', $exclude = '', $category_tree_array = '', $include_itself = false) { global $languages_id; if (!is_array($category_tree_array)) $category_tree_array = array(); if ( (sizeof($category_tree_array) < 1) && ($exclude != '0') ) $category_tree_array[] = array('id' => '0', 'text' => TEXT_TOP); if ($include_itself) { $category_query = tep_db_query("select cd.categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " cd where cd.language_id = '" . (int)$languages_id . "' and cd.categories_id = '" . (int)$parent_id . "'"); $category = tep_db_fetch_array($category_query); $category_tree_array[] = array('id' => $parent_id, 'text' => $category['categories_name']); } $categories_query = tep_db_query("select c.categories_id, cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "' and c.parent_id = '" . (int)$parent_id . "' order by c.sort_order, cd.categories_name"); while ($categories = tep_db_fetch_array($categories_query)) { if ($exclude != $categories['categories_id']) $category_tree_array[] = array('id' => $categories['categories_id'], 'text' => $spacing . $categories['categories_name']); $category_tree_array = tep_get_category_tree($categories['categories_id'], $spacing . '   ', $exclude, $category_tree_array); } return $category_tree_array; } function tep_draw_products_pull_down($name, $parameters = '', $exclude = '') { global $currencies, $languages_id; if ($exclude == '') { $exclude = array(); } $select_string = ''; return $select_string; } function tep_options_name($options_id) { global $languages_id; $options = tep_db_query("select products_options_name from " . TABLE_PRODUCTS_OPTIONS . " where products_options_id = '" . (int)$options_id . "' and language_id = '" . (int)$languages_id . "'"); $options_values = tep_db_fetch_array($options); return $options_values['products_options_name']; } function tep_values_name($values_id) { global $languages_id; $values = tep_db_query("select products_options_values_name from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$values_id . "' and language_id = '" . (int)$languages_id . "'"); $values_values = tep_db_fetch_array($values); return $values_values['products_options_values_name']; } function tep_info_image($image, $alt, $width = '', $height = '') { if (tep_not_null($image) && (file_exists(DIR_FS_CATALOG_IMAGES . $image)) ) { $image = tep_image(DIR_WS_CATALOG_IMAGES . $image, $alt, $width, $height); } else { $image = TEXT_IMAGE_NONEXISTENT; } return $image; } 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; } function tep_get_country_name($country_id) { $country_query = tep_db_query("select countries_name from " . TABLE_COUNTRIES . " where countries_id = '" . (int)$country_id . "'"); if (!tep_db_num_rows($country_query)) { return $country_id; } else { $country = tep_db_fetch_array($country_query); return $country['countries_name']; } } 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; } } function tep_not_null($value) { if (is_array($value)) { if (sizeof($value) > 0) { return true; } else { return false; } } else { if ( (is_string($value) || is_int($value)) && ($value != '') && ($value != 'NULL') && (strlen(trim($value)) > 0)) { return true; } else { return false; } } } function tep_browser_detect($component) { global $HTTP_USER_AGENT; return stristr($HTTP_USER_AGENT, $component); } function tep_tax_classes_pull_down($parameters, $selected = '') { $select_string = ''; return $select_string; } function tep_geo_zones_pull_down($parameters, $selected = '') { $select_string = ''; return $select_string; } function tep_get_geo_zone_name($geo_zone_id) { $zones_query = tep_db_query("select geo_zone_name from " . TABLE_GEO_ZONES . " where geo_zone_id = '" . (int)$geo_zone_id . "'"); if (!tep_db_num_rows($zones_query)) { $geo_zone_name = $geo_zone_id; } else { $zones = tep_db_fetch_array($zones_query); $geo_zone_name = $zones['geo_zone_name']; } return $geo_zone_name; } 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 = ''; if ( ($boln == '') && ($eoln == "\n") ) { // Values not specified, use rational defaults $CR = '
'; $cr = '
'; $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; } //////////////////////////////////////////////////////////////////////////////////////////////// // // Function : tep_get_zone_code // // Arguments : country country code string // zone state/province zone_id // def_state default string if zone==0 // // Return : state_prov_code state/province code // // Description : Function to retrieve the state/province code (as in FL for Florida etc) // //////////////////////////////////////////////////////////////////////////////////////////////// function tep_get_zone_code($country, $zone, $def_state) { $state_prov_query = tep_db_query("select zone_code from " . TABLE_ZONES . " where zone_country_id = '" . (int)$country . "' and zone_id = '" . (int)$zone . "'"); if (!tep_db_num_rows($state_prov_query)) { $state_prov_code = $def_state; } else { $state_prov_values = tep_db_fetch_array($state_prov_query); $state_prov_code = $state_prov_values['zone_code']; } return $state_prov_code; } 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; } function tep_get_prid($uprid) { $pieces = explode('{', $uprid); return $pieces[0]; } function tep_get_languages() { $languages_query = tep_db_query("select languages_id, name, code, image, directory from " . TABLE_LANGUAGES . " order by sort_order"); while ($languages = tep_db_fetch_array($languages_query)) { $languages_array[] = array('id' => $languages['languages_id'], 'name' => $languages['name'], 'code' => $languages['code'], 'image' => $languages['image'], 'directory' => $languages['directory']); } return $languages_array; } function tep_get_category_name($category_id, $language_id) { $category_query = tep_db_query("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$category_id . "' and language_id = '" . (int)$language_id . "'"); $category = tep_db_fetch_array($category_query); return $category['categories_name']; } function tep_get_orders_status_name($orders_status_id, $language_id = '') { global $languages_id; if (!$language_id) $language_id = $languages_id; $orders_status_query = tep_db_query("select orders_status_name from " . TABLE_ORDERS_STATUS . " where orders_status_id = '" . (int)$orders_status_id . "' and language_id = '" . (int)$language_id . "'"); $orders_status = tep_db_fetch_array($orders_status_query); return $orders_status['orders_status_name']; } function tep_get_orders_status() { global $languages_id; $orders_status_array = array(); $orders_status_query = tep_db_query("select orders_status_id, orders_status_name from " . TABLE_ORDERS_STATUS . " where language_id = '" . (int)$languages_id . "' order by orders_status_id"); while ($orders_status = tep_db_fetch_array($orders_status_query)) { $orders_status_array[] = array('id' => $orders_status['orders_status_id'], 'text' => $orders_status['orders_status_name']); } return $orders_status_array; } function tep_get_products_name($product_id, $language_id = 0) { global $languages_id; if ($language_id == 0) $language_id = $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_id . "'"); $product = tep_db_fetch_array($product_query); return $product['products_name']; } // Master Products function tep_get_products_master_status($product_id) { $product_query = tep_db_query("select products_master_status from " . TABLE_PRODUCTS . " where products_id = '" . (int)$product_id . "'"); $product = tep_db_fetch_array($product_query); return $product['products_master_status']; } // Master Products EOF function tep_get_products_description($product_id, $language_id) { $product_query = tep_db_query("select products_description from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$product_id . "' and language_id = '" . (int)$language_id . "'"); $product = tep_db_fetch_array($product_query); return $product['products_description']; } function tep_get_products_url($product_id, $language_id) { $product_query = tep_db_query("select products_url from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$product_id . "' and language_id = '" . (int)$language_id . "'"); $product = tep_db_fetch_array($product_query); return $product['products_url']; } //// // Return the manufacturers URL in the needed language // TABLES: manufacturers_info function tep_get_manufacturer_url($manufacturer_id, $language_id) { $manufacturer_query = tep_db_query("select manufacturers_url from " . TABLE_MANUFACTURERS_INFO . " where manufacturers_id = '" . (int)$manufacturer_id . "' and languages_id = '" . (int)$language_id . "'"); $manufacturer = tep_db_fetch_array($manufacturer_query); return $manufacturer['manufacturers_url']; } //// // Wrapper for class_exists() function // This function is not available in all PHP versions so we test it before using it. function tep_class_exists($class_name) { if (function_exists('class_exists')) { return class_exists($class_name); } else { return true; } } //// // Count how many products exist in a category // TABLES: products, products_to_categories, categories function tep_products_in_category_count($categories_id, $include_deactivated = false) { $products_count = 0; if ($include_deactivated) { $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)$categories_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)$categories_id . "'"); } $products = tep_db_fetch_array($products_query); $products_count += $products['total']; $childs_query = tep_db_query("select categories_id from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$categories_id . "'"); if (tep_db_num_rows($childs_query)) { while ($childs = tep_db_fetch_array($childs_query)) { $products_count += tep_products_in_category_count($childs['categories_id'], $include_deactivated); } } return $products_count; } //// // Count how many subcategories exist in a category // TABLES: categories function tep_childs_in_category_count($categories_id) { $categories_count = 0; $categories_query = tep_db_query("select categories_id from " . TABLE_CATEGORIES . " where parent_id = '" . (int)$categories_id . "'"); while ($categories = tep_db_fetch_array($categories_query)) { $categories_count++; $categories_count += tep_childs_in_category_count($categories['categories_id']); } return $categories_count; } //// // Returns an array with countries // TABLES: countries function tep_get_countries($default = '') { $countries_array = array(); if ($default) { $countries_array[] = array('id' => '', 'text' => $default); } //-MS- Added active countries $countries_query = tep_db_query("select countries_id, countries_name from " . TABLE_COUNTRIES . " where countries_status='1' order by countries_name"); //-MS- Added active countries EOM while ($countries = tep_db_fetch_array($countries_query)) { $countries_array[] = array('id' => $countries['countries_id'], 'text' => $countries['countries_name']); } return $countries_array; } //// // return an array with country zones function tep_get_country_zones($country_id) { $zones_array = array(); //-MS- Added Active-Zones support $zones_query = tep_db_query("select zone_id, zone_name from " . TABLE_ZONES . " where zone_status='1' and zone_country_id = '" . (int)$country_id . "' order by zone_name"); //-MS- Added Active-Zones support EOM while ($zones = tep_db_fetch_array($zones_query)) { $zones_array[] = array('id' => $zones['zone_id'], 'text' => $zones['zone_name']); } return $zones_array; } function tep_prepare_country_zones_pull_down($country_id = '') { // preset the width of the drop-down for Netscape $pre = ''; if ( (!tep_browser_detect('MSIE')) && (tep_browser_detect('Mozilla/4')) ) { for ($i=0; $i<45; $i++) $pre .= ' '; } $zones = tep_get_country_zones($country_id); if (sizeof($zones) > 0) { $zones_select = array(array('id' => '', 'text' => PLEASE_SELECT)); $zones = array_merge($zones_select, $zones); } else { $zones = array(array('id' => '', 'text' => TYPE_BELOW)); // create dummy options for Netscape to preset the height of the drop-down if ( (!tep_browser_detect('MSIE')) && (tep_browser_detect('Mozilla/4')) ) { for ($i=0; $i<9; $i++) { $zones[] = array('id' => '', 'text' => $pre); } } } return $zones; } //// // Get list of address_format_id's function tep_get_address_formats() { $address_format_query = tep_db_query("select address_format_id from " . TABLE_ADDRESS_FORMAT . " order by address_format_id"); $address_format_array = array(); while ($address_format_values = tep_db_fetch_array($address_format_query)) { $address_format_array[] = array('id' => $address_format_values['address_format_id'], 'text' => $address_format_values['address_format_id']); } return $address_format_array; } //// // Alias function for Store configuration values in the Administration Tool function tep_cfg_pull_down_country_list($country_id) { return tep_draw_pull_down_menu('configuration_value', tep_get_countries(), $country_id); } function tep_cfg_pull_down_zone_list($zone_id) { return tep_draw_pull_down_menu('configuration_value', tep_get_country_zones(STORE_COUNTRY), $zone_id); } function tep_cfg_pull_down_tax_classes($tax_class_id, $key = '') { $name = (($key) ? 'configuration[' . $key . ']' : 'configuration_value'); $tax_class_array = array(array('id' => '0', 'text' => TEXT_NONE)); $tax_class_query = tep_db_query("select tax_class_id, tax_class_title from " . TABLE_TAX_CLASS . " order by tax_class_title"); while ($tax_class = tep_db_fetch_array($tax_class_query)) { $tax_class_array[] = array('id' => $tax_class['tax_class_id'], 'text' => $tax_class['tax_class_title']); } return tep_draw_pull_down_menu($name, $tax_class_array, $tax_class_id); } //// // Function to read in text area in admin function tep_cfg_textarea($text) { return tep_draw_textarea_field('configuration_value', false, 35, 5, $text); } function tep_cfg_get_zone_name($zone_id) { $zone_query = tep_db_query("select zone_name from " . TABLE_ZONES . " where zone_id = '" . (int)$zone_id . "'"); if (!tep_db_num_rows($zone_query)) { return $zone_id; } else { $zone = tep_db_fetch_array($zone_query); return $zone['zone_name']; } } //// // Sets the status of a banner function tep_set_banner_status($banners_id, $status) { if ($status == '1') { return tep_db_query("update " . TABLE_BANNERS . " set status = '1', expires_impressions = NULL, expires_date = NULL, date_status_change = NULL where banners_id = '" . $banners_id . "'"); } elseif ($status == '0') { return tep_db_query("update " . TABLE_BANNERS . " set status = '0', date_status_change = now() where banners_id = '" . $banners_id . "'"); } else { return -1; } } //// // Sets the status of a product function tep_set_product_status($products_id, $status) { if ($status == '1') { return tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '1', products_last_modified = now() where products_id = '" . (int)$products_id . "'"); } elseif ($status == '0') { return tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0', products_last_modified = now() where products_id = '" . (int)$products_id . "'"); } else { return -1; } } //// // Sets the status of a category function tep_set_categories_status($categ_id, $status) { if ($status == '1') { return tep_db_query("update " . TABLE_CATEGORIES . " set status_categ = '1', last_modified = now() where categories_id = '" . (int)$categ_id . "'"); } elseif ($status == '0') { return tep_db_query("update " . TABLE_CATEGORIES . " set status_categ = '0', last_modified = now() where categories_id = '" . (int)$categ_id . "'"); } else { return -1; } } //// // Sets the status of a product on special function tep_set_specials_status($specials_id, $status) { if ($status == '1') { return tep_db_query("update " . TABLE_SPECIALS . " set status = '1', expires_date = NULL, date_status_change = NULL where specials_id = '" . (int)$specials_id . "'"); } elseif ($status == '0') { return tep_db_query("update " . TABLE_SPECIALS . " set status = '0', date_status_change = now() where specials_id = '" . (int)$specials_id . "'"); } else { return -1; } } //// // Sets timeout for the current script. // Cant be used in safe mode. function tep_set_time_limit($limit) { if (!get_cfg_var('safe_mode')) { set_time_limit($limit); } } //// // Alias function for Store configuration values in the Administration Tool function tep_cfg_select_option($select_array, $key_value, $key = '') { $string = ''; for ($i=0, $n=sizeof($select_array); $i<$n; $i++) { $name = ((tep_not_null($key)) ? 'configuration[' . $key . ']' : 'configuration_value'); $string .= '
tep_datetime_short(date('Y-m-d H:i:s')), 'system' => $system, 'kernel' => $kernel, 'host' => $host, 'ip' => gethostbyname($host), 'uptime' => @exec('uptime'), 'http_server' => $HTTP_SERVER_VARS['SERVER_SOFTWARE'], 'php' => PHP_VERSION, 'zend' => (function_exists('zend_version') ? zend_version() : ''), 'db_server' => DB_SERVER, 'db_ip' => gethostbyname(DB_SERVER), 'db_version' => 'MySQL ' . (function_exists('mysql_get_server_info') ? mysql_get_server_info() : ''), 'db_date' => tep_datetime_short($db['datetime'])); } function tep_generate_category_path($id, $from = 'category', $categories_array = '', $index = 0) { global $languages_id; if (!is_array($categories_array)) $categories_array = array(); if ($from == 'product') { $categories_query = tep_db_query("select categories_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " where products_id = '" . (int)$id . "'"); while ($categories = tep_db_fetch_array($categories_query)) { if ($categories['categories_id'] == '0') { $categories_array[$index][] = array('id' => '0', 'text' => TEXT_TOP); } else { $category_query = tep_db_query("select cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . (int)$categories['categories_id'] . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "'"); $category = tep_db_fetch_array($category_query); $categories_array[$index][] = array('id' => $categories['categories_id'], 'text' => $category['categories_name']); if ( (tep_not_null($category['parent_id'])) && ($category['parent_id'] != '0') ) $categories_array = tep_generate_category_path($category['parent_id'], 'category', $categories_array, $index); $categories_array[$index] = array_reverse($categories_array[$index]); } $index++; } } elseif ($from == 'category') { $category_query = tep_db_query("select cd.categories_name, c.parent_id from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . (int)$id . "' and c.categories_id = cd.categories_id and cd.language_id = '" . (int)$languages_id . "'"); $category = tep_db_fetch_array($category_query); $categories_array[$index][] = array('id' => $id, 'text' => $category['categories_name']); if ( (tep_not_null($category['parent_id'])) && ($category['parent_id'] != '0') ) $categories_array = tep_generate_category_path($category['parent_id'], 'category', $categories_array, $index); } return $categories_array; } function tep_output_generated_category_path($id, $from = 'category') { $calculated_category_path_string = ''; $calculated_category_path = tep_generate_category_path($id, $from); for ($i=0, $n=sizeof($calculated_category_path); $i<$n; $i++) { for ($j=0, $k=sizeof($calculated_category_path[$i]); $j<$k; $j++) { $calculated_category_path_string .= $calculated_category_path[$i][$j]['text'] . ' > '; } $calculated_category_path_string = substr($calculated_category_path_string, 0, -16) . '
'; } $calculated_category_path_string = substr($calculated_category_path_string, 0, -4); if (strlen($calculated_category_path_string) < 1) $calculated_category_path_string = TEXT_TOP; return $calculated_category_path_string; } function tep_get_generated_category_path_ids($id, $from = 'category') { $calculated_category_path_string = ''; $calculated_category_path = tep_generate_category_path($id, $from); for ($i=0, $n=sizeof($calculated_category_path); $i<$n; $i++) { for ($j=0, $k=sizeof($calculated_category_path[$i]); $j<$k; $j++) { $calculated_category_path_string .= $calculated_category_path[$i][$j]['id'] . '_'; } $calculated_category_path_string = substr($calculated_category_path_string, 0, -1) . '
'; } $calculated_category_path_string = substr($calculated_category_path_string, 0, -4); if (strlen($calculated_category_path_string) < 1) $calculated_category_path_string = TEXT_TOP; return $calculated_category_path_string; } function tep_remove_category($category_id) { $category_image_query = tep_db_query("select categories_image from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$category_id . "'"); $category_image = tep_db_fetch_array($category_image_query); $duplicate_image_query = tep_db_query("select count(*) as total from " . TABLE_CATEGORIES . " where categories_image = '" . tep_db_input($category_image['categories_image']) . "'"); $duplicate_image = tep_db_fetch_array($duplicate_image_query); if ($duplicate_image['total'] < 2) { if (file_exists(DIR_FS_CATALOG_IMAGES . $category_image['categories_image'])) { @unlink(DIR_FS_CATALOG_IMAGES . $category_image['categories_image']); } } tep_db_query("delete from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$category_id . "'"); tep_db_query("delete from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$category_id . "'"); tep_db_query("delete from " . TABLE_PRODUCTS_TO_CATEGORIES . " where categories_id = '" . (int)$category_id . "'"); if (USE_CACHE == 'true') { tep_reset_cache_block('categories'); tep_reset_cache_block('also_purchased'); } } function tep_remove_product($product_id) { $product_image_query = tep_db_query("select products_image from " . TABLE_PRODUCTS . " where products_id = '" . (int)$product_id . "'"); $product_image = tep_db_fetch_array($product_image_query); $duplicate_image_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS . " where products_image = '" . tep_db_input($product_image['products_image']) . "'"); $duplicate_image = tep_db_fetch_array($duplicate_image_query); if ($duplicate_image['total'] < 2) { if (file_exists(DIR_FS_CATALOG_IMAGES . $product_image['products_image'])) { @unlink(DIR_FS_CATALOG_IMAGES . $product_image['products_image']); } } tep_db_query("delete from " . TABLE_SPECIALS . " where products_id = '" . (int)$product_id . "'"); tep_db_query("delete from " . TABLE_PRODUCTS . " where products_id = '" . (int)$product_id . "'"); tep_db_query("delete from " . TABLE_PRODUCTS_TO_CATEGORIES . " where products_id = '" . (int)$product_id . "'"); tep_db_query("delete from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id = '" . (int)$product_id . "'"); tep_db_query("delete from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id = '" . (int)$product_id . "'"); tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET . " where products_id = '" . (int)$product_id . "' or products_id like '" . (int)$product_id . "{%'"); tep_db_query("delete from " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " where products_id = '" . (int)$product_id . "' or products_id like '" . (int)$product_id . "{%'"); $product_reviews_query = tep_db_query("select reviews_id from " . TABLE_REVIEWS . " where products_id = '" . (int)$product_id . "'"); while ($product_reviews = tep_db_fetch_array($product_reviews_query)) { tep_db_query("delete from " . TABLE_REVIEWS_DESCRIPTION . " where reviews_id = '" . (int)$product_reviews['reviews_id'] . "'"); } tep_db_query("delete from " . TABLE_REVIEWS . " where products_id = '" . (int)$product_id . "'"); if (USE_CACHE == 'true') { tep_reset_cache_block('categories'); tep_reset_cache_block('also_purchased'); } } function tep_remove_order($order_id, $restock = false) { if ($restock == 'on') { $order_query = tep_db_query("select products_id, products_quantity from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'"); while ($order = tep_db_fetch_array($order_query)) { tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = products_quantity + " . $order['products_quantity'] . ", products_ordered = products_ordered - " . $order['products_quantity'] . " where products_id = '" . (int)$order['products_id'] . "'"); } } tep_db_query("delete from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'"); tep_db_query("delete from " . TABLE_ORDERS_PRODUCTS . " where orders_id = '" . (int)$order_id . "'"); tep_db_query("delete from " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . " where orders_id = '" . (int)$order_id . "'"); tep_db_query("delete from " . TABLE_ORDERS_STATUS_HISTORY . " where orders_id = '" . (int)$order_id . "'"); tep_db_query("delete from " . TABLE_ORDERS_TOTAL . " where orders_id = '" . (int)$order_id . "'"); } function tep_reset_cache_block($cache_block) { global $cache_blocks; for ($i=0, $n=sizeof($cache_blocks); $i<$n; $i++) { if ($cache_blocks[$i]['code'] == $cache_block) { if ($cache_blocks[$i]['multiple']) { if ($dir = @opendir(DIR_FS_CACHE)) { while ($cache_file = readdir($dir)) { $cached_file = $cache_blocks[$i]['file']; $languages = tep_get_languages(); for ($j=0, $k=sizeof($languages); $j<$k; $j++) { $cached_file_unlink = ereg_replace('-language', '-' . $languages[$j]['directory'], $cached_file); if (ereg('^' . $cached_file_unlink, $cache_file)) { @unlink(DIR_FS_CACHE . $cache_file); } } } closedir($dir); } } else { $cached_file = $cache_blocks[$i]['file']; $languages = tep_get_languages(); for ($i=0, $n=sizeof($languages); $i<$n; $i++) { $cached_file = ereg_replace('-language', '-' . $languages[$i]['directory'], $cached_file); @unlink(DIR_FS_CACHE . $cached_file); } } break; } } } function tep_get_file_permissions($mode) { // determine type if ( ($mode & 0xC000) == 0xC000) { // unix domain socket $type = 's'; } elseif ( ($mode & 0x4000) == 0x4000) { // directory $type = 'd'; } elseif ( ($mode & 0xA000) == 0xA000) { // symbolic link $type = 'l'; } elseif ( ($mode & 0x8000) == 0x8000) { // regular file $type = '-'; } elseif ( ($mode & 0x6000) == 0x6000) { //bBlock special file $type = 'b'; } elseif ( ($mode & 0x2000) == 0x2000) { // character special file $type = 'c'; } elseif ( ($mode & 0x1000) == 0x1000) { // named pipe $type = 'p'; } else { // unknown $type = '?'; } // determine permissions $owner['read'] = ($mode & 00400) ? 'r' : '-'; $owner['write'] = ($mode & 00200) ? 'w' : '-'; $owner['execute'] = ($mode & 00100) ? 'x' : '-'; $group['read'] = ($mode & 00040) ? 'r' : '-'; $group['write'] = ($mode & 00020) ? 'w' : '-'; $group['execute'] = ($mode & 00010) ? 'x' : '-'; $world['read'] = ($mode & 00004) ? 'r' : '-'; $world['write'] = ($mode & 00002) ? 'w' : '-'; $world['execute'] = ($mode & 00001) ? 'x' : '-'; // adjust for SUID, SGID and sticky bit if ($mode & 0x800 ) $owner['execute'] = ($owner['execute'] == 'x') ? 's' : 'S'; if ($mode & 0x400 ) $group['execute'] = ($group['execute'] == 'x') ? 's' : 'S'; if ($mode & 0x200 ) $world['execute'] = ($world['execute'] == 'x') ? 't' : 'T'; return $type . $owner['read'] . $owner['write'] . $owner['execute'] . $group['read'] . $group['write'] . $group['execute'] . $world['read'] . $world['write'] . $world['execute']; } function tep_remove($source) { global $messageStack, $tep_remove_error; if (isset($tep_remove_error)) $tep_remove_error = false; if (is_dir($source)) { $dir = dir($source); while ($file = $dir->read()) { if ( ($file != '.') && ($file != '..') ) { if (is_writeable($source . '/' . $file)) { tep_remove($source . '/' . $file); } else { $messageStack->add(sprintf(ERROR_FILE_NOT_REMOVEABLE, $source . '/' . $file), 'error'); $tep_remove_error = true; } } } $dir->close(); if (is_writeable($source)) { rmdir($source); } else { $messageStack->add(sprintf(ERROR_DIRECTORY_NOT_REMOVEABLE, $source), 'error'); $tep_remove_error = true; } } else { if (is_writeable($source)) { unlink($source); } else { $messageStack->add(sprintf(ERROR_FILE_NOT_REMOVEABLE, $source), 'error'); $tep_remove_error = true; } } } //// // Output the tax percentage with optional padded decimals function tep_display_tax_value($value, $padding = TAX_DECIMAL_PLACES) { if (strpos($value, '.')) { $loop = true; while ($loop) { if (substr($value, -1) == '0') { $value = substr($value, 0, -1); } else { $loop = false; if (substr($value, -1) == '.') { $value = substr($value, 0, -1); } } } } if ($padding > 0) { if ($decimal_pos = strpos($value, '.')) { $decimals = strlen(substr($value, ($decimal_pos+1))); for ($i=$decimals; $i<$padding; $i++) { $value .= '0'; } } else { $value .= '.'; for ($i=0; $i<$padding; $i++) { $value .= '0'; } } } return $value; } function tep_mail($to_name, $to_email_address, $email_subject, $email_text, $from_email_name, $from_email_address) { if (SEND_EMAILS != 'true') return false; // Instantiate a new mail object $message = new email(array('X-Mailer: osCommerce')); // Build the text version $text = strip_tags($email_text); if (EMAIL_USE_HTML == 'true') { $message->add_html($email_text, $text); } else { $message->add_text($text); } // Send message $message->build_message(); $message->send($to_name, $to_email_address, $from_email_name, $from_email_address, $email_subject); } function tep_get_tax_class_title($tax_class_id) { if ($tax_class_id == '0') { return TEXT_NONE; } else { $classes_query = tep_db_query("select tax_class_title from " . TABLE_TAX_CLASS . " where tax_class_id = '" . (int)$tax_class_id . "'"); $classes = tep_db_fetch_array($classes_query); return $classes['tax_class_title']; } } function tep_banner_image_extension() { if (function_exists('imagetypes')) { if (imagetypes() & IMG_PNG) { return 'png'; } elseif (imagetypes() & IMG_JPG) { return 'jpg'; } elseif (imagetypes() & IMG_GIF) { return 'gif'; } } elseif (function_exists('imagecreatefrompng') && function_exists('imagepng')) { return 'png'; } elseif (function_exists('imagecreatefromjpeg') && function_exists('imagejpeg')) { return 'jpg'; } elseif (function_exists('imagecreatefromgif') && function_exists('imagegif')) { return 'gif'; } return false; } //// // Wrapper function for round() for php3 compatibility function tep_round($value, $precision) { if (PHP_VERSION < 4) { $exp = pow(10, $precision); return round($value * $exp) / $exp; } else { return round($value, $precision); } } //// // Add tax to a products price function tep_add_tax($price, $tax, $override = false) { if ( ( (DISPLAY_PRICE_WITH_TAX == 'true') || ($override == true) ) && ($tax > 0) ) { return $price + tep_calculate_tax($price, $tax); } else { return $price; } } // Calculates Tax rounding the result function tep_calculate_tax($price, $tax) { return $price * $tax / 100; } //// // 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 = 0; while ($tax = tep_db_fetch_array($tax_query)) { $tax_multiplier += $tax['tax_rate']; } return $tax_multiplier; } else { return 0; } } //// // Returns the tax rate for a tax class // TABLES: tax_rates function tep_get_tax_rate_value($class_id) { $tax_query = tep_db_query("select SUM(tax_rate) as tax_rate from " . TABLE_TAX_RATES . " where tax_class_id = '" . (int)$class_id . "' group by tax_priority"); if (tep_db_num_rows($tax_query)) { $tax_multiplier = 0; while ($tax = tep_db_fetch_array($tax_query)) { $tax_multiplier += $tax['tax_rate']; } return $tax_multiplier; } else { return 0; } } function tep_call_function($function, $parameter, $object = '') { if ($object == '') { return call_user_func($function, $parameter); } elseif (PHP_VERSION < 4) { return call_user_method($function, $object, $parameter); } else { return call_user_func(array($object, $function), $parameter); } } function tep_get_zone_class_title($zone_class_id) { if ($zone_class_id == '0') { return TEXT_NONE; } else { $classes_query = tep_db_query("select geo_zone_name from " . TABLE_GEO_ZONES . " where geo_zone_id = '" . (int)$zone_class_id . "'"); $classes = tep_db_fetch_array($classes_query); return $classes['geo_zone_name']; } } function tep_cfg_pull_down_zone_classes($zone_class_id, $key = '') { $name = (($key) ? 'configuration[' . $key . ']' : 'configuration_value'); $zone_class_array = array(array('id' => '0', 'text' => TEXT_NONE)); $zone_class_query = tep_db_query("select geo_zone_id, geo_zone_name from " . TABLE_GEO_ZONES . " order by geo_zone_name"); while ($zone_class = tep_db_fetch_array($zone_class_query)) { $zone_class_array[] = array('id' => $zone_class['geo_zone_id'], 'text' => $zone_class['geo_zone_name']); } return tep_draw_pull_down_menu($name, $zone_class_array, $zone_class_id); } function tep_cfg_pull_down_order_statuses($order_status_id, $key = '') { global $languages_id; $name = (($key) ? 'configuration[' . $key . ']' : 'configuration_value'); $statuses_array = array(array('id' => '0', 'text' => TEXT_DEFAULT)); $statuses_query = tep_db_query("select orders_status_id, orders_status_name from " . TABLE_ORDERS_STATUS . " where language_id = '" . (int)$languages_id . "' order by orders_status_name"); while ($statuses = tep_db_fetch_array($statuses_query)) { $statuses_array[] = array('id' => $statuses['orders_status_id'], 'text' => $statuses['orders_status_name']); } return tep_draw_pull_down_menu($name, $statuses_array, $order_status_id); } function tep_get_order_status_name($order_status_id, $language_id = '') { global $languages_id; if ($order_status_id < 1) return TEXT_DEFAULT; if (!is_numeric($language_id)) $language_id = $languages_id; $status_query = tep_db_query("select orders_status_name from " . TABLE_ORDERS_STATUS . " where orders_status_id = '" . (int)$order_status_id . "' and language_id = '" . (int)$language_id . "'"); $status = tep_db_fetch_array($status_query); return $status['orders_status_name']; } //// // Return a random value function tep_rand($min = null, $max = null) { static $seeded; if (!$seeded) { mt_srand((double)microtime()*1000000); $seeded = true; } if (isset($min) && isset($max)) { if ($min >= $max) { return $min; } else { return mt_rand($min, $max); } } else { return mt_rand(); } } // nl2br() prior PHP 4.2.0 did not convert linefeeds on all OSs (it only converted \n) function tep_convert_linefeeds($from, $to, $string) { if ((PHP_VERSION < "4.0.5") && is_array($from)) { return ereg_replace('(' . implode('|', $from) . ')', $to, $string); } else { return str_replace($from, $to, $string); } } function tep_string_to_int($string) { return (int)$string; } //// // Parse and secure the cPath parameter values function tep_parse_category_path($cPath) { // make sure the category IDs are integers $cPath_array = array_map('tep_string_to_int', explode('_', $cPath)); // make sure no duplicate category IDs exist which could lock the server in a loop $tmp_array = array(); $n = sizeof($cPath_array); for ($i=0; $i<$n; $i++) { if (!in_array($cPath_array[$i], $tmp_array)) { $tmp_array[] = $cPath_array[$i]; } } return $tmp_array; } //// bof sort order & quantity change //// // Sets the sort order of a product function tep_set_product_sort_order($products_id, $sort_order) { return tep_db_query("update " . TABLE_PRODUCTS . " set products_sort_order = '" . $sort_order . "', products_last_modified = now() where products_id = '" . (int)$products_id . "'"); } // Function Category Sort Order function tep_set_cat_sort_order($categories_id, $sort_order) { return tep_db_query("update " . TABLE_CATEGORIES . " set sort_order = '" . $sort_order . "', last_modified = now() where categories_id = '" . (int)$categories_id . "'"); } // Function Quantity Update function tep_set_qty_update($products_id, $sort_order) { return tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $sort_order . "', products_last_modified = now() where products_id = '" . (int)$products_id . "'"); } //// eof sort order & quantity change //// //-MS- Added active countries //// // Sets the status of a country function tep_set_country_status($countries_id, $status) { if ($status == '1') { return tep_db_query("update " . TABLE_COUNTRIES . " set countries_status = '1' where countries_id = '" . (int)$countries_id . "'"); } elseif ($status == '0') { return tep_db_query("update " . TABLE_COUNTRIES . " set countries_status = '0' where countries_id = '" . (int)$countries_id . "'"); } else { return -1; } } //// // Sets the status of a state function tep_set_zone_status($zone_id, $status) { if ($status == '1') { return tep_db_query("update " . TABLE_ZONES . " set zone_status = '1' where zone_id = '" . (int)$zone_id . "'"); } elseif ($status == '0') { return tep_db_query("update " . TABLE_ZONES . " set zone_status = '0' where zone_id = '" . (int)$zone_id . "'"); } else { return -1; } } //// // Sets the pay status of a country function tep_set_country_pay_status($countries_id, $status) { if ($status == '1') { return tep_db_query("update " . TABLE_COUNTRIES . " set countries_pay_status = '1' where countries_id = '" . (int)$countries_id . "'"); } elseif ($status == '0') { return tep_db_query("update " . TABLE_COUNTRIES . " set countries_pay_status = '0' where countries_id = '" . (int)$countries_id . "'"); } else { return -1; } } //// // Sets the status of a country function tep_set_country_ship_status($countries_id, $status) { if ($status == '1') { return tep_db_query("update " . TABLE_COUNTRIES . " set countries_ship_status = '1' where countries_id = '" . (int)$countries_id . "'"); } elseif ($status == '0') { return tep_db_query("update " . TABLE_COUNTRIES . " set countries_ship_status = '0' where countries_id = '" . (int)$countries_id . "'"); } else { return -1; } } //// // Returns an array of active countries function tep_get_active_countries($countries_array = '') { if (!is_array($countries_array)) $countries_array = array(); //PHP 4.x Bug, not init as local var automatically with a global present? $countries_query = ''; $countries_query = tep_db_query("select countries_id, countries_name from " . TABLE_COUNTRIES . " where countries_status = '1' order by countries_name"); while( $countries = tep_db_fetch_array($countries_query) ) { $countries_array[] = array('id' => $countries['countries_id'], 'text' => $countries['countries_name']); } return $countries_array; } //-MS- Added active countries EOM ////// Function For Product Attributes (Shipping Wieght Work is Also Included) function getProductAttributesVaules($str) { $str1 = explode('_',$str); $option_id = $str1[1]; $option_value_id= $str1[0]; if(isset($_REQUEST['pID']) && $_REQUEST['action']=='new_product') { //print_r($_REQUEST);exit; $pid = $_REQUEST['pID']; $query = tep_db_query('select * from '.TABLE_PRODUCTS_ATTRIBUTES.' where options_id='.(int)$option_id.' and options_values_id='.(int)$option_value_id.' and products_id='.(int)$pid); $result = tep_db_fetch_array($query); //print_r($result); $att = array( 'options_id' => $result['options_id'], 'options_values_id' => $result['options_values_id'], 'options_values_price' => $result['options_values_price'], 'price_prefix' => $result['price_prefix'], 'attribute_weight' =>$result['attribute_weight'] ///// Optional ) ; // print_r($att); return $att; } elseif (isset($_REQUEST['pID']) && $_REQUEST['action']=='update_product') { $textbox = 'txt_'.$str; $select = 'select_'.$str; $weight = 'weight_'.$str; /// Optional $att = array ( 'options_id' => $option_id, 'options_values_id' => $option_value_id, 'options_values_price' => $_REQUEST[$textbox], 'price_prefix' => $_REQUEST[$select] , 'attribute_weight' => $_REQUEST[$weight] /// Optional ); return $att; } else if ($_REQUEST['action']=='insert_product') { $textbox = 'txt_'.$str; $select = 'select_'.$str; $weight = 'weight_'.$str; /// Optional $att = array ( 'options_id' => $option_id, 'options_values_id' => $option_value_id, 'options_values_price' => $_REQUEST[$textbox], 'price_prefix' => $_REQUEST[$select], 'attribute_weight' => $_REQUEST[$weight] /// Optional ); return $att; } } ////////// function tep_cfg_readonly($value){ $single[]= array('id' => $value, 'text' => $value); return tep_draw_pull_down_menu('configuration_value', $single, $value); } function tep_cfg_pull_down_installed_fonts($font_name) { if ($root=@opendir(DIR_FS_DOCUMENT_ROOT.'includes/imagemagic/fonts')){ while ($file=readdir($root)){ if($file=="." || $file==".." || is_dir($dir."/".$file)) continue; $files[]= array('id' => $file, 'text' => $file); } } return tep_draw_pull_down_menu('configuration_value', $files, $font_name); } function tep_cfg_pull_down_installed_watermarks($watermark_name) { if ($root=@opendir(DIR_FS_DOCUMENT_ROOT.'includes/imagemagic/watermarks')){ while ($file=readdir($root)){ if($file=="." || $file==".." || is_dir($dir."/".$file)) continue; $files[]= array('id' => $file, 'text' => $file); } } return tep_draw_pull_down_menu('configuration_value', $files, $watermark_name); } function tep_cfg_pull_down_watermark_alignment($watermark_alignment) { $align[]= array('id' => 'Tiled', 'text' => 'Tiled'); $align[]= array('id' => 'Top', 'text' => 'Top'); $align[]= array('id' => 'Top Left', 'text' => 'Top Left'); $align[]= array('id' => 'Top Right', 'text' => 'Top Right'); $align[]= array('id' => 'Center', 'text' => 'Center'); $align[]= array('id' => 'Bottom', 'text' => 'Bottom'); $align[]= array('id' => 'Bottom Left', 'text' => 'Bottom Left'); $align[]= array('id' => 'Bottom Right', 'text' => 'Bottom Right'); return tep_draw_pull_down_menu('configuration_value', $align, $watermark_alignment); } ?>
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/nakedpla/public_html/admin/includes/functions/general.php:18) in /home/nakedpla/public_html/admin/includes/functions/sessions.php on line 102

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/nakedpla/public_html/admin/includes/functions/general.php:18) in /home/nakedpla/public_html/admin/includes/functions/sessions.php on line 102

Fatal error: Call to undefined function tep_not_null() in /home/nakedpla/public_html/admin/includes/classes/language.php on line 74

 

 

 

Second Problem:

 

When I try to view a product on the actual shop, I get a "Parse error: syntax error, unexpected T_ELSE in /home/**********/public_html/product_info.php on line 259"

 

 

 

Any ideas on how to fix either one?

 

If I remember right, the admin/index.php file wasn't edited at all, so why would it throw error messages?

Share this post


Link to post
Share on other sites

Update:

 

Second problem was fixed (just had to edit/delete/rearrange some of the code).

 

First problem still needs fixed.

Share this post


Link to post
Share on other sites

Update again (sorry for the extra posts, unable to edit previous ones)

 

First problem is fixed.. apparently the <?php code was missing from the very first line of the general.php file.

 

All is good..for now!

Share this post


Link to post
Share on other sites

Hello !

 

I need some help with the plugin... I'm going crazy !!

 

I created a master product, and a slave product.

 

First of all, when I click in the category where my 2 products are, I have this message:

"There are no products to list in this category"

 

(and in my category, I can see "(2)", meaning there are 2 products in this category...)

 

So I click on the manufacturer name, and here it's working: I can see my 2 products.

 

The problem is that in my slave, I clicked on "hide product".

I don't want my slave product to be displayed in the product list, but I want it displayed on the product info, below the master one.

 

Is it possible ?

Any idea of what can be the problem ?

 

I really do hope you'll give me some help, because I'm feeling very lonely...

 

PS: I already had to make some changes to index.php, because the query as not ok:

listing_sql did not contain p.products_master nor p.products_master_status, so I add it.

Share this post


Link to post
Share on other sites

I downloaded buy_now_button_bug_master_products.txt and made the correct changes to the index file, and now it's working:

I can click in the categories, or in the manufacturers, and I can see my master product.

My slave product is hidden, as I wanted.

 

But I still have one problem:

 

When I click on my master product, to see the details, there is no slave listed below...

So I can only buy master products...

 

Anyone can help ?

 

Thanks.

Share this post


Link to post
Share on other sites

Ok, I'm a bit confused about something with this add-on.

 

It works fine, except...it doesn't do what I thought it would.

 

I thought it would combine both master and slave products into one order.. like bundle them together as a package deal thing, but the slave product would be optional.

 

 

 

For example:

 

I have a master product (say, a shirt) for $10 and a slave product for $5 (a hat, for example).

 

I thought it would be so the slave product (hat) was optional--you COULD buy it with the master product (shirt), but you don't HAVE to buy it.

 

So, if someone wanted to buy one hat (slave product) with the shirt (master product), they'd input a quantity number (1) and hit the "buy now" or "add to cart" button. Then on the shopping cart it would show $15 ---$10 for the shirt (master product) + $5 for adding the hat (slave product).

 

But there is one main problem:

 

Whether you select a slave product or not, the only thing that shows up in the shopping cart is the slave product--the master product does not show up in the shopping cart at all.

 

 

 

So, I'm wondering, are they even supposed to be included together in the sale?

(should the master and slave both be listed in the shopping cart?)

 

Or is that just not an option and does it work completely different?

 

And how can it be set up so the slave product is optional and if it's not selected, then you'd just be purchasing the master product?

Share this post


Link to post
Share on other sites

Fisrt off, this is exactly what I needed and got it working great. Just a question.. I have many attribute to each slave, how do I format the "Options" to be next to each other instead of stacked?

 

Like this now:

 

Power

+6.0

BC

1.00

 

Would like:

 

Power: BC:

+6.0 1.00

 

(options would be drop down boxes)

Thanks in advanced!!

Share this post


Link to post
Share on other sites

I am trying to configure product notifications to work with slave products.

 

What I need to do, is take the products_id from $listing['products_id'] from master_listing.php page

 

 

 

Then in the application_top.php

 

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) {

 

if($HTTP_POST_VARS['listing'] != '') //ADD SOME SORT OF CHECK TO DETERMINE IF SLAVE EXIST

{

tep_db_query("insert into " . TABLE_PRODUCTS_NOTIFICATIONS . " (products_id, customers_id, date_added) values ('" . slave_id . "', '" . $customer_id . "', now())");

}else{

 

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 {

////////////////////////////////////////////////////////////////////////////////

 

I guess the simple answer I am asking... how do I get the variable $listing['products_id'] (master_listing.php), which is the product_id of the slave to be called/read on the application_top.php page

 

Thanks,

Share this post


Link to post
Share on other sites

Hi,

 

 

I started to rebuild Master Product V1.25 to oscommerce V2.3x. Does somebody like to pre-test release?

 

master_product_catalog.jpg

master_product_frontend.jpg

 

I've just working on suggested accessories finalising.


:blink:
osCommerce based shop owner with minimal design and focused on background works. When the less is more.
Email managment with tracking pixel, package managment for shipping, stock management, warehouse managment with bar code reader, parcel shops management on 3000 pickup points without local store.

Share this post


Link to post
Share on other sites

Hi,

 

 

I started to rebuild Master Product V1.25 to oscommerce V2.3x. Does somebody like to pre-test release?

 

 

 

I've just working on suggested accessories finalising.

Sent you a pm with my email address. This could be just what I am looking for. I sell electrical components such as fuses, so a master could be assigned, then all of the current ratings be slaves.

Share this post


Link to post
Share on other sites

Sent you a pm with my email address. This could be just what I am looking for. I sell electrical components such as fuses, so a master could be assigned, then all of the current ratings be slaves.

 

Mail sent.


:blink:
osCommerce based shop owner with minimal design and focused on background works. When the less is more.
Email managment with tracking pixel, package managment for shipping, stock management, warehouse managment with bar code reader, parcel shops management on 3000 pickup points without local store.

Share this post


Link to post
Share on other sites

Mail sent.

 

I am about to install the test package. I have compared the files to the original and there appears to be a file missing. catalog/includes/modules/master_products.php.

 

Is this correct?

Share this post


Link to post
Share on other sites

I am about to install the test package. I have compared the files to the original and there appears to be a file missing. catalog/includes/modules/master_products.php.

 

Is this correct?

 

No, sorry about it. I forgot to pack in. I rewrote for PHP5.3

 

<?php
/*
$ID master_products.php - luckyno - 10/13/2010

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

 Copyright (c) 2003 osCommerce

 Master Products RC2a  - luckyno - 10/13/2010

 Released under the GNU General Public License
*/

 require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_MASTER_PRODUCTS);

$master_query = tep_db_query("select products_master from " . TABLE_PRODUCTS . " where products_master = " . $HTTP_GET_VARS['products_id']);
$thisquery = tep_db_fetch_array($master_query);
if ($thisquery['products_master'] != '0') {

     	$slave_list = array('MASTER_LIST_MODEL' => MASTER_LIST_MODEL,
	                      	'MASTER_LIST_NAME' => MASTER_LIST_NAME,
	                      	'MASTER_LIST_MANUFACTURER' => MASTER_LIST_MANUFACTURER,
	                      	'MASTER_LIST_PRICE' => MASTER_LIST_PRICE,
	                      	'MASTER_LIST_QUANTITY' => MASTER_LIST_QUANTITY,
	                      	'MASTER_LIST_WEIGHT' => MASTER_LIST_WEIGHT,
	                      	'MASTER_LIST_IMAGE' => MASTER_LIST_IMAGE,
	                      	'MASTER_LIST_BUY_NOW' => MASTER_LIST_BUY_NOW,
							  'MASTER_LIST_OPTIONS' => MASTER_LIST_OPTIONS,
	                      	'MASTER_LIST_DESCRIPTION' => MASTER_LIST_DESCRIPTION);

asort($slave_list);

$column_list = array();
reset($slave_list);
while (list($key, $value) = each($slave_list)) {
 	if ($value > 0) $column_list[] = $key;
}

$select_column_list = '';

for ($i=0, $n=sizeof($column_list); $i<$n; $i++) {
 	switch ($column_list[$i]) {
   	case 'MASTER_LIST_MODEL':
     	$select_column_list .= 'p.products_model,';
     	break;
   	case 'MASTER_LIST_NAME':
     	$select_column_list .= 'pd.products_name, ';
     	break;
   	case 'MASTER_LIST_DESCRIPTION':
  $select_column_list .= 'pd.products_description, ';
     	break;      	
   	case 'MASTER_LIST_MANUFACTURER':
     	$select_column_list .= 'm.manufacturers_name, ';
     	break;
   	case 'MASTER_LIST_QUANTITY':
     	$select_column_list .= 'p.products_quantity, ';
     	break;
   	case 'MASTER_LIST_IMAGE':
     	$select_column_list .= 'p.products_image, ';
     	break;
   	case 'MASTER_LIST_WEIGHT':
     	$select_column_list .= 'p.products_weight, ';
     	break;
 	}
}

			$master_sql = "select  " . $select_column_list . " p.products_id,  p.manufacturers_id, p.products_tax_class_id, s.specials_new_products_price, s.status, p.products_price from ". TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_id = pd.products_id and p.products_master = " . $HTTP_GET_VARS['products_id'] . " and p.products_status = '1' and pd.language_id = '" . (int)$languages_id . "'";


}

if ( (!isset($HTTP_GET_VARS['sort'])) || (!preg_match('/[1-8][ad]/', $HTTP_GET_VARS['sort'])) || (substr($HTTP_GET_VARS['sort'], 0, 1) > sizeof($column_list)) ) {
 	for ($i=0, $n=sizeof($column_list); $i<$n; $i++) {
   	if ($column_list[$i] == 'MASTER_LIST_NAME') {
     	$HTTP_GET_VARS['sort'] = $i+1 . 'a';
     	$master_sql .= " order by pd.products_name";
     	break;
   	}
 	}
} else {
 	$sort_col = substr($HTTP_GET_VARS['sort'], 0 , 1);
 	$sort_order = substr($HTTP_GET_VARS['sort'], 1);
 	$master_sql .= ' order by ';
 	switch ($column_list[$sort_col-1]) {
   	case 'MASTER_LIST_MODEL':
     	$master_sql .= "p.products_model " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
     	break;
   	case 'MASTER_LIST_NAME':
     	$master_sql .= "pd.products_name " . ($sort_order == 'd' ? 'desc' : '');
     	break;
   	case 'MASTER_LIST_MANUFACTURER':
     	$master_sql .= "m.manufacturers_name " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
     	break;
   	case 'MASTER_LIST_QUANTITY':
     	$master_sql .= "p.products_quantity " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
     	break;
   	case 'MASTER_LIST_IMAGE':
     	$master_sql .= "pd.products_name";
     	break;
   	case 'MASTER_LIST_WEIGHT':
     	$master_sql .= "p.products_weight " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
     	break;
   	case 'MASTER_LIST_PRICE':
     	$master_sql .= "p.products_price " . ($sort_order == 'd' ? 'desc' : '') . ", pd.products_name";
     	break;
 	}
}

	include(DIR_WS_MODULES . FILENAME_MASTER_LISTING); 

?>


:blink:
osCommerce based shop owner with minimal design and focused on background works. When the less is more.
Email managment with tracking pixel, package managment for shipping, stock management, warehouse managment with bar code reader, parcel shops management on 3000 pickup points without local store.

Share this post


Link to post
Share on other sites

I find shopping cart box bug too. The highlihted new item in cart works. This problem was in previous versions and the reason was while cycle.

 

in catalog/includes/application_top.php

 

find:

if (substr($key,0,11) == "Qty_ProdId_") {

 

 

change to:

if (substr($key,0,11) == "Qty_ProdId_" && ($val != 0)) {

 

 

At this moment I cant find the reason of the linking problem (2-3 bugs). I am affraid that V2.3x change something with $listing_split class doesn't work perfect.

This would be perfect if linking works.

Edited by Gergely

:blink:
osCommerce based shop owner with minimal design and focused on background works. When the less is more.
Email managment with tracking pixel, package managment for shipping, stock management, warehouse managment with bar code reader, parcel shops management on 3000 pickup points without local store.

Share this post


Link to post
Share on other sites

At this moment I cant find the reason of the linking problem (2-3 bugs). I am affraid that V2.3x change something with $listing_split class doesn't work perfect.

This would be perfect if linking works.

 

Problem solved. I put it as Master Product V2.3x new pack as soon as possible.

 

Cheers


:blink:
osCommerce based shop owner with minimal design and focused on background works. When the less is more.
Email managment with tracking pixel, package managment for shipping, stock management, warehouse managment with bar code reader, parcel shops management on 3000 pickup points without local store.

Share this post


Link to post
Share on other sites

catalog/products_new.php contains the old style buttons

 

<!--Master Products //-->

<?php if ($products_new['products_master_status'] != '1' && $products_new['products_master'] =='0') {

?>

<td align="right" valign="middle" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_NEW, tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $products_new['products_id']) . '">' . tep_image_button('button_in_cart.gif', IMAGE_BUTTON_IN_CART) . '</a>'; ?></td>

<?php

} elseif ($products_new['products_master'] != '0') {

?>

<td align="right" valign="middle" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_master']) . '">' . tep_image_button('button_in_cart.gif', IMAGE_BUTTON_IN_CART) . '</a>'; ?></td>

<?php

} else {

?>

<td align="right" valign="middle" class="main"><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products_new['products_id']) . '">' . tep_image_button('button_in_cart.gif', IMAGE_BUTTON_IN_CART) . '</a>'; ?></td>

<?php

}

?>

<!--Master Products EOF //-->

Share this post


Link to post
Share on other sites

Thanks. Edited.

 

I uploaded Beta release.


:blink:
osCommerce based shop owner with minimal design and focused on background works. When the less is more.
Email managment with tracking pixel, package managment for shipping, stock management, warehouse managment with bar code reader, parcel shops management on 3000 pickup points without local store.

Share this post


Link to post
Share on other sites

Thanks. Edited.

 

I uploaded Beta release.

 

I have ran out of pm's.

The new admin/categories.php is fine now, no errors

Share this post


Link to post
Share on other sites

I have ran out of pm's.

The new admin/categories.php is fine now, no errors

 

 

I have found this error when clicking add new product

Notice: Undefined property: objectInfo::$products_master in /home/xxxx/public_html/admin/categories.php on line 872

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

×