[Contribution] QTpro - Quantity Tracking Professional
#2081
Posted 01 January 2013 - 12:22 AM
#2082
Posted 07 January 2013 - 04:58 PM
I didn't find any solutions for my issue which is connected to this contribution. I have two attributes: color and size in diferent quantities. Let say article in red (L) 1 pcs, yellow (XL) 1 pcs and blue (M) 2 pcs. How can I set in admin (if this is passible at all) to display on page (frontend) when I choose red articles to see only L size and not also other sizes (XL, M) and colors (yellow, blue). Now I have on page displayed all sizes and all colors, which is a bit confusing for customers. Later on, when articles are in cart, everything is OK. Those articles which are not on stock are noted ''not available''. Does this contribution (QTPro) allow customization form this point of view.
#2083 ONLINE
Posted 07 January 2013 - 07:10 PM
If after trying that you don't have what you want, another option is to edit the products attributes and delete the attribute combination that has zero quantity
I remember what it was like when I first started with osC. It can be overwhelming.
However, I strongly recommend considering hiring a professional for extensive site modifications, site cleaning, etc.
There are several good pros here on osCommerce. Look around, you'll figure out who they are.
#2084
Posted 08 January 2013 - 09:58 AM
Thanks.
Matjaz
#2085 ONLINE
Posted 09 January 2013 - 01:07 PM
An examination of the code would tell sure.
Gornik, on 08 January 2013 - 09:58 AM, said:
Thanks.
Matjaz
I remember what it was like when I first started with osC. It can be overwhelming.
However, I strongly recommend considering hiring a professional for extensive site modifications, site cleaning, etc.
There are several good pros here on osCommerce. Look around, you'll figure out who they are.
#2086
Posted 26 January 2013 - 08:47 PM
Thanks.
#2087 ONLINE
Posted 26 January 2013 - 11:52 PM
diver000, on 26 January 2013 - 08:47 PM, said:
Thanks.
i am using version 4.6.1 for the 2.3 version of osC. However I had to do so after fix ups to make things work with Attribute Manager. I see there are subsequent fixes to the version i use, but since alls working well in my shops i haven't gotten around to looking into those yet.
I remember what it was like when I first started with osC. It can be overwhelming.
However, I strongly recommend considering hiring a professional for extensive site modifications, site cleaning, etc.
There are several good pros here on osCommerce. Look around, you'll figure out who they are.
#2088
Posted 15 February 2013 - 01:20 PM
When I add the stock quantity I click the "add" button and I'm kicked out the admin area logged out instantly
If I login again the qty is saved, but doing this every single time is soooooo boring!!!!
Does someone know how to fix this problem?
Thanks,
Max
#2089
Posted 05 March 2013 - 08:19 PM
Warning: require(includes/functions/qtpro_functions.php) [function.require]: failed to open stream: No such file or directory in W:\www\mystore\admin\includes\functions\general.php on line 1534
Fatal error: require() [function.require]: Failed opening required 'includes/functions/qtpro_functions.php' (include_path='.;/usr/local/PHP/includes;/usr/local/PHP/pear;/home/admin/www/plugins/pear/PEAR') in W:\www\mystore\admin\includes\functions\general.php on line 1534
There is no line 1534 in general.php nor do I have includes/functions/qtpro_functions.php
Any help would be greatly appreciated!!!!
#2090
Posted 12 March 2013 - 06:12 PM
I looked on various php files, but I ain't that good at coding. I think the problem is in includes/modules/payment/icepay/custom/class_update_stock.php.
Someone who can help me with this problem?
#2091
Posted 11 April 2013 - 09:06 AM
I've got QTPro 4.6.1 installed, but am having a problem with it. I have added two options for a product. The product displays as normal on my website with the choice of the two options appearing in the drop-down box. So far, everything looks good. However, when the product (regardless of the option) is added to the cart, the product will add, but not the option. You can see the problem in action here. So, when I go to check on the orders behind the scene, I can only see that the customer has bought the product, but I don't know what option they have actually chosen.
Can anyone help? I'm sure it's probably an easy fix; I'm not expert on this stuff though.
Thanks everyone!
#2092
Posted 30 April 2013 - 11:14 AM
flip_jam, on 11 April 2013 - 09:06 AM, said:
I've got QTPro 4.6.1 installed, but am having a problem with it. I have added two options for a product. The product displays as normal on my website with the choice of the two options appearing in the drop-down box. So far, everything looks good. However, when the product (regardless of the option) is added to the cart, the product will add, but not the option. You can see the problem in action here. So, when I go to check on the orders behind the scene, I can only see that the customer has bought the product, but I don't know what option they have actually chosen.
Can anyone help? I'm sure it's probably an easy fix; I'm not expert on this stuff though.
Thanks everyone!
Can anyone help me on this? I would be forever grateful! Still can't get it worked out
#2093
Posted 02 May 2013 - 06:21 PM
Fatal error: Call to undefined function qtpro_sick_product_count() in admin/includes/header.php on line 19
#2094
Posted 15 May 2013 - 07:15 PM
Getting Parse error: syntax error, unexpected '}' in /home/attitude/public_html/shop/product_info.php on line 238
Here is my code:
<?php
/*
$Id$
osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com
Copyright (c) 2010 osCommerce
Released under the GNU General Public License
*/
require('includes/application_top.php');
if (!isset($HTTP_GET_VARS['products_id'])) {
tep_redirect(tep_href_link(FILENAME_DEFAULT));
}
require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_PRODUCT_INFO);
$current_page = FILENAME_PRODUCT_INFO;
$product_check_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "'");
$product_check = tep_db_fetch_array($product_check_query);
require(DIR_WS_INCLUDES . 'template_top.php');
?>
<?php echo tep_draw_content_top();?>
<?php
if ($product_check['total'] < 1) {
?>
<?php echo tep_draw_title_top();?>
<h1><?php echo TEXT_PRODUCT_NOT_FOUND; ?></h1>
<?php echo tep_draw_title_bottom();?>
<div class="contentContainer">
<div class="contentPadd">
<div class="buttonSet">
<span class="fl_right"><?php echo tep_draw_button_top();?><?php echo tep_draw_button(IMAGE_BUTTON_CONTINUE, 'triangle-1-e', tep_href_link(FILENAME_DEFAULT)); ?><?php echo tep_draw_button_bottom();?></span>
</div>
</div>
</div>
<?php
} else {
$product_info_query = tep_db_query("select p.products_id, pd.products_name, pd.products_description, p.products_model, p.products_quantity, p.products_image, pd.products_url, p.products_price, p.products_tax_class_id, p.products_date_added, p.products_date_available, p.manufacturers_id from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1'
and p.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "'
and pd.products_id = p.products_id
and pd.language_id = '" . (int)$languages_id . "'");
$product_info = tep_db_fetch_array($product_info_query);
$tags_query_raw = tep_db_query("select pt.tag_id, t.tag_text from " . TABLE_TAGS . " t, " . TABLE_PRODUCTS_TAGS . " pt where pt.products_id = '" . (int)$product_info['products_id'] . "' and t.tag_id = pt.tag_id");
$tags = '';
$caount = 0;
while ($tag = tep_db_fetch_array($tags_query_raw)) {
if ($caount != 0) $tags .= ', ';
$tags .= '<a href="' . tep_href_link(FILENAME_TAG_PRODUCTS) .'?id_tag='.$tag['tag_id'].'">'.$tag['tag_text'].'</a>';
$caount++;
}
tep_db_query("update " . TABLE_PRODUCTS_DESCRIPTION . " set products_viewed = products_viewed+1 where products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and language_id = '" . (int)$languages_id . "'");
if ($new_price = tep_get_products_special_price($product_info['products_id'])) {
$products_price = ' <span class="productSpecialPrice">' . $currencies->display_price($new_price, tep_get_tax_rate($product_info['products_tax_class_id'])) . '</span> <del>' . $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id'])) . '</del>';
$sale = '<div class="sale"></div>';
} else {
$products_price = '<span class="productSpecialPrice">' . $currencies->display_price($product_info['products_price'], tep_get_tax_rate($product_info['products_tax_class_id'])) . '</span>';
$sale = '';
}
if (tep_not_null($product_info['products_model'])) {
$products_name = $product_info['products_name'] . '<br /><span class="smallText">[' . $product_info['products_model'] . ']</span>';
} else {
$products_name = $product_info['products_name'];
}
?>
<?php echo tep_draw_form('cart_quantity', tep_href_link(FILENAME_PRODUCT_INFO, tep_get_all_get_params(array('action')) . 'action=add_product')); ?>
<?php
// add by Seaman
switch (tep_not_null($product_info['products_image'])) {
case 0:
if (($oscTemplate->hasBlocks('box_info_page'))) {
$port_side = 'left_side_pic-1';
$starboard_side = 'right_side_pic-1';
}else{
$port_side = 'left_side_pic-0';
$starboard_side = 'right_side_pic-0';
}
break;
case 1:
$port_side = 'left_side_pic-1';
$starboard_side = 'right_side_pic-1';
break;
}
?>
<div class="contentContainer">
<div class="contentPadd prods_info_page">
<div class="prods_info decks big">
<div class="forecastle">
<ol class="masthead">
<li class="port_side <?php echo $port_side;?>">
<?php
if (tep_not_null($product_info['products_image'])) {
$pi_query = tep_db_query("select image, htmlcontent from " . TABLE_PRODUCTS_IMAGES . " where products_id = '" . (int)$product_info['products_id'] . "' order by sort_order");
?>
<?php
if (tep_db_num_rows($pi_query) > 0) {
?>
<div id="piGal" class="hover">
<ul class="relative">
<?php
$pi_counter = 0;
while ($pi = tep_db_fetch_array($pi_query)) {
$pi_counter++;
$pi_entry = ' <li class="wrapper_pic_div"><a href="';
$pi_entry .= tep_href_link(DIR_WS_IMAGES . $pi['image'], '', 'NONSSL', false);
$pi_entry .= '" target="_blank" rel="fancybox" title="' . $pi['htmlcontent'] . '" class="prods_pic_bg" style="width:'.(PROD_INFO_IMAGE_WIDTH + PIC_MARG_W).'px;height:'.(PROD_INFO_IMAGE_HEIGHT + PIC_MARG_H).'px;">' . tep_image(DIR_WS_IMAGES . $pi['image'], $pi['htmlcontent'], (PROD_INFO_IMAGE_WIDTH), (PROD_INFO_IMAGE_HEIGHT), ' style="width:'.(PROD_INFO_IMAGE_WIDTH + PIC_MARG_W2).'px;height:'.(PROD_INFO_IMAGE_HEIGHT + PIC_MARG_H2).'px;margin:'.PIC_MARG_T.'px '.PIC_MARG_R.'px '.PIC_MARG_B.'px '.PIC_MARG_L.'px;"') . ''.tep_draw_prod_pic_info_top().''.tep_draw_prod_pic_info_bottom().'</a>'.$sale;
$pi_entry .= '</li>';
echo $pi_entry;
}
?>
</ul>
</div>
<?php
// add by Seaman
if (PROD_INFO_IMAGE_WIDTH + PIC_MARG_W2 != PROD_INFO_IMAGE_HEIGHT + PIC_MARG_H2){
$coeff = ((PROD_INFO_IMAGE_HEIGHT + PIC_MARG_H2)/(PROD_INFO_IMAGE_WIDTH + PIC_MARG_W2));
}else{
$coeff = 1;
}
// add by Seaman
?>
<script type="text/javascript">
$(function(){
var myWidth = <?php echo (($pi_counter > 1) ? '65' : '0'); ?>;
var myHeight = myWidth * <?php echo $coeff;?>;
$('#piGal ul').bxGallery({
maxwidth: '<?php echo (PROD_INFO_IMAGE_WIDTH + PIC_MARG_W); ?>',
maxheight: '<?php echo (PROD_INFO_IMAGE_HEIGHT + PIC_MARG_H); ?>',
thumbwidth: myWidth,
thumbheight: myHeight,
thumbcontainer: <?php echo (PROD_INFO_IMAGE_WIDTH + PIC_MARG_W + 7); ?>,
load_image: 'ext/jquery/bxGallery/spinner.gif'
})
});
</script>
<?php
} else {
if (tep_not_null($product_info['products_image'])) {
?>
<div style="width:<?php echo (PROD_INFO_IMAGE_WIDTH + 10); ?>px;" class="hover">
<?php echo '<div id="piGal" class="wrapper_pic_div fl_left" style="width:'.(PROD_INFO_IMAGE_WIDTH + PIC_MARG_W).'px;height:'.(PROD_INFO_IMAGE_HEIGHT + PIC_MARG_H).'px;"><a class="prods_pic_bg" href="' . tep_href_link(DIR_WS_IMAGES . $product_info['products_image'], '', 'NONSSL', false) . '" target="_blank" rel="fancybox">' . tep_image(DIR_WS_IMAGES . $product_info['products_image'], addslashes($product_info['products_name']), (PROD_INFO_IMAGE_WIDTH), (PROD_INFO_IMAGE_HEIGHT), ' style="width:'.(PROD_INFO_IMAGE_WIDTH + PIC_MARG_W2).'px;height:'.(PROD_INFO_IMAGE_HEIGHT + PIC_MARG_H2).'px;margin:'.PIC_MARG_T.'px '.PIC_MARG_R.'px '.PIC_MARG_B.'px '.PIC_MARG_L.'px;"', '', '') . ''.tep_draw_prod_pic_info_top().''.tep_draw_prod_pic_info_bottom().'</a>'.$sale.'</div>'; ?>
</div>
<?php
// add by Seaman
}
}
echo '<script type="text/javascript">
$("#piGal a[rel^=\'fancybox\']").fancybox({
cyclic: true
});
</script>';
?>
<?php
}
?>
<?php
if (($oscTemplate->hasBlocks('box_info_page'))) {
$width_ext = PROD_INFO_IMAGE_WIDTH + PIC_MARG_W;
?>
<div class="bookmarks">
<?php echo $oscTemplate->getBlocks('box_info_page');?>
</div>
<?php
// add by Seaman
}
?>
</li>
<li class="starboard_side <?php echo $starboard_side;?>">
<?php
// add by Seaman
if ($product_check['total'] >= 1) {
include (DIR_WS_INCLUDES . 'products_next_previous.php');
}
// add by Seaman
?>
<div class="info">
<?php
if ($product_info['products_date_available'] > date('Y-m-d H:i:s')) {
?>
<div class="data data_padd small_title"><?php echo sprintf(TEXT_DATE_AVAILABLE, tep_date_long($product_info['products_date_available'])); ?></div>
<?php
}else{
?>
<div class="data data_padd small_title"><?php echo sprintf(TEXT_DATE_ADDED, tep_date_long($product_info['products_date_added'])); ?></div>
<?php
}
?>
<br /><h2><?php echo $products_name; ?></h2>
<h2 class="price"><?php echo '<b>'.PRICE. '</b>'.$products_price; ?></h2>
<?php
//++++ QT Pro: End Changed Code
$products_attributes_query = tep_db_query("select count(*) as total from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_ATTRIBUTES . " patrib where patrib.products_id='" . (int)$HTTP_GET_VARS['products_id'] . "' and patrib.options_id = popt.products_options_id and popt.language_id = '" . (int)$languages_id . "'");
$products_attributes = tep_db_fetch_array($products_attributes_query);
if ($products_attributes['total'] > 0) {
//++++ QT Pro: Begin Changed code
$products_id=(preg_match("/^\d{1,10}(\{\d{1,10}\}\d{1,10})*$/",$HTTP_GET_VARS['products_id']) ? $HTTP_GET_VARS['products_id'] : (int)$HTTP_GET_VARS['products_id']);
require(DIR_WS_CLASSES . 'pad_' . PRODINFO_ATTRIBUTE_PLUGIN . '.php');
$class = 'pad_' . PRODINFO_ATTRIBUTE_PLUGIN;
$pad = new $class($products_id);
echo $pad->draw();
}
//Display a table with which attributecombinations is on stock to the customer?
if(PRODINFO_ATTRIBUTE_DISPLAY_STOCK_LIST == 'True'): require(DIR_WS_MODULES . "qtpro_stock_table.php"); endif;
//++++ QT Pro: End Changed Code
?>
<li class="fl_left"><label><?php echo $products_options_name['products_options_name'] . ':'; ?></label><?php echo tep_draw_pull_down_menu('id[' . $products_options_name['products_options_id'] . ']', $products_options_array, $selected_attribute); ?></li>
<?php
}
?>
</ul>
</div>
<?php
}
?>
<div class="desc desc_padd"><?php echo stripslashes($product_info['products_description']); ?></div>
<?php
$reviews_query = tep_db_query("select count(*) as count from " . TABLE_REVIEWS . " r, " . TABLE_REVIEWS_DESCRIPTION . " rd where r.products_id = '" . (int)$HTTP_GET_VARS['products_id'] . "' and r.reviews_id = rd.reviews_id and rd.languages_id = '" . (int)$languages_id . "' and reviews_status = 1");
$reviews = tep_db_fetch_array($reviews_query);
?>
<div class="buttonSet">
<span class="buttonAction"><?php echo tep_draw_button2_top();?><?php echo tep_draw_button(IMAGE_BUTTON_REVIEWS . (($reviews['count'] > 0) ? ' (' . $reviews['count'] . ')' : ''), 'comment', tep_href_link(FILENAME_PRODUCT_REVIEWS, tep_get_all_get_params())); ?><?php echo tep_draw_button2_bottom();?></span>
<div class="fl_right" align="right"><?php echo tep_draw_button_top();?><?php echo tep_draw_hidden_field('products_id', $product_info['products_id']) . tep_draw_button(IMAGE_BUTTON_IN_CART, 'cart', null, 'primary'); ?><?php echo tep_draw_button_bottom();?></div>
</div>
</div>
</li>
</ol>
</div>
<?php
if ($tags != '') {
?>
<div class="infoBoxWrapper">
<div class="box_wrapper">
<div class="infoBoxHeading prod_page"><div class="title-icon"></div><?php echo tep_draw_box_title_top();?>Tags of product<?php echo tep_draw_box_title_bottom();?></div>
<div class="infoBoxContents">
<?php
echo $tags;
?>
</div>
</div>
</div>
<?php
}
?>
</div>
</div>
</div>
<?php echo tep_draw_content_bottom();?>
<?php
//Optional Related Products (ORP)
include(DIR_WS_MODULES . FILENAME_RELATED_PRODUCTS);
//ORP: end
// add by Seaman
if ((USE_CACHE == 'true') && empty($SID)) {
echo tep_cache_also_purchased(3600);
} else {
include(DIR_WS_MODULES . FILENAME_ALSO_PURCHASED_PRODUCTS);
}
?>
</form>
<?php
}
?>
<?php
require(DIR_WS_INCLUDES . 'template_bottom.php');
require(DIR_WS_INCLUDES . 'application_bottom.php');
?>
Edited by apie, 15 May 2013 - 07:15 PM.
#2095
Posted 15 May 2013 - 11:10 PM
There were two brackets that needed to be removed.
One on line 238 and one on 290.
I've got one more problem though. Now the product info pages load but there is the following error message.
Warning: require(includes/modules/qtpro_stock_table.php) [function.require]: failed to open stream: No such file or directory in /home/attitude/public_html/shop/product_info.php on line 226
Warning: require(includes/modules/qtpro_stock_table.php) [function.require]: failed to open stream: No such file or directory in /home/attitude/public_html/shop/product_info.php on line 226
Fatal error: require() [function.require]: Failed opening required 'includes/modules/qtpro_stock_table.php' (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/attitude/public_html/shop/product_info.php on line 226
Please let me know what needs to be fixed.
#2096
Posted 16 May 2013 - 06:07 PM
#2097
Posted 18 May 2013 - 05:50 PM
I have been looking in the class (pasted below) that I think needs changing to sort the attributes before they are displayed, but cant get anything to work. If anyone has got any ideas, that would be great. Thanks
function _draw_stocked_attributes() {
global $languages_id;
$out='';
$attributes = $this->_build_attributes_array(true, false);
if (sizeof($attributes)>0) {
$combinations = array();
$selected_combination = 0;
$this->_build_attributes_combinations($attributes, $this->show_out_of_stock == 'True', $this->mark_out_of_stock, $combinations, $selected_combination);
$combname='';
foreach ($attributes as $attrib) {
$combname.=', '.$attrib['oname'];
}
$combname=substr($combname,2).':';
foreach ($combinations as $combindex => $comb) {
$out.="<tr>\n";
$out.=' <td align="right" class=main><strong>'.$combname."</strong></td>\n <td class=main>";
$out.=tep_draw_radio_field('attrcomb', $combinations[$combindex]['id'], ($combindex==$selected_combination)) . $comb['text'];
$out.="</td>\n";
$out.="</tr>\n";
$combname='';
}
}
$out.=$this->_draw_out_of_stock_message_js($attributes);
return $out;
}
}
#2098
Posted Today, 06:59 PM
Does anybody know which part of the system this kind of error happens in? I tried looking in pad_multiple_dropdowns, and I even got it to print its queries on the screen for me so I could try them in MySQL. On products that make this mistake, the query still loads the correct data in MySQL. The quantities I see on MySQL match the ones I see on the product detail page. The quantities are above the low stock threshold, but on the faulty items, the item still cannot be added to my cart.
Anybody have any ideas?
<?php
/*
QT Pro Version 4.1
pad_multiple_dropdowns.php
Contribution extension to:
osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com
Copyright (c) 2004, 2005 Ralph Day
Released under the GNU General Public License
Based on prior works released under the GNU General Public License:
QT Pro prior versions
Ralph Day, October 2004
Tom Wojcik aka TomThumb 2004/07/03 based on work by Michael Coffman aka coffman
FREEZEHELL - 08/11/2003 freezehell@hotmail.com Copyright (c) 2003 IBWO
Joseph Shain, January 2003
osCommerce MS2
Copyright (c) 2003 osCommerce
Modifications made:
11/2004 - Created
12/2004 - Fix _draw_out_of_stock_message_js to add semicolon to end of js stock array
03/2005 - Remove '&' for pass by reference from parameters to call of
_build_attributes_combinations. Only needed on method definition and causes
error messages on some php versions/configurations
*******************************************************************************************
QT Pro Product Attributes Display Plugin
pad_multiple_dropdowns.php - Display stocked product attributes first as one dropdown for each attribute.
Class Name: pad_multiple_dropdowns
This class generates the HTML to display product attributes. First, product attributes that
stock is tracked for are displayed, each attribute in its own dropdown list. Then attributes that
stock is not tracked for are displayed, each attribute in its own dropdown list.
Methods overidden or added:
_draw_stocked_attributes draw attributes that stock is tracked for
_draw_out_of_stock_message_js draw Javascript to display out of stock message for out of
stock attribute combinations
*/
require_once(DIR_WS_CLASSES . 'pad_base.php');
class pad_multiple_dropdowns extends pad_base {
/*
Method: _draw_stocked_attributes
draw dropdown lists for attributes that stock is tracked for
Parameters:
none
Returns:
string: HTML to display dropdown lists for attributes that stock is tracked for
*/
function _draw_stocked_attributes() {
global $languages_id;
$out='';
$attributes = $this->_build_attributes_array(true, false);
if (sizeof($attributes)>0) {
for($o=0; $o<sizeof($attributes); $o++) {
$s=sizeof($attributes[$o]['ovals']);
for ($a=0; $a<$s; $a++) {
/* diagnostic code here */
$sqlTest = "select products_stock_quantity from " . TABLE_PRODUCTS_STOCK . " where products_id = '" . (int)$this->products_id . "' AND products_stock_attributes REGEXP '(^|,)" . (int)$attributes[$o]['oid'] . "-" . (int)$attributes[$o]['ovals'][$a]['id'] . "(,|$)' AND products_stock_quantity > 0";
echo "<strong>" . $sqlTest . "</strong><br /><br />";
/* end diagnostic code */
$attribute_stock_query = tep_db_query("select products_stock_quantity from " . TABLE_PRODUCTS_STOCK . " where products_id = '" . (int)$this->products_id . "' AND products_stock_attributes REGEXP '(^|,)" . (int)$attributes[$o]['oid'] . "-" . (int)$attributes[$o]['ovals'][$a]['id'] . "(,|$)' AND products_stock_quantity > 0");
$out_of_stock=(tep_db_num_rows($attribute_stock_query)==0);
if ($out_of_stock && ($this->show_out_of_stock == 'True')) {
switch ($this->mark_out_of_stock) {
case 'Left': $attributes[$o]['ovals'][$a]['text']=TEXT_OUT_OF_STOCK.' - '.$attributes[$o]['ovals'][$a]['text'];
break;
case 'Right': $attributes[$o]['ovals'][$a]['text'].=' - '.TEXT_OUT_OF_STOCK;
break;
}
}
elseif ($out_of_stock && ($this->show_out_of_stock != 'True')) {
unset($attributes[$o]['ovals'][$a]);
}
}
$out.='<tr><td align="right" class=main><strong>'.$attributes[$o]['oname'].":</strong></td><td class=main>".tep_draw_pull_down_menu('id['.$attributes[$o]['oid'].']',array_values($attributes[$o]['ovals']),$attributes[$o]['default'], "onchange=\"stkmsg(this.form);\"")."</td></tr>\n";
}
$out.=$this->_draw_out_of_stock_message_js($attributes);
return $out;
}
}
/*
Method: _draw_out_of_stock_message_js
draw Javascript to display out of stock message for out of stock attribute combinations
Parameters:
$attributes array Array of attributes for the product. Format is as returned by
_build_attributes_array.
Returns:
string: Javascript to display out of stock message for out of stock attribute combinations
*/
function _draw_out_of_stock_message_js($attributes) {
$out='';
$out.="<tr><td> </td><td><span id=\"oosmsg\" class=errorBox></span>\n";
if (($this->out_of_stock_msgline == 'True' | $this->no_add_out_of_stock == 'True')) {
$out.="<SCRIPT LANGUAGE=\"Javascript\"><!--\n";
$combinations = array();
$selected_combination = 0;
$this->_build_attributes_combinations($attributes, false, 'None', $combinations, $selected_combination);
$out.=" function chkstk(frm) {\n";
// build javascript array of in stock combinations
$out.=" var stk=".$this->_draw_js_stock_array($combinations).";\n";
$out.=" var instk=false;\n";
// build javascript if statement to test level by level for existance
$out.=' ';
for ($i=0; $i<sizeof($attributes); $i++) {
$out.='if (stk';
for ($j=0; $j<=$i; $j++) {
$out.="[frm['id[".$attributes[$j]['oid']."]'].value]";
}
$out.=') ';
}
$out.="instk=true;\n";
$out.=" return instk;\n";
$out.=" }\n";
if ($this->out_of_stock_msgline == 'True') {
// set/reset out of stock message based on selection
$out.=" function stkmsg(frm) {\n";
$out.=" var instk=chkstk(frm);\n";
$out.=" var span=document.getElementById(\"oosmsg\");\n";
$out.=" while (span.childNodes[0])\n";
$out.=" span.removeChild(span.childNodes[0]);\n";
$out.=" if (!instk)\n";
$out.=" span.appendChild(document.createTextNode(\"".TEXT_OUT_OF_STOCK_MESSAGE."\"));\n";
$out.=" else\n";
$out.=" span.appendChild(document.createTextNode(\" \"));\n";
$out.=" }\n";
//initialize out of stock message
$out.=" stkmsg(document.cart_quantity);\n";
}
if ($this->no_add_out_of_stock == 'True') {
// js to not allow add to cart if selection is out of stock
$out.=" function chksel() {\n";
$out.=" var instk=chkstk(document.cart_quantity);\n";
$out.=" if (!instk) alert('".TEXT_OUT_OF_STOCK_MESSAGE."');\n";
$out.=" return instk;\n";
$out.=" }\n";
$out.=" document.cart_quantity.onsubmit=chksel;\n";
}
$out.="//--></SCRIPT>\n";
}
$out.="</td></tr>\n";
return $out;
}
}
?>









