Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

[Contribution] QTpro - Quantity Tracking Professional


zonetown

Recommended Posts

Hi everyone,

 

I'm relatively new to the forum, but have been working with OsC for a couple of years now. I recently installed the most recent version of QT Pro on my site. The install went well and the report works as it should, as does inventory updates. Perfect, right?

 

Well, my client has a product with three sizes. For example sake, let's just say Small, Medium, and Large. She realized that she doesn't actually have Large, only Extra Large. SO, she goes to Product Attributes, finds the product and clicks EDIT next to Large, changing this value to Extra Large.

 

Seemed pretty straight-forward to me... But when I go to the Stock Report, the Stock Report shows the OLD value as well as the NEW value. So, the stock report has Small, Medium, Large, and Extra Large with the same quantity next to Large and Extra Large.

 

Now, THAT BEING SAID, the product appears correctly on the site. There is no Large size offered. But the report now has an extra size that doesn't even exist in the catalog.

 

Has anyone else experienced this problem?! I searched the forum, but had trouble finding a similar post.

 

Any help would be appreciated! Otherwise the contrib works great, so I'd hate to have to scrap it just because of this.

 

Thanks in advance for any feedback,

Link to comment
Share on other sites

Hi everyone,

 

I'm relatively new to the forum, but have been working with OsC for a couple of years now. I recently installed the most recent version of QT Pro on my site. The install went well and the report works as it should, as does inventory updates. Perfect, right?

 

Well, my client has a product with three sizes. For example sake, let's just say Small, Medium, and Large. She realized that she doesn't actually have Large, only Extra Large. SO, she goes to Product Attributes, finds the product and clicks EDIT next to Large, changing this value to Extra Large.

 

Seemed pretty straight-forward to me... But when I go to the Stock Report, the Stock Report shows the OLD value as well as the NEW value. So, the stock report has Small, Medium, Large, and Extra Large with the same quantity next to Large and Extra Large.

 

Now, THAT BEING SAID, the product appears correctly on the site. There is no Large size offered. But the report now has an extra size that doesn't even exist in the catalog.

 

Has anyone else experienced this problem?! I searched the forum, but had trouble finding a similar post.

 

Any help would be appreciated! Otherwise the contrib works great, so I'd hate to have to scrap it just because of this.

 

Thanks in advance for any feedback,

 

Hello Sunrise99

 

I am not sure if this will resolve your issue but, did your client remove the OLD Large value from the stock.php page by going to products/categories, choosing the product and the clicking the stock button for that product? In there you set the attribute quantity for large to zero and it should remove that attribute quantity from the database thus removing it from the stock report. I tested this on my own site and it did in fact remove it from the report.

 

Good Luck,

 

Rhawke

Link to comment
Share on other sites

Hello everyone. I have an odditiy I would like to discuss.

 

I originally installed:

http://addons.oscommerce.com/info/888

QT Pro v4.3 for OSC v2.2 RC1 kcobler 5 Nov 2007

 

In this release, and all releases up to "qtpro 4 osC2.2rc2a Andyy 19 Mar 2008" contain the following:

 

	   14-11-05 - Fix to properly save all missing att lists from orders_products.products_stock_attributes
			  mod was by Si - [email protected] or [email protected]

//**si** 14-11-05 fix missing att list
//**si** 14-11-05 end

 

These tiems were found in the checkout_process.php file

 

Now, in Andyy's release (mentioned above) and the releases later by Olof Larsson do not contain these entries. Was this intentional? What are these for? Are they still required? I'm attempting to do a diffmerge (beyond compare really) to update my installation of the QTPro mod to the latest and greatest, however, I discovered these differences which caused some concern and thought I should bring it up here.

 

Thanks,

- DeathAdder

Link to comment
Share on other sites

Hi,

 

I have QTPro installed 4.3b (OScommerce RC1) but I can not add the quantity per attribute, only per product. And when I select the Stock Level Report, it gives Products stock: and than no products, and an EDIT button. When I press that button, I am able to add a product in the toplevel of my categories. Does this mean I have to add all my 200 products with available attributes again? Am I overlooking something simple?

 

I also have ajax attribute manager (2.8.2) installed (plus lots of other mods).

 

Gina

Link to comment
Share on other sites

Hello Sunrise99

 

I am not sure if this will resolve your issue but, did your client remove the OLD Large value from the stock.php page by going to products/categories, choosing the product and the clicking the stock button for that product? In there you set the attribute quantity for large to zero and it should remove that attribute quantity from the database thus removing it from the stock report. I tested this on my own site and it did in fact remove it from the report.

 

Good Luck,

 

Rhawke

 

Hi Rhawke:

Thanks for your reply.

we find:

For the item in question, the stock report shows 5 different sizes, while the website shows 4 (because she changed 1 option to another).

 

Well, when you go to edit the quantities in the stock report, it displays all 5 sizes, but the dropdown to select which one you want to modify only contains 4 sizes. It doesn't contain the option that was deleted.

 

Would you please help to give some advice asap?

 

Thanks & Best Regards,

Link to comment
Share on other sites

Hi Rhawke:

Thanks for your reply.

we find:

For the item in question, the stock report shows 5 different sizes, while the website shows 4 (because she changed 1 option to another).

 

Well, when you go to edit the quantities in the stock report, it displays all 5 sizes, but the dropdown to select which one you want to modify only contains 4 sizes. It doesn't contain the option that was deleted.

 

Would you please help to give some advice asap?

 

Thanks & Best Regards,

 

 

From which Attribute was it changed from sunrise99 ?

 

Product Options

Option Values

Products Attributes

 

from

Andyy

Link to comment
Share on other sites

Hi Rhawke:

Thanks for your reply.

we find:

For the item in question, the stock report shows 5 different sizes, while the website shows 4 (because she changed 1 option to another).

 

Well, when you go to edit the quantities in the stock report, it displays all 5 sizes, but the dropdown to select which one you want to modify only contains 4 sizes. It doesn't contain the option that was deleted.

 

Would you please help to give some advice asap?

 

Thanks & Best Regards,

 

Hello sunrise99,

 

I am "thinking" what has happened here is that your client has deleted the attribute combination from the product attributes section, doing this has removed it from the stock.php page drop down selections and so now the only way to remove that item from the database is by using an sql query on the database table products_stock or... if you have phpmyadmin, navigate to the products_stock table, find the correct entry for that product attribute combination and delete that row from the database manually.

 

If that is the case, then I suggest you instruct your client from now on to use the stock button (stock.php) to remove attribute selections from the products rather than use product attributes, hopefully that will prevent this from occuring again and make their lives a little easier.

 

In case anyone has some spare time.... HA ..a future modification to this contribution might be to fix this scenario and have it so when a product attribute is removed/deleted from the product attributes page, any combination existing on stock.php that uses that attribute is also deleted. Of course a validation check against product_stock should be made so that a person is either forced to zero out the quantities on stock.php first or the program automatically sets all quantities to zero before deleting the attribute from the product_attributes/options table would be a good idea. (hope that makes sense).

 

I hope the above solves the problem for you Sunrise99, let us know please.

 

Rhawke

Link to comment
Share on other sites

  • 2 weeks later...

Hi everyone,

 

I am a little lost. Have installed everything as per manual but when I tick the "track stock" in catalog/product attributes/ product options I get the following reply.....

 

1054 - Unknown column 'products_options_track_stock' in 'field list'

 

update products_options set products_options_track_stock='1',products_options_name = 'Color' where products_options_id = '1' and language_id = '1'

 

[TEP STOP]

 

The only file that seems to be causing the problem is admin/products_attributes.php

 

I have copied it below if someone could lead me in the right direction.....please help!! Thanks in advance

------------------------------------------------------------------------------------------------------------------------------------------------

 

<?php

/*

$Id: products_attributes.php 1776 2008-01-09 20:41:00Z hpdl $

 

osCommerce, Open Source E-Commerce Solutions

http://www.oscommerce.com

 

Copyright © 2008 osCommerce

 

Released under the GNU General Public License

*/

 

require('includes/application_top.php');

$languages = tep_get_languages();

 

$action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');

 

$option_page = (isset($HTTP_GET_VARS['option_page']) && is_numeric($HTTP_GET_VARS['option_page'])) ? $HTTP_GET_VARS['option_page'] : 1;

$value_page = (isset($HTTP_GET_VARS['value_page']) && is_numeric($HTTP_GET_VARS['value_page'])) ? $HTTP_GET_VARS['value_page'] : 1;

