Gratis Downloadpaket, Quelle & Dank: Estelco . d e - Modul Attributmatrix
Einsatz:
Shop Textil Großhandel
Anforderung:
Matrix zur Übernahme mehrerer Attribute eines Artikels in merheren Ausführungen in den Warenkorb
Version Shopsoftware:
Aktuell in 1.06 Beta 4 eingebaut
<<-- BACKUP MACHEN -->>
Datenbank erweitern
CREATE TABLE `products_attributes_matrix`
( `products_id` int
(11) NOT
NULL, `matrix1` int
(11) NOT
NULL, `matrix2` int
(11) NOT
NULL, `quantity` int
(11) NOT
NULL, PRIMARY
KEY (`products_id`
,`matrix1`
,`matrix2`
)) ENGINE
=MyISAM
;ALTER TABLE `products` ADD `products_matrix1` INT
(11) NOT
NULL ;ALTER TABLE `products` ADD `products_matrix2` INT
(11) NOT
NULL ;ALTER TABLE `admin_access` ADD `new_attributes_matrix` INT
(1) NOT
NULL;UPDATE `admin_access` SET `new_attributes_matrix`
= 1 WHERE `customers_id`
= 1;Aus dem Downloadpaket die Ordner [admin] [inc] [lang] auf den Server kopieren
Aus dem Downloadpaket [templates/xtc4/module] in das eigene Template kopiren (xtc5?)
Jetzt noch folgende bereits vorhandene Dateien anpassen:
admin/includes/application_top.php
ca. Zeile 136
define('FILENAME_NEW_ATTRIBUTES','new_attributes.php');danach einfügen
define('FILENAME_NEW_ATTRIBUTES_MATRIX','new_attributes_matrix.php'); admin/includes/column_left.php
ca. Zeile 59
if (($_SESSION['customers_status']['customers_status_id'] == '0') && ($admin_access['new_attributes'] == '1')) echo '<li><a href="' . xtc_href_link(FILENAME_NEW_ATTRIBUTES, '', 'NONSSL') . '" class="menuBoxContentLink"> -'.BOX_ATTRIBUTES_MANAGER.'</a></li>';
danach einfügen
if (($_SESSION['customers_status']['customers_status_id'] == '0') && ($admin_access['new_attributes_matrix'] == '1')) echo '<li><a href="' . xtc_href_link(FILENAME_NEW_ATTRIBUTES_MATRIX, '', 'NONSSL') . '" class="menuBoxContentLink"> -'.BOX_ATTRIBUTES_MATRIX.'</a><li>';
checkout_process.php
ca. Zeile 275
$stock_query_raw = "-- /checkout_process.php
SELECT products_quantity,
ersetzen durch
$stock_query_raw = "-- /checkout_process.php
SELECT products_quantity, products_matrix1, products_matrix2,
ca. Zeile 290
$stock_query = xtc_db_query(" -- /checkout_process.php
SELECT products_quantity
ersetzen durch
$stock_query = xtc_db_query(" -- /checkout_process.php
SELECT products_quantity, products_matrix1, products_matrix2,
ca. Zeile 304
xtc_db_query("UPDATE ".TABLE_PRODUCTS."
SET products_quantity = '".$stock_left."'
WHERE products_id = '".xtc_get_prid($order->products[$i]['id'])."'");
if (($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false')) {
xtc_db_query("UPDATE ".TABLE_PRODUCTS."
SET products_status = '0'
WHERE products_id = '".xtc_get_prid($order->products[$i]['id'])."'");
ersetzen mit
if ($stock_values['products_matrix1'] > 0 && $stock_values['products_matrix2'] > 0) {
$products_attributes = $order->products[$i]['attributes'];
xtc_db_query("
UPDATE " . TABLE_PRODUCTS_ATTRIBUTES_MATRIX . "
SET quantity=quantity-". $order->products[$i]['qty'] . "
WHERE products_id=" . xtc_get_prid($order->products[$i]['id']) . "
AND (matrix1=" . $products_attributes[0]['value_id'] . " AND matrix2=" . $products_attributes[1]['value_id'] . ")
OR (matrix1=" . $products_attributes[1]['value_id'] . " AND matrix2=" . $products_attributes[0]['value_id'] . ")
");
} else {
xtc_db_query("update ".TABLE_PRODUCTS." set products_quantity = '".$stock_left."' where products_id = '".xtc_get_prid($order->products[$i]['id'])."'");
if (($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false')) {
xtc_db_query("update ".TABLE_PRODUCTS." set products_status = '0' where products_id = '".xtc_get_prid($order->products[$i]['id'])."'");
}
includes/cart_actions.php
ca. Zeile 99
case 'add_product': if (isset ($_POST['products_id']) && is_numeric($_POST['products_id'])) { $cart_quantity = (xtc_remove_non_numeric
($_POST['products_qty']) + $_SESSION['cart']->get_quantity(xtc_get_uprid
($_POST['products_id'], isset($_POST['id'])?
$_POST['id']:''))); if ($cart_quantity > MAX_PRODUCTS_QTY
) { $cart_quantity = MAX_PRODUCTS_QTY
; } if (isset($econda) && is_object($econda)) { $econda->_emptyCart
(); $old_quantity = $_SESSION['cart']->get_quantity(xtc_get_uprid
($_POST['products_id'], isset($_POST['id'])?
$_POST['id']:'')); $econda->_addProduct
($_POST['products_id'], $cart_quantity, $old_quantity); } $_SESSION['cart']->add_cart((int
)$_POST['products_id'], $cart_quantity, isset($_POST['id'])?
$_POST['id']:''); //DokuMan - 2012-06-11 - added isset-check for $_POST['id'] } xtc_redirect
(xtc_href_link
($goto, 'products_id=' . (int
)$_POST['products_id'] . '&' . xtc_get_all_get_params
($parameters))); break;ersetzen mit
case 'add_product' : if ($_POST['matrix'] == 1) { if (isset ($_POST['products_id']) && is_numeric($_POST['products_id'])) { $values = $_POST; unset($values['x']); unset($values['y']); unset($values['matrix']); unset($values['products_id']); foreach ($values as $key => $value) { if ($value > 0) { $ids = explode("-", $key); $id[$ids[1]] = $ids[0]; $id[$ids[3]] = $ids[2]; if ($value > MAX_PRODUCTS_QTY
) $value = MAX_PRODUCTS_QTY
; if (is_object($econda)) { $econda->_emptyCart
(); $old_quantity = $_SESSION['cart']->get_quantity(xtc_get_uprid
($_POST['products_id'], $_POST['id'])); $econda->_addProduct
($_POST['products_id'], $value, $old_quantity); } $_SESSION['cart']->add_cart((int
) $_POST['products_id'], $_SESSION['cart']->get_quantity(xtc_get_uprid
($_POST['products_id'], $id)) + xtc_remove_non_numeric
($value), $id); } } } } else { if (isset ($_POST['products_id']) && is_numeric($_POST['products_id'])) { if ($_POST['products_qty'] > MAX_PRODUCTS_QTY
) $_POST['products_qty'] = MAX_PRODUCTS_QTY
; if (is_object($econda)) { $econda->_emptyCart
(); $old_quantity = $_SESSION['cart']->get_quantity(xtc_get_uprid
($_POST['products_id'], $_POST['id'])); $econda->_addProduct
($_POST['products_id'], $_POST['products_qty'], $old_quantity); } $_SESSION['cart']->add_cart((int
) $_POST['products_id'], $_SESSION['cart']->get_quantity(xtc_get_uprid
($_POST['products_id'], $_POST['id'])) + xtc_remove_non_numeric
($_POST['products_qty']), $_POST['id']); } } xtc_redirect
(xtc_href_link
($goto, 'products_id='.(int
) $_POST['products_id'].'&'.xtc_get_all_get_params
($parameters))); break; includes/database_tables.php
ca. Zeile 78
define('TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD', 'products_attributes_download');danach einfügen
define('TABLE_PRODUCTS_ATTRIBUTES_MATRIX', 'products_attributes_matrix'); includes/modules/order_details_cart.php
ca. Zeile 38
require_once (DIR_FS_INC.'xtc_check_stock.inc.php');
danach einfügen
require_once (DIR_FS_INC.'xtc_check_matrix_stock.inc.php');
includes/modules/order_details_cart.php
ca. Zeile 53
if (STOCK_CHECK == 'true') {
$mark_stock = xtc_check_stock($products[$i]['id'], $products[$i]['quantity']);
if ($mark_stock)
$_SESSION['any_out_of_stock'] = 1;
}
ersetzen durch
if (STOCK_CHECK == 'true') {
$mark_stock = xtc_check_stock($products[$i]['id'], $products[$i]['quantity']);
}
$sql = xtc_db_query("SELECT products_matrix1, products_matrix2 FROM " . TABLE_PRODUCTS . " WHERE products_id=" . (int)$products[$i]['id']);
$erg = xtc_db_fetch_array($sql);
if ($erg['products_matrix1']>0 && $erg['products_matrix2']>0)
$mark_stock = xtc_check_matrix_stock($products[$i]['id'], $products[$i]['quantity'], $products[$i]['attributes'][$erg['products_matrix1']], $products[$i]['attributes'][$erg['products_matrix2']]);
if ($mark_stock) $_SESSION['any_out_of_stock'] = 1;
includes/modules/product_attributes.php
ca
. Zeile
31 $products_options_name_query = xtDBquery
("SELECT distinct
popt.products_options_id,
popt.products_options_name,
popt.products_options_sortorder
FROM ".TABLE_PRODUCTS_OPTIONS
." popt,
".TABLE_PRODUCTS_ATTRIBUTES
." patrib
WHERE patrib.products_id='".$product->data['products_id']."'
AND patrib.options_id = popt.products_options_id
AND popt.language_id = '".(int
) $_SESSION['languages_id']."'
ORDER BY popt.products_options_sortorder, popt.products_options_id" ); $row = 0;danach einfügen
if ($product->data['products_matrix1'] > 0 || $product->data['products_matrix2'] > 0) { $sql = xtc_db_query
("SELECT products_options_name FROM " . TABLE_PRODUCTS_OPTIONS
. " WHERE products_options_id=" . $product->data['products_matrix1'] . " AND language_id=" . $_SESSION['languages_id']); $erg = xtc_db_fetch_array
($sql); $title = $erg['products_options_name']; $sql = xtc_db_query
("SELECT products_options_name FROM " . TABLE_PRODUCTS_OPTIONS
. " WHERE products_options_id=" . $product->data['products_matrix2'] . " AND language_id=" . $_SESSION['languages_id']); $erg = xtc_db_fetch_array
($sql); $title .= "<br /><hr />" . $erg['products_options_name']; $sql = xtc_db_query
("SELECT *
FROM " . TABLE_PRODUCTS_ATTRIBUTES
. " pa,
" . TABLE_PRODUCTS_OPTIONS_VALUES
. " pov
WHERE pa.products_id = " . $product->data['products_id'] . "
AND pa.options_id = " . $product->data['products_matrix1'] . "
AND pa.options_values_id = pov.products_options_values_id
AND pov.language_id = " . $_SESSION['languages_id'] . "
ORDER BY pa.sortorder"); $matrix1 = array(); while ($matrix = xtc_db_fetch_array
($sql)) { $matrix1[] = array('id' => $matrix['products_options_values_id'], 'text' => $matrix['products_options_values_name']); } $sql = xtc_db_query
("SELECT *
FROM " . TABLE_PRODUCTS_ATTRIBUTES
. " pa,
" . TABLE_PRODUCTS_OPTIONS_VALUES
. " pov
WHERE pa.products_id = " . $product->data['products_id'] . "
AND pa.options_id = " . $product->data['products_matrix2'] . "
AND pa.options_values_id = pov.products_options_values_id
AND pov.language_id = " . $_SESSION['languages_id'] . "
ORDER BY pa.sortorder"); $matrix2 = array(); while ($matrix = xtc_db_fetch_array
($sql)) { $matrix2[] = array('id' => $matrix['products_options_values_id'], 'text' => $matrix['products_options_values_name']); } $sql = xtc_db_query
("SELECT * FROM " . TABLE_PRODUCTS_ATTRIBUTES_MATRIX
. " WHERE products_id=" . $product->data['products_id']); $quantity = array(); while ($erg = xtc_db_fetch_array
($sql)) { $quantity[$erg['matrix1']][$erg['matrix2']] = $erg['quantity']; } $i=0; $j=0; $products_options_data = array (); for ($i=0; $i <= sizeof($matrix2); $i++) { if ($i==0) { $products_options_data[$i]['DATA'][$j]['content'] = $title; } else { $products_options_data[$i]['DATA'][$j]['content'] = $matrix2[$i-1]['text']; } for ($j=1; $j <= sizeof($matrix1); $j++) { if ($i==0) { $products_options_data[$i]['DATA'][$j]['content'] = $matrix1[$j-1]['text']; } else { if (ATTRIBUTE_STOCK_CHECK
== 'false' || $quantity[$matrix1[$j-1]['id']][$matrix2[$i-1]['id']] > 0) { $products_options_data[$i]['DATA'][$j]['content'] = '<input type="text" name="' . $matrix1[$j-1]['id'] . "-" . $product->data['products_matrix1'] . "-" . $matrix2[$i-1]['id'] . "-" . $product->data['products_matrix2'] . '" value="0" size="4" onMouseOver="showWMTT(\'tooltip\', \'' . TEXT_AVAILABLE_QUANTITY
. $quantity[$matrix1[$j-1]['id']][$matrix2[$i-1]['id']] . '\')" onMouseOut="hideWMTT(\'tooltip\')" />'; } else { $products_options_data[$i]['DATA'][$j]['content'] = ' '; } } } } // Show javascript tooltip only when stock is controlled by shop $module_smarty->assign('show_quantity', stock_limited
=== 'true'); } else {ca
. Zeile
183 //if PRICE for option is 0 we don't need to display itdavor einfügen
}Mouseover in der product_attributes deaktivieren: onMouseOver="hideWMTT(\'tooltip\', \''
lang/german/german.php
Am Ende
(vor dem
?>) einfügen
define('TEXT_AVAILABLE_QUANTITY', 'Verfügbare Menge: ');lang/german/admin/german.php
ca. Zeile 151
define('BOX_ATTRIBUTES_MANAGER','Attribut Verwaltung');danach einfügen
define('BOX_ATTRIBUTES_MATRIX','Attribut Matrix'); templates/xtc5(?)/stylesheet.css
Am Ende einfügen
.tooltip {
position: absolute;
display: none;
background-color: #CCF;
border: 1px solid #66F;
padding: 3px;
}
/includes/modules/product_info.php
ca. Zeile 113
// check if customer is allowed to add to cart
if ($_SESSION['customers_status']['customers_status_show_price'] != '0'
&& (($_SESSION['customers_status']['customers_fsk18'] == '1' && $product->data['products_fsk18'] == '0')
|| $_SESSION['customers_status']['customers_fsk18'] != '1')) {
$add_pid_to_qty = xtc_draw_hidden_field('products_id', $product->data['products_id']);
$info_smarty->assign('ADD_QTY', xtc_draw_input_field('products_qty', '1', ($hide_qty ? '' : 'size="3"'), ($hide_qty ? 'hidden' : 'text')).' '.$add_pid_to_qty);
$info_smarty->assign('ADD_CART_BUTTON', xtc_image_submit('button_in_cart.gif', IMAGE_BUTTON_IN_CART));
}
ersetzen mit
$matrix = ($product->data['products_matrix1'] > 0 && $product->data['products_matrix2'] > 0) ? true : false;
// check if customer is allowed to add to cart
if ($_SESSION['customers_status']['customers_status_show_price'] != '0'
&& (($_SESSION['customers_status']['customers_fsk18'] == '1' && $product->data['products_fsk18'] == '0')
|| $_SESSION['customers_status']['customers_fsk18'] != '1')) {
$add_pid_to_qty = xtc_draw_hidden_field('products_id', $product->data['products_id']);
if ($matrix) {
$info_smarty->assign('ADD_QTY', xtc_draw_hidden_field('products_id', $product->data['products_id']) . xtc_draw_hidden_field('matrix', '1'));
} else {
$info_smarty->assign('ADD_QTY', xtc_draw_input_field('products_qty', '1', ($hide_qty ? '' : 'size="3"'), ($hide_qty ? 'hidden' : 'text')).' '.$add_pid_to_qty);
}
$info_smarty->assign('ADD_CART_BUTTON', xtc_image_submit('button_in_cart.gif', IMAGE_BUTTON_IN_CART));
}
Die FSK 18 Anpassungen habe ich nicht kontrolliert - diese benötige ich aber nicht.
Bei den Artikeloptionen funktionieren neben der table_matrix im Moment keine weiteren Optionen mit Auswahlmöglichkeit.
Es ist nur möglich, den Artikel mit gewünschter Stückzahl in den Warenkorb zu übernehmen. Mehr benötige ich im Moment nicht, falls es so weit sein sollte, werde ich das Modul anpassen, wenn es wer anderer zuvor benötigt & löst, darf er mich gerne daran teilhaben lassen!
Jetzt sollte alles funktionieren!
Linkback: https://www.modified-shop.org/forum/index.php?topic=23706.0