$attribute_page = (isset($HTTP_GET_VARS['attribute_page']) && is_numeric($HTTP_GET_VARS['attribute_page'])) ? $HTTP_GET_VARS['attribute_page'] : 1;

 

$page_info = 'option_page=' . $option_page . '&value_page=' . $value_page . '&attribute_page=' . $attribute_page;

 

if (tep_not_null($action)) {

switch ($action) {

case 'add_product_options':

$products_options_id = tep_db_prepare_input($HTTP_POST_VARS['products_options_id']);

$option_name_array = $HTTP_POST_VARS['option_name'];

 

for ($i=0, $n=sizeof($languages); $i<$n; $i ++) {

$option_name = tep_db_prepare_input($option_name_array[$languages[$i]['id']]);

//++++ QT Pro: Begin Changed code

$track_stock=isset($HTTP_POST_VARS['track_stock'])?1:0;

tep_db_query("insert into " . TABLE_PRODUCTS_OPTIONS . " (products_options_id, products_options_name, language_id,products_options_track_stock) values ('" . (int)$products_options_id . "', '" . tep_db_input($option_name) . "', '" . (int)$languages[$i]['id'] . "', '" . (int)$track_stock . "')");

//++++ QT Pro: End Changed Code

}

tep_redirect(tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info));

break;

case 'add_product_option_values':

$value_name_array = $HTTP_POST_VARS['value_name'];

$value_id = tep_db_prepare_input($HTTP_POST_VARS['value_id']);

$option_id = tep_db_prepare_input($HTTP_POST_VARS['option_id']);

 

for ($i=0, $n=sizeof($languages); $i<$n; $i ++) {

$value_name = tep_db_prepare_input($value_name_array[$languages[$i]['id']]);

 

tep_db_query("insert into " . TABLE_PRODUCTS_OPTIONS_VALUES . " (products_options_values_id, language_id, products_options_values_name) values ('" . (int)$value_id . "', '" . (int)$languages[$i]['id'] . "', '" . tep_db_input($value_name) . "')");

}

 

tep_db_query("insert into " . TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS . " (products_options_id, products_options_values_id) values ('" . (int)$option_id . "', '" . (int)$value_id . "')");

 

tep_redirect(tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info));

break;

case 'add_product_attributes':

$products_id = tep_db_prepare_input($HTTP_POST_VARS['products_id']);

$options_id = tep_db_prepare_input($HTTP_POST_VARS['options_id']);

$values_id = tep_db_prepare_input($HTTP_POST_VARS['values_id']);

$value_price = tep_db_prepare_input($HTTP_POST_VARS['value_price']);

$price_prefix = tep_db_prepare_input($HTTP_POST_VARS['price_prefix']);

 

tep_db_query("insert into " . TABLE_PRODUCTS_ATTRIBUTES . " values (null, '" . (int)$products_id . "', '" . (int)$options_id . "', '" . (int)$values_id . "', '" . (float)tep_db_input($value_price) . "', '" . tep_db_input($price_prefix) . "')");

 

if (DOWNLOAD_ENABLED == 'true') {

$products_attributes_id = tep_db_insert_id();

 

$products_attributes_filename = tep_db_prepare_input($HTTP_POST_VARS['products_attributes_filename']);

$products_attributes_maxdays = tep_db_prepare_input($HTTP_POST_VARS['products_attributes_maxdays']);

$products_attributes_maxcount = tep_db_prepare_input($HTTP_POST_VARS['products_attributes_maxcount']);

 

if (tep_not_null($products_attributes_filename)) {

tep_db_query("insert into " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " values (" . (int)$products_attributes_id . ", '" . tep_db_input($products_attributes_filename) . "', '" . tep_db_input($products_attributes_maxdays) . "', '" . tep_db_input($products_attributes_maxcount) . "')");

}

}

 

tep_redirect(tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info));

break;

case 'update_option_name':

$option_name_array = $HTTP_POST_VARS['option_name'];

$option_id = tep_db_prepare_input($HTTP_POST_VARS['option_id']);

 

for ($i=0, $n=sizeof($languages); $i<$n; $i ++) {

$option_name = tep_db_prepare_input($option_name_array[$languages[$i]['id']]);

//++++ QT Pro: Begin Changed code

$track_stock=isset($HTTP_POST_VARS['track_stock'])?1:0;

tep_db_query("update " . TABLE_PRODUCTS_OPTIONS . " set products_options_track_stock='" . (int)$track_stock . "',products_options_name = '" . tep_db_input($option_name) . "' where products_options_id = '" . (int)$option_id . "' and language_id = '" . (int)$languages[$i]['id'] . "'");

//++++ QT Pro: End Changed Code

}

 

tep_redirect(tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info));

break;

case 'update_value':

$value_name_array = $HTTP_POST_VARS['value_name'];

$value_id = tep_db_prepare_input($HTTP_POST_VARS['value_id']);

$option_id = tep_db_prepare_input($HTTP_POST_VARS['option_id']);

 

for ($i=0, $n=sizeof($languages); $i<$n; $i ++) {

$value_name = tep_db_prepare_input($value_name_array[$languages[$i]['id']]);

 

tep_db_query("update " . TABLE_PRODUCTS_OPTIONS_VALUES . " set products_options_values_name = '" . tep_db_input($value_name) . "' where products_options_values_id = '" . tep_db_input($value_id) . "' and language_id = '" . (int)$languages[$i]['id'] . "'");

}

 

tep_db_query("update " . TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS . " set products_options_id = '" . (int)$option_id . "' where products_options_values_id = '" . (int)$value_id . "'");

 

tep_redirect(tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info));

break;

case 'update_product_attribute':

$products_id = tep_db_prepare_input($HTTP_POST_VARS['products_id']);

$options_id = tep_db_prepare_input($HTTP_POST_VARS['options_id']);

$values_id = tep_db_prepare_input($HTTP_POST_VARS['values_id']);

$value_price = tep_db_prepare_input($HTTP_POST_VARS['value_price']);

$price_prefix = tep_db_prepare_input($HTTP_POST_VARS['price_prefix']);

$attribute_id = tep_db_prepare_input($HTTP_POST_VARS['attribute_id']);

 

tep_db_query("update " . TABLE_PRODUCTS_ATTRIBUTES . " set products_id = '" . (int)$products_id . "', options_id = '" . (int)$options_id . "', options_values_id = '" . (int)$values_id . "', options_values_price = '" . (float)tep_db_input($value_price) . "', price_prefix = '" . tep_db_input($price_prefix) . "' where products_attributes_id = '" . (int)$attribute_id . "'");

 

if (DOWNLOAD_ENABLED == 'true') {

$products_attributes_filename = tep_db_prepare_input($HTTP_POST_VARS['products_attributes_filename']);

$products_attributes_maxdays = tep_db_prepare_input($HTTP_POST_VARS['products_attributes_maxdays']);

$products_attributes_maxcount = tep_db_prepare_input($HTTP_POST_VARS['products_attributes_maxcount']);

 

if (tep_not_null($products_attributes_filename)) {

tep_db_query("replace into " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " set products_attributes_id = '" . (int)$attribute_id . "', products_attributes_filename = '" . tep_db_input($products_attributes_filename) . "', products_attributes_maxdays = '" . tep_db_input($products_attributes_maxdays) . "', products_attributes_maxcount = '" . tep_db_input($products_attributes_maxcount) . "'");

}

}

 

tep_redirect(tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info));

break;

case 'delete_option':

$option_id = tep_db_prepare_input($HTTP_GET_VARS['option_id']);

 

tep_db_query("delete from " . TABLE_PRODUCTS_OPTIONS . " where products_options_id = '" . (int)$option_id . "'");

 

tep_redirect(tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info));

break;

case 'delete_value':

$value_id = tep_db_prepare_input($HTTP_GET_VARS['value_id']);

 

tep_db_query("delete from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$value_id . "'");

tep_db_query("delete from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$value_id . "'");

tep_db_query("delete from " . TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS . " where products_options_values_id = '" . (int)$value_id . "'");

 

tep_redirect(tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info));

break;

case 'delete_attribute':

$attribute_id = tep_db_prepare_input($HTTP_GET_VARS['attribute_id']);

 

tep_db_query("delete from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_attributes_id = '" . (int)$attribute_id . "'");

 

// added for DOWNLOAD_ENABLED. Always try to remove attributes, even if downloads are no longer enabled

tep_db_query("delete from " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " where products_attributes_id = '" . (int)$attribute_id . "'");

 

tep_redirect(tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info));

break;

}

}

?>

<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">

<html <?php echo HTML_PARAMS; ?>>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">

<title><?php echo TITLE; ?></title>

<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">

</head>

<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">

<!-- header //-->

<?php require(DIR_WS_INCLUDES . 'header.php'); ?>

<!-- header_eof //-->

 

<!-- body //-->

<table border="0" width="100%" cellspacing="2" cellpadding="2">

<tr>

<td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="1" cellpadding="1" class="columnLeft">

<!-- left_navigation //-->

<?php require(DIR_WS_INCLUDES . 'column_left.php'); ?>

<!-- left_navigation_eof //-->

</table></td>

<!-- body_text //-->

<td width="100%" valign="top"><table border="0" width="100%" cellspacing="0" cellpadding="0">

<!-- options and values//-->

<tr>

<td width="100%"><table width="100%" border="0" cellspacing="0" cellpadding="0">

<tr>

<td valign="top" width="50%">

<table width="99%" border="0" cellspacing="0" cellpadding="2">

<!-- options //--> <?php

if ($action == 'delete_product_option') { // delete product option

$options = tep_db_query("select products_options_id, products_options_name from " . TABLE_PRODUCTS_OPTIONS . " where products_options_id = '" . (int)$HTTP_GET_VARS['option_id'] . "' and language_id = '" . (int)$languages_id . "'");

$options_values = tep_db_fetch_array($options);

?>

<tr>

<td class="pageHeading"> <?php echo $options_values['products_options_name']; ?> </td>

</tr>

<tr>

<td><table border="0" width="100%" cellspacing="0" cellpadding="2">

<tr>

<td colspan="3"><?php echo tep_black_line(); ?></td>

</tr>

<?php

$products = tep_db_query("select p.products_id, pd.products_name, pov.products_options_values_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_OPTIONS_VALUES . " pov, " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_PRODUCTS_DESCRIPTION . " pd where pd.products_id = p.products_id and pov.language_id = '" . (int)$languages_id . "' and pd.language_id = '" . (int)$languages_id . "' and pa.products_id = p.products_id and pa.options_id='" . (int)$HTTP_GET_VARS['option_id'] . "' and pov.products_options_values_id = pa.options_values_id order by pd.products_name");

if (tep_db_num_rows($products)) {

?>

<tr class="dataTableHeadingRow">

<td class="dataTableHeadingContent" align="center"> <?php echo TABLE_HEADING_ID; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_PRODUCT; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_OPT_VALUE; ?> </td>

</tr>

<tr>

<td colspan="3"><?php echo tep_black_line(); ?></td>

</tr>

<?php

$rows = 0;

while ($products_values = tep_db_fetch_array($products)) {

$rows++;

?>

<tr class="<?php echo (floor($rows/2) == ($rows/2) ? 'attributes-even' : 'attributes-odd'); ?>">

<td align="center" class="smallText"> <?php echo $products_values['products_id']; ?> </td>

<td class="smallText"> <?php echo $products_values['products_name']; ?> </td>

<td class="smallText"> <?php echo $products_values['products_options_values_name']; ?> </td>

</tr>

<?php

}

?>

<tr>

<td colspan="3"><?php echo tep_black_line(); ?></td>

</tr>

<tr>

<td colspan="3" class="main"><br><?php echo TEXT_WARNING_OF_DELETE; ?></td>

</tr>

<tr>

<td align="right" colspan="3" class="main"><br><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', ' cancel '); ?></a> </td>

</tr>

<?php

} else {

?>

<tr>

<td class="main" colspan="3"><br><?php echo TEXT_OK_TO_DELETE; ?></td>

</tr>

<tr>

<td class="main" align="right" colspan="3"><br><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option&option_id=' . $HTTP_GET_VARS['option_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_delete.gif', ' delete '); ?></a>   <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', ' cancel '); ?></a> </td>

</tr>

<?php

}

?>

</table></td>

</tr>

<?php

} else {

?>

<tr>

<td colspan="3" class="pageHeading"> <?php echo HEADING_TITLE_OPT; ?> </td>

</tr>

<tr>

<td colspan="3" class="smallText" align="right">

<?php

$options = "select * from " . TABLE_PRODUCTS_OPTIONS . " where language_id = '" . (int)$languages_id . "' order by products_options_id";

$options_split = new splitPageResults($option_page, MAX_ROW_LISTS_OPTIONS, $options, $options_query_numrows);

 

echo $options_split->display_links($options_query_numrows, MAX_ROW_LISTS_OPTIONS, MAX_DISPLAY_PAGE_LINKS, $option_page, 'value_page=' . $value_page . '&attribute_page=' . $attribute_page, 'option_page');

?>

</td>

</tr>

<tr>

<?php

//++++ QT Pro: Begin Changed code

?>

<td colspan="4"><?php echo tep_black_line(); ?></td>

<?php

//++++ QT Pro: End Changed Code

?>

</tr>

<tr class="dataTableHeadingRow">

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_ID; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_OPT_NAME; ?> </td>

<?php

//++++ QT Pro: Begin Changed code

?>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_TRACK_STOCK; ?> </td>

<?php

//++++ QT Pro: End Changed Code

?>

<td class="dataTableHeadingContent" align="center"> <?php echo TABLE_HEADING_ACTION; ?> </td>

</tr>

<tr>

<?php

//++++ QT Pro: Begin Changed code

?>

<td colspan="4"><?php echo tep_black_line(); ?></td>

<?php

//++++ QT Pro: End Changed Code

?>

</tr>

<?php

$next_id = 1;

$rows = 0;

$options = tep_db_query($options);

while ($options_values = tep_db_fetch_array($options)) {

$rows++;

?>

<tr class="<?php echo (floor($rows/2) == ($rows/2) ? 'attributes-even' : 'attributes-odd'); ?>">

<?php

if (($action == 'update_option') && ($HTTP_GET_VARS['option_id'] == $options_values['products_options_id'])) {

echo '<form name="option" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option_name&' . $page_info, 'NONSSL') . '" method="post">';

$inputs = '';

for ($i = 0, $n = sizeof($languages); $i < $n; $i ++) {

$option_name = tep_db_query("select products_options_name from " . TABLE_PRODUCTS_OPTIONS . " where products_options_id = '" . $options_values['products_options_id'] . "' and language_id = '" . $languages[$i]['id'] . "'");

$option_name = tep_db_fetch_array($option_name);

$inputs .= $languages[$i]['code'] . ': <input type="text" name="option_name[' . $languages[$i]['id'] . ']" size="20" value="' . $option_name['products_options_name'] . '"> <br>';

}

?>

<td align="center" class="smallText"> <?php echo $options_values['products_options_id']; ?><input type="hidden" name="option_id" value="<?php echo $options_values['products_options_id']; ?>"> </td>

<td class="smallText"><?php echo $inputs; ?></td>

<?php

//++++ QT Pro: Begin Changed code

?>

<td align="center" class="smallText"><input type=checkbox name=track_stock <? echo $options_values['products_options_track_stock']?"checked":""; ?>></td>

<?php

//++++ QT Pro: End Changed Code

?>

<td align="center" class="smallText"> <?php echo tep_image_submit('button_update.gif', IMAGE_UPDATE); ?> <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', IMAGE_CANCEL); ?></a> </td>

<?php

echo '</form>' . "\n";

} else {

?>

<td align="center" class="smallText"> <?php echo $options_values["products_options_id"]; ?> </td>

<td class="smallText"> <?php echo $options_values["products_options_name"]; ?> </td>

<?php

//++++ QT Pro: Begin Changed code

?>

<td align="center" class="smallText"> <?php echo $options_values['products_options_track_stock']?"Yes":"No"; ?></td>

<?php

//++++ QT Pro: End Changed Code

?>

<td align="center" class="smallText"> <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_edit.gif', IMAGE_UPDATE); ?></a>  <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_option&option_id=' . $options_values['products_options_id'] . '&' . $page_info, 'NONSSL') , '">'; ?><?php echo tep_image_button('button_delete.gif', IMAGE_DELETE); ?></a> </td>

<?php

}

?>

</tr>

<?php

$max_options_id_query = tep_db_query("select max(products_options_id) + 1 as next_id from " . TABLE_PRODUCTS_OPTIONS);

$max_options_id_values = tep_db_fetch_array($max_options_id_query);

$next_id = $max_options_id_values['next_id'];

}

?>

<tr>

<?php

//++++ QT Pro: Begin Changed code

?>

<td colspan="4"><?php echo tep_black_line(); ?></td>

<?php

//++++ QT Pro: End Changed Code

?>

</tr>

<?php

if ($action != 'update_option') {

?>

<tr class="<?php echo (floor($rows/2) == ($rows/2) ? 'attributes-even' : 'attributes-odd'); ?>">

<?php

echo '<form name="options" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=add_product_options&' . $page_info, 'NONSSL') . '" method="post"><input type="hidden" name="products_options_id" value="' . $next_id . '">';

$inputs = '';

for ($i = 0, $n = sizeof($languages); $i < $n; $i ++) {

$inputs .= $languages[$i]['code'] . ': <input type="text" name="option_name[' . $languages[$i]['id'] . ']" size="20"> <br>';

}

?>

<td align="center" class="smallText"> <?php echo $next_id; ?> </td>

<td class="smallText"><?php echo $inputs; ?></td>

<?php

//++++ QT Pro: Begin Changed code

?>

<td align="center" ><input type=checkbox name=track_stock></td>

<td align="left" class="smallText"> <?php echo tep_image_submit('button_insert.gif', IMAGE_INSERT); ?> </td>

<?php

//++++ QT Pro: End Changed Code

echo '</form>';

?>

</tr>

<tr>

<?php

//++++ QT Pro: Begin Changed code

?>

<td colspan="4"><?php echo tep_black_line(); ?></td>

<?php

//++++ QT Pro: End Changed Code

?>

</tr>

<?php

}

}

?>

</table></td>

<!-- options eof //-->

<td valign="top" width="50%"><table width="100%" border="0" cellspacing="0" cellpadding="2">

<!-- value //-->

<?php

if ($action == 'delete_option_value') { // delete product option value

$values = tep_db_query("select products_options_values_id, products_options_values_name from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$HTTP_GET_VARS['value_id'] . "' and language_id = '" . (int)$languages_id . "'");

$values_values = tep_db_fetch_array($values);

?>

<tr>

<td colspan="3" class="pageHeading"> <?php echo $values_values['products_options_values_name']; ?> </td>

</tr>

<tr>

<td><table border="0" width="100%" cellspacing="0" cellpadding="2">

<tr>

<td colspan="3"><?php echo tep_black_line(); ?></td>

</tr>

<?php

$products = tep_db_query("select p.products_id, pd.products_name, po.products_options_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_PRODUCTS_OPTIONS . " po, " . TABLE_PRODUCTS_DESCRIPTION . " pd where pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "' and po.language_id = '" . (int)$languages_id . "' and pa.products_id = p.products_id and pa.options_values_id='" . (int)$HTTP_GET_VARS['value_id'] . "' and po.products_options_id = pa.options_id order by pd.products_name");

if (tep_db_num_rows($products)) {

?>

<tr class="dataTableHeadingRow">

<td class="dataTableHeadingContent" align="center"> <?php echo TABLE_HEADING_ID; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_PRODUCT; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_OPT_NAME; ?> </td>

</tr>

<tr>

<td colspan="3"><?php echo tep_black_line(); ?></td>

</tr>

<?php

while ($products_values = tep_db_fetch_array($products)) {

$rows++;

?>

<tr class="<?php echo (floor($rows/2) == ($rows/2) ? 'attributes-even' : 'attributes-odd'); ?>">

<td align="center" class="smallText"> <?php echo $products_values['products_id']; ?> </td>

<td class="smallText"> <?php echo $products_values['products_name']; ?> </td>

<td class="smallText"> <?php echo $products_values['products_options_name']; ?> </td>

</tr>

<?php

}

?>

<tr>

<td colspan="3"><?php echo tep_black_line(); ?></td>

</tr>

<tr>

<td class="main" colspan="3"><br><?php echo TEXT_WARNING_OF_DELETE; ?></td>

</tr>

<tr>

<td class="main" align="right" colspan="3"><br><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', ' cancel '); ?></a> </td>

</tr>

<?php

} else {

?>

<tr>

<td class="main" colspan="3"><br><?php echo TEXT_OK_TO_DELETE; ?></td>

</tr>

<tr>

<td class="main" align="right" colspan="3"><br><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_value&value_id=' . $HTTP_GET_VARS['value_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_delete.gif', ' delete '); ?></a>   <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', ' cancel '); ?></a> </td>

</tr>

<?php

}

?>

</table></td>

</tr>

<?php

} else {

?>

<tr>

<td colspan="4" class="pageHeading"> <?php echo HEADING_TITLE_VAL; ?> </td>

</tr>

<tr>

<td colspan="4" class="smallText" align="right">

<?php

$values = "select pov.products_options_values_id, pov.products_options_values_name, pov2po.products_options_id from " . TABLE_PRODUCTS_OPTIONS_VALUES . " pov left join " . TABLE_PRODUCTS_OPTIONS_VALUES_TO_PRODUCTS_OPTIONS . " pov2po on pov.products_options_values_id = pov2po.products_options_values_id where pov.language_id = '" . (int)$languages_id . "' order by pov.products_options_values_id";

$values_split = new splitPageResults($value_page, MAX_ROW_LISTS_OPTIONS, $values, $values_query_numrows);

 

echo $values_split->display_links($values_query_numrows, MAX_ROW_LISTS_OPTIONS, MAX_DISPLAY_PAGE_LINKS, $value_page, 'option_page=' . $option_page . '&attribute_page=' . $attribute_page, 'value_page');

?>

</td>

</tr>

<tr>

<td colspan="4"><?php echo tep_black_line(); ?></td>

</tr>

<tr class="dataTableHeadingRow">

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_ID; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_OPT_NAME; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_OPT_VALUE; ?> </td>

<td class="dataTableHeadingContent" align="center"> <?php echo TABLE_HEADING_ACTION; ?> </td>

</tr>

<tr>

<td colspan="4"><?php echo tep_black_line(); ?></td>

</tr>

<?php

$next_id = 1;

$rows = 0;

$values = tep_db_query($values);

while ($values_values = tep_db_fetch_array($values)) {

$options_name = tep_options_name($values_values['products_options_id']);

$values_name = $values_values['products_options_values_name'];

$rows++;

?>

<tr class="<?php echo (floor($rows/2) == ($rows/2) ? 'attributes-even' : 'attributes-odd'); ?>">

<?php

if (($action == 'update_option_value') && ($HTTP_GET_VARS['value_id'] == $values_values['products_options_values_id'])) {

echo '<form name="values" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_value&' . $page_info, 'NONSSL') . '" method="post">';

$inputs = '';

for ($i = 0, $n = sizeof($languages); $i < $n; $i ++) {

$value_name = tep_db_query("select products_options_values_name from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where products_options_values_id = '" . (int)$values_values['products_options_values_id'] . "' and language_id = '" . (int)$languages[$i]['id'] . "'");

$value_name = tep_db_fetch_array($value_name);

$inputs .= $languages[$i]['code'] . ': <input type="text" name="value_name[' . $languages[$i]['id'] . ']" size="15" value="' . $value_name['products_options_values_name'] . '"> <br>';

}

?>

<td align="center" class="smallText"> <?php echo $values_values['products_options_values_id']; ?><input type="hidden" name="value_id" value="<?php echo $values_values['products_options_values_id']; ?>"> </td>

<td align="center" class="smallText"> <?php echo "\n"; ?><select name="option_id">

<?php

$options = tep_db_query("select products_options_id, products_options_name from " . TABLE_PRODUCTS_OPTIONS . " where language_id = '" . (int)$languages_id . "' order by products_options_name");

while ($options_values = tep_db_fetch_array($options)) {

echo "\n" . '<option name="' . $options_values['products_options_name'] . '" value="' . $options_values['products_options_id'] . '"';

if ($values_values['products_options_id'] == $options_values['products_options_id']) {

echo ' selected';

}

echo '>' . $options_values['products_options_name'] . '</option>';

}

?>

</select> </td>

<td class="smallText"><?php echo $inputs; ?></td>

<td align="center" class="smallText"> <?php echo tep_image_submit('button_update.gif', IMAGE_UPDATE); ?> <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', IMAGE_CANCEL); ?></a> </td>

<?php

echo '</form>';

} else {

?>

<td align="center" class="smallText"> <?php echo $values_values["products_options_values_id"]; ?> </td>

<td align="center" class="smallText"> <?php echo $options_name; ?> </td>

<td class="smallText"> <?php echo $values_name; ?> </td>

<td align="center" class="smallText"> <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_edit.gif', IMAGE_UPDATE); ?></a>  <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_option_value&value_id=' . $values_values['products_options_values_id'] . '&' . $page_info, 'NONSSL') , '">'; ?><?php echo tep_image_button('button_delete.gif', IMAGE_DELETE); ?></a> </td>

<?php

}

$max_values_id_query = tep_db_query("select max(products_options_values_id) + 1 as next_id from " . TABLE_PRODUCTS_OPTIONS_VALUES);

$max_values_id_values = tep_db_fetch_array($max_values_id_query);

$next_id = $max_values_id_values['next_id'];

}

?>

</tr>

<tr>

<td colspan="4"><?php echo tep_black_line(); ?></td>

</tr>

<?php

if ($action != 'update_option_value') {

?>

<tr class="<?php echo (floor($rows/2) == ($rows/2) ? 'attributes-even' : 'attributes-odd'); ?>">

<?php

echo '<form name="values" action="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=add_product_option_values&' . $page_info, 'NONSSL') . '" method="post">';

?>

<td align="center" class="smallText"> <?php echo $next_id; ?> </td>

<td align="center" class="smallText"> <select name="option_id">

<?php

$options = tep_db_query("select products_options_id, products_options_name from " . TABLE_PRODUCTS_OPTIONS . " where language_id = '" . $languages_id . "' order by products_options_name");

while ($options_values = tep_db_fetch_array($options)) {

echo '<option name="' . $options_values['products_options_name'] . '" value="' . $options_values['products_options_id'] . '">' . $options_values['products_options_name'] . '</option>';

}

 

$inputs = '';

for ($i = 0, $n = sizeof($languages); $i < $n; $i ++) {

$inputs .= $languages[$i]['code'] . ': <input type="text" name="value_name[' . $languages[$i]['id'] . ']" size="15"> <br>';

}

?>

</select> </td>

<td class="smallText"><input type="hidden" name="value_id" value="<?php echo $next_id; ?>"><?php echo $inputs; ?></td>

<td align="center" class="smallText"> <?php echo tep_image_submit('button_insert.gif', IMAGE_INSERT); ?> </td>

<?php

echo '</form>';

?>

</tr>

<tr>

<td colspan="4"><?php echo tep_black_line(); ?></td>

</tr>

<?php

}

}

?>

</table></td>

</tr>

</table></td>

<!-- option value eof //-->

</tr>

<!-- products_attributes //-->

<tr>

<td class="smallText"> </td>

</tr>

<tr>

<td width="100%"><table border="0" width="100%" cellspacing="0" cellpadding="0">

<tr>

<td class="pageHeading"> <?php echo HEADING_TITLE_ATRIB; ?> </td>

</tr>

</table></td>

</tr>

<tr>

<?php

if ($action == 'update_attribute') {

$form_action = 'update_product_attribute';

} else {

$form_action = 'add_product_attributes';

}

?>

<td><table border="0" width="100%" cellspacing="0" cellpadding="2">

<tr>

<td class="smallText" align="right">

<?php

$attributes = "select pa.* from " . TABLE_PRODUCTS_ATTRIBUTES . " pa left join " . TABLE_PRODUCTS_DESCRIPTION . " pd on pa.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' order by pd.products_name";

$attributes_split = new splitPageResults($attribute_page, MAX_ROW_LISTS_OPTIONS, $attributes, $attributes_query_numrows);

 

echo $attributes_split->display_links($attributes_query_numrows, MAX_ROW_LISTS_OPTIONS, MAX_DISPLAY_PAGE_LINKS, $attribute_page, 'option_page=' . $option_page . '&value_page=' . $value_page, 'attribute_page');

?>

</td>

</tr>

</table>

<form name="attributes" action="<?php echo tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=' . $form_action . '&' . $page_info); ?>" method="post"><table border="0" width="100%" cellspacing="0" cellpadding="2">

<tr>

<td colspan="7"><?php echo tep_black_line(); ?></td>

</tr>

<tr class="dataTableHeadingRow">

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_ID; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_PRODUCT; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_OPT_NAME; ?> </td>

<td class="dataTableHeadingContent"> <?php echo TABLE_HEADING_OPT_VALUE; ?> </td>

<td class="dataTableHeadingContent" align="right"> <?php echo TABLE_HEADING_OPT_PRICE; ?> </td>

<td class="dataTableHeadingContent" align="center"> <?php echo TABLE_HEADING_OPT_PRICE_PREFIX; ?> </td>

<td class="dataTableHeadingContent" align="center"> <?php echo TABLE_HEADING_ACTION; ?> </td>

</tr>

<tr>

<td colspan="7"><?php echo tep_black_line(); ?></td>

</tr>

<?php

$next_id = 1;

$attributes = tep_db_query($attributes);

while ($attributes_values = tep_db_fetch_array($attributes)) {

$products_name_only = tep_get_products_name($attributes_values['products_id']);

$options_name = tep_options_name($attributes_values['options_id']);

$values_name = tep_values_name($attributes_values['options_values_id']);

$rows++;

?>

<tr class="<?php echo (floor($rows/2) == ($rows/2) ? 'attributes-even' : 'attributes-odd'); ?>">

<?php

if (($action == 'update_attribute') && ($HTTP_GET_VARS['attribute_id'] == $attributes_values['products_attributes_id'])) {

?>

<td class="smallText"> <?php echo $attributes_values['products_attributes_id']; ?><input type="hidden" name="attribute_id" value="<?php echo $attributes_values['products_attributes_id']; ?>"> </td>

<td class="smallText"> <select name="products_id">

<?php

$products = tep_db_query("select p.products_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where pd.products_id = p.products_id and pd.language_id = '" . $languages_id . "' order by pd.products_name");

while($products_values = tep_db_fetch_array($products)) {

if ($attributes_values['products_id'] == $products_values['products_id']) {

echo "\n" . '<option name="' . $products_values['products_name'] . '" value="' . $products_values['products_id'] . '" SELECTED>' . $products_values['products_name'] . '</option>';

} else {

echo "\n" . '<option name="' . $products_values['products_name'] . '" value="' . $products_values['products_id'] . '">' . $products_values['products_name'] . '</option>';

}

}

?>

</select> </td>

<td class="smallText"> <select name="options_id">

<?php

$options = tep_db_query("select * from " . TABLE_PRODUCTS_OPTIONS . " where language_id = '" . $languages_id . "' order by products_options_name");

while($options_values = tep_db_fetch_array($options)) {

if ($attributes_values['options_id'] == $options_values['products_options_id']) {

echo "\n" . '<option name="' . $options_values['products_options_name'] . '" value="' . $options_values['products_options_id'] . '" SELECTED>' . $options_values['products_options_name'] . '</option>';

} else {

echo "\n" . '<option name="' . $options_values['products_options_name'] . '" value="' . $options_values['products_options_id'] . '">' . $options_values['products_options_name'] . '</option>';

}

}

?>

</select> </td>

<td class="smallText"> <select name="values_id">

<?php

$values = tep_db_query("select * from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where language_id ='" . $languages_id . "' order by products_options_values_name");

while($values_values = tep_db_fetch_array($values)) {

if ($attributes_values['options_values_id'] == $values_values['products_options_values_id']) {

echo "\n" . '<option name="' . $values_values['products_options_values_name'] . '" value="' . $values_values['products_options_values_id'] . '" SELECTED>' . $values_values['products_options_values_name'] . '</option>';

} else {

echo "\n" . '<option name="' . $values_values['products_options_values_name'] . '" value="' . $values_values['products_options_values_id'] . '">' . $values_values['products_options_values_name'] . '</option>';

}

}

?>

</select> </td>

<td align="right" class="smallText"> <input type="text" name="value_price" value="<?php echo $attributes_values['options_values_price']; ?>" size="6"> </td>

<td align="center" class="smallText"> <input type="text" name="price_prefix" value="<?php echo $attributes_values['price_prefix']; ?>" size="2"> </td>

<td align="center" class="smallText"> <?php echo tep_image_submit('button_update.gif', IMAGE_UPDATE); ?> <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', IMAGE_CANCEL); ?></a> </td>

<?php

if (DOWNLOAD_ENABLED == 'true') {

$download_query_raw ="select products_attributes_filename, products_attributes_maxdays, products_attributes_maxcount

from " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . "

where products_attributes_id='" . $attributes_values['products_attributes_id'] . "'";

$download_query = tep_db_query($download_query_raw);

if (tep_db_num_rows($download_query) > 0) {

$download = tep_db_fetch_array($download_query);

$products_attributes_filename = $download['products_attributes_filename'];

$products_attributes_maxdays = $download['products_attributes_maxdays'];

$products_attributes_maxcount = $download['products_attributes_maxcount'];

}

?>

<tr class="<?php echo (!($rows % 2)? 'attributes-even' : 'attributes-odd');?>">

<td> </td>

<td colspan="5">

<table>

<tr class="<?php echo (!($rows % 2)? 'attributes-even' : 'attributes-odd');?>">

<td class="dataTableHeadingContent"><?php echo TABLE_HEADING_DOWNLOAD; ?> </td>

<td class="smallText"><?php echo TABLE_TEXT_FILENAME; ?></td>

<td class="smallText"><?php echo tep_draw_input_field('products_attributes_filename', $products_attributes_filename, 'size="15"'); ?> </td>

<td class="smallText"><?php echo TABLE_TEXT_MAX_DAYS; ?></td>

<td class="smallText"><?php echo tep_draw_input_field('products_attributes_maxdays', $products_attributes_maxdays, 'size="5"'); ?> </td>

<td class="smallText"><?php echo TABLE_TEXT_MAX_COUNT; ?></td>

<td class="smallText"><?php echo tep_draw_input_field('products_attributes_maxcount', $products_attributes_maxcount, 'size="5"'); ?> </td>

</tr>

</table>

</td>

<td> </td>

</tr>

<?php

}

?>

<?php

} elseif (($action == 'delete_product_attribute') && ($HTTP_GET_VARS['attribute_id'] == $attributes_values['products_attributes_id'])) {

?>

<td class="smallText"> <b><?php echo $attributes_values["products_attributes_id"]; ?></b> </td>

<td class="smallText"> <b><?php echo $products_name_only; ?></b> </td>

<td class="smallText"> <b><?php echo $options_name; ?></b> </td>

<td class="smallText"> <b><?php echo $values_name; ?></b> </td>

<td align="right" class="smallText"> <b><?php echo $attributes_values["options_values_price"]; ?></b> </td>

<td align="center" class="smallText"> <b><?php echo $attributes_values["price_prefix"]; ?></b> </td>

<td align="center" class="smallText"> <b><?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_attribute&attribute_id=' . $HTTP_GET_VARS['attribute_id'] . '&' . $page_info) . '">'; ?><?php echo tep_image_button('button_confirm.gif', IMAGE_CONFIRM); ?></a>  <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_cancel.gif', IMAGE_CANCEL); ?></a> </b></td>

<?php

} else {

?>

<td class="smallText"> <?php echo $attributes_values["products_attributes_id"]; ?> </td>

<td class="smallText"> <?php echo $products_name_only; ?> </td>

<td class="smallText"> <?php echo $options_name; ?> </td>

<td class="smallText"> <?php echo $values_name; ?> </td>

<td align="right" class="smallText"> <?php echo $attributes_values["options_values_price"]; ?> </td>

<td align="center" class="smallText"> <?php echo $attributes_values["price_prefix"]; ?> </td>

<td align="center" class="smallText"> <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=update_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info, 'NONSSL') . '">'; ?><?php echo tep_image_button('button_edit.gif', IMAGE_UPDATE); ?></a>  <?php echo '<a href="' . tep_href_link(FILENAME_PRODUCTS_ATTRIBUTES, 'action=delete_product_attribute&attribute_id=' . $attributes_values['products_attributes_id'] . '&' . $page_info, 'NONSSL') , '">'; ?><?php echo tep_image_button('button_delete.gif', IMAGE_DELETE); ?></a> </td>

<?php

}

$max_attributes_id_query = tep_db_query("select max(products_attributes_id) + 1 as next_id from " . TABLE_PRODUCTS_ATTRIBUTES);

$max_attributes_id_values = tep_db_fetch_array($max_attributes_id_query);

$next_id = $max_attributes_id_values['next_id'];

?>

</tr>

<?php

}

if ($action != 'update_attribute') {

?>

<tr>

<td colspan="7"><?php echo tep_black_line(); ?></td>

</tr>

<tr class="<?php echo (floor($rows/2) == ($rows/2) ? 'attributes-even' : 'attributes-odd'); ?>">

<td class="smallText"> <?php echo $next_id; ?> </td>

<td class="smallText"> <select name="products_id">

<?php

$products = tep_db_query("select p.products_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where pd.products_id = p.products_id and pd.language_id = '" . $languages_id . "' order by pd.products_name");

while ($products_values = tep_db_fetch_array($products)) {

echo '<option name="' . $products_values['products_name'] . '" value="' . $products_values['products_id'] . '">' . $products_values['products_name'] . '</option>';

}

?>

</select> </td>

<td class="smallText"> <select name="options_id">

<?php

$options = tep_db_query("select * from " . TABLE_PRODUCTS_OPTIONS . " where language_id = '" . $languages_id . "' order by products_options_name");

while ($options_values = tep_db_fetch_array($options)) {

echo '<option name="' . $options_values['products_options_name'] . '" value="' . $options_values['products_options_id'] . '">' . $options_values['products_options_name'] . '</option>';

}

?>

</select> </td>

<td class="smallText"> <select name="values_id">

<?php

$values = tep_db_query("select * from " . TABLE_PRODUCTS_OPTIONS_VALUES . " where language_id = '" . $languages_id . "' order by products_options_values_name");

while ($values_values = tep_db_fetch_array($values)) {

echo '<option name="' . $values_values['products_options_values_name'] . '" value="' . $values_values['products_options_values_id'] . '">' . $values_values['products_options_values_name'] . '</option>';

}

?>

</select> </td>

<td align="right" class="smallText"> <input type="text" name="value_price" size="6"> </td>

<td align="right" class="smallText"> <input type="text" name="price_prefix" size="2" value="+"> </td>

<td align="center" class="smallText"> <?php echo tep_image_submit('button_insert.gif', IMAGE_INSERT); ?> </td>

</tr>

<?php

if (DOWNLOAD_ENABLED == 'true') {

$products_attributes_maxdays = DOWNLOAD_MAX_DAYS;

$products_attributes_maxcount = DOWNLOAD_MAX_COUNT;

?>

<tr class="<?php echo (!($rows % 2)? 'attributes-even' : 'attributes-odd');?>">

<td> </td>

<td colspan="5">

<table>

<tr class="<?php echo (!($rows % 2)? 'attributes-even' : 'attributes-odd');?>">

<td class="dataTableHeadingContent"><?php echo TABLE_HEADING_DOWNLOAD; ?> </td>

<td class="smallText"><?php echo TABLE_TEXT_FILENAME; ?></td>

<td class="smallText"><?php echo tep_draw_input_field('products_attributes_filename', $products_attributes_filename, 'size="15"'); ?> </td>

<td class="smallText"><?php echo TABLE_TEXT_MAX_DAYS; ?></td>

<td class="smallText"><?php echo tep_draw_input_field('products_attributes_maxdays', $products_attributes_maxdays, 'size="5"'); ?> </td>

<td class="smallText"><?php echo TABLE_TEXT_MAX_COUNT; ?></td>

<td class="smallText"><?php echo tep_draw_input_field('products_attributes_maxcount', $products_attributes_maxcount, 'size="5"'); ?> </td>

</tr>

</table>

</td>

<td> </td>

</tr>

<?php

} // end of DOWNLOAD_ENABLED section

?>

<?php

}

?>

<tr>

<td colspan="7"><?php echo tep_black_line(); ?></td>

</tr>

</table></form></td>

</tr>

</table></td>

<!-- products_attributes_eof //-->

</tr>

</table>

<!-- body_text_eof //-->

<!-- footer //-->

<?php require(DIR_WS_INCLUDES . 'footer.php'); ?>

<!-- footer_eof //-->

</body>

</html>

<?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>

Link to comment
Share on other sites

Hello isabellaspassion,

 

This is just a quick idea here, have you checked your database to see if that column in fact exists? It would seem that the program can not find it when it goes to insert the new option. Use phpmyadmin if you have it and double check to see that you installed the sql queries that qtpro supplied as part of the install process.

 

Let us know how that goes.

 

Rhawke

Link to comment
Share on other sites

Hello isabellaspassion,

 

This is just a quick idea here, have you checked your database to see if that column in fact exists? It would seem that the program can not find it when it goes to insert the new option. Use phpmyadmin if you have it and double check to see that you installed the sql queries that qtpro supplied as part of the install process.

 

Let us know how that goes.

 

Rhawke

 

 

Hi Rhawke,

 

Thank you so much! Yes I didn't have it in the database.... so now it is working fine except in Admin/ Configuration there is no option for PROD INFO (QTPro). This option doesn't exist.

I am presently looking to see if I missed anything but as yet using 'Beyond Compare' I can't find any files or code missing so don't understand why it

does not show this option

Without the option I can't turn on the 'Sequenced Dropdowns' plugin

 

Any thoughts?

Link to comment
Share on other sites

Hi Rhawke,

 

Thank you so much! Yes I didn't have it in the database.... so now it is working fine except in Admin/ Configuration there is no option for PROD INFO (QTPro). This option doesn't exist.

I am presently looking to see if I missed anything but as yet using 'Beyond Compare' I can't find any files or code missing so don't understand why it

does not show this option

Without the option I can't turn on the 'Sequenced Dropdowns' plugin

 

Any thoughts?

 

isabellaspassion,

 

Ok, I think I have an idea on what happened here as well that is keeping you from seeing the PROD INFO (QTPro) in admin. There is also another SQL file provided in the files you need to install QTPRO. This file inserts a bunch of values into the configuration table you need in order to operate QTPRO from the admin. The file you need is called config.sql and you use it the same way you did the last one.

 

I hope that solves your troubles and good luck!

Link to comment
Share on other sites

isabellaspassion,

 

Ok, I think I have an idea on what happened here as well that is keeping you from seeing the PROD INFO (QTPro) in admin. There is also another SQL file provided in the files you need to install QTPRO. This file inserts a bunch of values into the configuration table you need in order to operate QTPRO from the admin. The file you need is called config.sql and you use it the same way you did the last one.

 

I hope that solves your troubles and good luck!

 

 

Hi mate,

I found it and installed it and guess what? It worked!!!

Thank you so much... I have now loaded 'easy populate' and am having a play to see the best way to enter like 5,000 different products with about 50 different attributes. (different sizes and different colors)..any thoughts?

 

I plan to get the base system working how I need then start entering all the data...

As a newbie, the program OSC seems excellent and all the add ons are like me in a kid in a candy shop....do I need this and then I want this...

 

I still plan on customising it to add customer birthdays, wishlist, free gift etc but do you seem to have problems when you add more and more on? where do you stop?

 

Where in the world are you? me..australia

 

Anyways, kind regards, people like you make a smile on newbies like me :)

Link to comment
Share on other sites

Hi mate,

I found it and installed it and guess what? It worked!!!

Thank you so much... I have now loaded 'easy populate' and am having a play to see the best way to enter like 5,000 different products with about 50 different attributes. (different sizes and different colors)..any thoughts?

 

I plan to get the base system working how I need then start entering all the data...

As a newbie, the program OSC seems excellent and all the add ons are like me in a kid in a candy shop....do I need this and then I want this...

 

I still plan on customising it to add customer birthdays, wishlist, free gift etc but do you seem to have problems when you add more and more on? where do you stop?

 

Where in the world are you? me..australia

 

Anyways, kind regards, people like you make a smile on newbies like me :)

 

Honestly, I have a site I use for my testing grounds that I plan on redesigning completely here soon and opening up for business again. I quit working on it and running it for a long time while I completed my degree in database design and C#/programming. It has well over 7000 products, all of which I can change fairly easily using csv files and phpmyadmin. Now I am a full time web developer and I specialize in developing highly customized oscommerce and similar type sites. I just started my business but I am already getting a lot of work and requests for the same.

 

I also use easy populate, it is good for loading the products into the system, but seriously as far as attributes go, my suggestion is to spend some time getting to know MySql and phpmyadmin, and simply open the attributes tables involved, and use the export feature of phpmyadmin to download a csv file with the tables laid out and use that file to enter in all your attributes and stuff. it is a bit more difficult at first because here you are using the database product id numbers and attribute numbers instead of names (unless you create custom database views), but in the end if you want to maintain a very up to date website this is my version(opinion) of the best bet.

 

As far as where do you stop.... I don't believe in limitations, however I think the line should be drawn when you start to sacrifice your customers ability to use the site quickly and easily by over complicating their lives with gadgets and gizmos that you haven't proven they need by asking first and that you haven't proven are truly going to increase your bottom line. just because you think it will be "cool" doesn't make it the right thing to do.

 

By the way, I'm a Canadian.. you know those cute huggable chubby guys that drink a lot of beer and say eh? Guilty!

 

Rhawke

Link to comment
Share on other sites

Honestly, I have a site I use for my testing grounds that I plan on redesigning completely here soon and opening up for business again. I quit working on it and running it for a long time while I completed my degree in database design and C#/programming. It has well over 7000 products, all of which I can change fairly easily using csv files and phpmyadmin. Now I am a full time web developer and I specialize in developing highly customized oscommerce and similar type sites. I just started my business but I am already getting a lot of work and requests for the same.

 

I also use easy populate, it is good for loading the products into the system, but seriously as far as attributes go, my suggestion is to spend some time getting to know MySql and phpmyadmin, and simply open the attributes tables involved, and use the export feature of phpmyadmin to download a csv file with the tables laid out and use that file to enter in all your attributes and stuff. it is a bit more difficult at first because here you are using the database product id numbers and attribute numbers instead of names (unless you create custom database views), but in the end if you want to maintain a very up to date website this is my version(opinion) of the best bet.

 

As far as where do you stop.... I don't believe in limitations, however I think the line should be drawn when you start to sacrifice your customers ability to use the site quickly and easily by over complicating their lives with gadgets and gizmos that you haven't proven they need by asking first and that you haven't proven are truly going to increase your bottom line. just because you think it will be "cool" doesn't make it the right thing to do.

 

By the way, I'm a Canadian.. you know those cute huggable chubby guys that drink a lot of beer and say eh? Guilty!

 

Rhawke

 

Hey Rhawke or should I say eh?

 

I know, I have a Canadian working for me and sometimes I find myself picking up on the accent... soon I will be eating pucks for lunch!

Thanks for your comments, there seems to be a lot to learn but am still having fun.....maybe that will change in a day or so. I run a couple stores out here and finally got some time together to set up a web site for the masses, hopefully :)

 

I am plugging away looking at what I need to get it running and with the add ons to enable it to look the way I want and with the functionality that the customers demand. Still have the payment area to look at, overall look and feel (colors, boxes etc) but am trying to prioritize everything.

 

I do have a question regarding another addon.

I loaded the addon 'customer birthday reminder' on my new oscommerce site but the problem is that I need to modify the code in admin/index.php

But the code is not there to modify so I am maybe thinking the addon is old and the code has been moved...

I am using v2.2rc2a

 

The code I need to add is as follows

 

array('title' => BOX_CUSTOMERS_ORDERS, 'link' =>tep_href_link(FILENAMES_ORDERS,'selected_box=customers')),

array('title' => BOX_CUSTOMERS_BIRTHDAY, 'link' =>tep_href_link(FILENAMES_BIRTHDAY,'selected_box=customers')))),

 

So in my limited knowledge I am guesing the code is trying to add a field to the admin/ customer on the left called 'birthdays' but the index site no longer has that info....

 

Any ideas? No need to answer (don't feel obligated) as you have already been a huge help and are probably busy with your business, talking about that, need a new client? Anyways, have a Molson for me and I'll have a Fosters! (actually we don't drink fosters out here, mainly XXXX :) )

 

Thanks in advance!!

marcel

Link to comment
Share on other sites

Hey Rhawke or should I say eh?

 

I know, I have a Canadian working for me and sometimes I find myself picking up on the accent... soon I will be eating pucks for lunch!

Thanks for your comments, there seems to be a lot to learn but am still having fun.....maybe that will change in a day or so. I run a couple stores out here and finally got some time together to set up a web site for the masses, hopefully :)

 

I am plugging away looking at what I need to get it running and with the add ons to enable it to look the way I want and with the functionality that the customers demand. Still have the payment area to look at, overall look and feel (colors, boxes etc) but am trying to prioritize everything.

 

I do have a question regarding another addon.

I loaded the addon 'customer birthday reminder' on my new oscommerce site but the problem is that I need to modify the code in admin/index.php

But the code is not there to modify so I am maybe thinking the addon is old and the code has been moved...

I am using v2.2rc2a

 

The code I need to add is as follows

 

array('title' => BOX_CUSTOMERS_ORDERS, 'link' =>tep_href_link(FILENAMES_ORDERS,'selected_box=customers')),

array('title' => BOX_CUSTOMERS_BIRTHDAY, 'link' =>tep_href_link(FILENAMES_BIRTHDAY,'selected_box=customers')))),

 

So in my limited knowledge I am guesing the code is trying to add a field to the admin/ customer on the left called 'birthdays' but the index site no longer has that info....

 

Any ideas? No need to answer (don't feel obligated) as you have already been a huge help and are probably busy with your business, talking about that, need a new client? Anyways, have a Molson for me and I'll have a Fosters! (actually we don't drink fosters out here, mainly XXXX :) )

 

Thanks in advance!!

marcel

 

Marcel,

 

In answer to the birthdays contribution, I am assuming that this is the birthday contribution located here http://www.oscommerce.com/community/contributions,2547. If it is the same contribution it will need some overhaul to make it work on the new oscommerce snapshot.

 

As far as clients are concerned I am always interested in new work and projects. Feel free to pm me if you have a request or need anything at all. And I'll see what I can do to help.

 

Good luck,

 

Rhawke

Link to comment
Share on other sites

I have QTPro installed 4.3b (OScommerce RC1) and working, but when I have a product in specials, the dropdown box will show the prices without discount. When I add the product to my cart, the pricing is OK, so with the discount. I have searched this thread, but did not see the problem.

 

Gina

Link to comment
Share on other sites

Till now I did not find a discount contri that works with product attributes. Therefore I work with customer_discount_v1.3 and special prices for the products without attributes.

Now I working on Qtpro to make the stock in productinfo visibale on attribute level

Link to comment
Share on other sites

Out of stock messages seem to have a problem being able to handle HTML (and special characters for foreign language characters).

 

Is there something about the way the out_of_stock language text is called up from the language files in product_info.php that makes it behave differently than all the other language data?

Link to comment
Share on other sites

$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();

 

That is the code that pulls up the attributes and appropriate text from the language file.

 

define('TEXT_PRODUCT_NOT_FOUND', 'No encontrado!');
define('TEXT_CURRENT_REVIEWS', 'Comentarios:');
define('TEXT_MORE_INFORMATION', 'Para obtener más información, visite la <a href="%s" target="_blank"><u>página</u></a> del producto.');
define('TEXT_DATE_ADDED', 'Este producto esta en nuestro catálogo desde %s.');
define('TEXT_DATE_AVAILABLE', '<font color="#ff0000">Este producto estará disponible el %s.</font>');
define('TEXT_ALSO_PURCHASED_PRODUCTS', 'Clientes que compraron este producto, también han comprado');
define('TEXT_PRODUCT_OPTIONS', 'Opciones:');
define('TEXT_CLICK_TO_ENLARGE', 'Haga Click para agrandar');
define('TEXT_PRODUCT_AVAILABILITY', 'la disponibilidad de los productos');
define('TEXT_PRODUCT_AVAILABLE', 'Actualmente en la reserva');
define('TEXT_PRODUCT_OPTIONS', 'Available Options:');
define('TEXT_ENTER_QUANTITY', 'Quantity:');
//++++ Pro QT: Begin cambiado el código
define ('TEXT_OUT_OF_STOCK', 'Fuera de stock');
define ('TEXT_OUT_OF_STOCK_MESSAGE', 'La combinación de opciones que ha seleccionado actualmente no está en existencia. Por favor, seleccione otra combinación.');
define ('TEXT_SELECT_OPTIONS', 'Debe seleccionar las opciones de los productos antes de añadir este producto a su carrito de compras.');
//++++ Pro QT: Fin cambiado Código
define ('TEXT_ENTER_QUANTITY', 'Cantidad:');

 

That is my text. The TEXT_OUT_OF_STOCK_MESSAGE is the one that is breaking when it hits the "La combinación". I've tried it with both unicode text and the HTML equivalent. Something about that specific variable isn't adhering to HTML. :(

Link to comment
Share on other sites

$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();

 

That is the code that pulls up the attributes and appropriate text from the language file.

 

define('TEXT_PRODUCT_NOT_FOUND', 'No encontrado!');
define('TEXT_CURRENT_REVIEWS', 'Comentarios:');
define('TEXT_MORE_INFORMATION', 'Para obtener más información, visite la <a href="%s" target="_blank"><u>página</u></a> del producto.');
define('TEXT_DATE_ADDED', 'Este producto esta en nuestro catálogo desde %s.');
define('TEXT_DATE_AVAILABLE', '<font color="#ff0000">Este producto estará disponible el %s.</font>');
define('TEXT_ALSO_PURCHASED_PRODUCTS', 'Clientes que compraron este producto, también han comprado');
define('TEXT_PRODUCT_OPTIONS', 'Opciones:');
define('TEXT_CLICK_TO_ENLARGE', 'Haga Click para agrandar');
define('TEXT_PRODUCT_AVAILABILITY', 'la disponibilidad de los productos');
define('TEXT_PRODUCT_AVAILABLE', 'Actualmente en la reserva');
define('TEXT_PRODUCT_OPTIONS', 'Available Options:');
define('TEXT_ENTER_QUANTITY', 'Quantity:');
//++++ Pro QT: Begin cambiado el código
define ('TEXT_OUT_OF_STOCK', 'Fuera de stock');
define ('TEXT_OUT_OF_STOCK_MESSAGE', 'La combinación de opciones que ha seleccionado actualmente no está en existencia. Por favor, seleccione otra combinación.');
define ('TEXT_SELECT_OPTIONS', 'Debe seleccionar las opciones de los productos antes de añadir este producto a su carrito de compras.');
//++++ Pro QT: Fin cambiado Código
define ('TEXT_ENTER_QUANTITY', 'Cantidad:');

 

That is my text. The TEXT_OUT_OF_STOCK_MESSAGE is the one that is breaking when it hits the "La combinación". I've tried it with both unicode text and the HTML equivalent. Something about that specific variable isn't adhering to HTML. :(

 

 

Just do a test and see if it goes past the TEXT_OUT_OF_STOCK_MESSAGE after replacing the following in your language file

 

ó = á

á = Ó

 

define ('TEXT_OUT_OF_STOCK_MESSAGE', 'La combinacián de opciones que ha seleccionado actualmente no estÓ en existencia. Por favor, seleccione otra combinacián.');

Link to comment
Share on other sites

Even the author of the contribution is using the following text in the language file for Swedish:

 

define('TEXT_OUT_OF_STOCK_MESSAGE', 'Den kombination av alternativ du valt är slut på lagret. Välj en annan kombination, tack.');

 

Regardless, I've tried with both unicode, like above, and HTML, like you've suggested, and I get the same results. Something about how it's spitting out that text is ignoring HTML.

 

I just now thought about doing a "view source" to see HOW it was displaying my text, and I was quite amazed to see that it was actually being displayed through JavaScript. See below:

 

<script LANGUAGE="JavaScript"><!--
 function chkstk(frm) {
var stk={};
var instk=false;
if (stk[frm['id[1]'].value]) instk=true;
 return instk;
 }
 function stkmsg(frm) {
var instk=chkstk(frm);
var span=document.getElementById("oosmsg");
while (span.childNodes[0])
  span.removeChild(span.childNodes[0]);
if (!instk)
  span.appendChild(document.createTextNode("La combinación de las opciones que ha seleccionado actualmente no está en existencia. Por favor, seleccione otra combinación."));
else
  span.appendChild(document.createTextNode(" "));
 }
 stkmsg(document.cart_quantity);
 function chksel() {
var instk=chkstk(document.cart_quantity);
if (!instk) alert('La combinación de las opciones que ha seleccionado actualmente no está en existencia. Por favor, seleccione otra combinación.');
return instk;
 }
 document.cart_quantity.onsubmit=chksel;
//--></SCRIPT>

 

How do I get my HTML to work in that?

Edited by pfilias
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...