Anleitung Attributmatrix

© 2008 Estelco

(no warranty) released under GPL

1. BACKUP MACHEN!!!

2. Folgende Dateien kopieren

admin/new_attributes_matrix.php
admin/includes/modules/new_attributes_matrix_change.php
admin/includes/modules/new_attributes_matrix_choose.php
admin/includes/modules/new_attributes_matrix_include.php
admin/includes/modules/new_attributes_matrix_select.php
inc/xtc_check_matrix_stock.inc.php
lang/german/admin/new_attributes_matrix.php
templates/xtc4/module/product_options/table_matrix.html

3. Anpassungen für Dateien, die schon modifiziert wurden:

admin/includes/application_top.php

ca. Zeile 113

define('FILENAME_NEW_ATTRIBUTES','new_attributes.php');
danach einfügen
define('FILENAME_NEW_ATTRIBUTES_MATRIX','new_attributes_matrix.php');

ca. Zeile 180

  define('TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD', 'products_attributes_download');
danach einfügen
  define('TABLE_PRODUCTS_ATTRIBUTES_MATRIX', 'products_attributes_matrix');

admin/includes/column_left.php

ca. Zeile 29

  if (($_SESSION['customers_status']['customers_status_id'] == '0') && ($admin_access['new_attributes'] == '1')) echo '<a href="' . xtc_href_link(FILENAME_NEW_ATTRIBUTES, '', 'NONSSL') . '" class="menuBoxContentLink"> -'.BOX_ATTRIBUTES_MANAGER.'</a><br>';
danach einfügen
  if (($_SESSION['customers_status']['customers_status_id'] == '0') && ($admin_access['new_attributes_matrix'] == '1')) echo '<a href="' . xtc_href_link(FILENAME_NEW_ATTRIBUTES_MATRIX, '', 'NONSSL') . '" class="menuBoxContentLink"> -'.BOX_ATTRIBUTES_MATRIX.'</a><br>';

checkout_process.php

ca. Zeile 151

$stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
ändern in
$stock_query_raw = "SELECT products_quantity, products_matrix1, products_matrix2, pad.products_attributes_filename

ca. Zeile 166

$stock_query = xtc_db_query("select products_quantity from ".TABLE_PRODUCTS." where products_id = '".xtc_get_prid($order->products[$i]['id'])."'");

ersetzen durch:

$stock_query = xtc_db_query("select products_quantity, products_matrix1, products_matrix2 from ".TABLE_PRODUCTS." where products_id = '".xtc_get_prid($order->products[$i]['id'])."'");

ca. Zeile 177

        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 durch:
        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 68

    case 'add_product' :
      if (isset ($_POST['products_id']) && is_numeric($_POST['products_id'])) {
        if ($_POST['products_qty'] > MAX_PRODUCTS_QTY)
        $_POST['products_qty'] = MAX_PRODUCTS_QTY;
        $_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;
ersetzen durch
        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 55

  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 35

require_once (DIR_FS_INC.'xtc_check_stock.inc.php');
danach einfügen:
require_once (DIR_FS_INC.'xtc_check_matrix_stock.inc.php');

ca. Zeile 49

  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 52

if ($product->getAttributesCount() > 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 146

if ($product->data['options_template'] == '' or $product->data['options_template'] == 'default') {
davor einfügen
}

includes/modules/product_info.php

ca. Zeile 50

// check if customer is allowed to add to cart
davor einfügen
$matrix = ($product->data['products_matrix1'] > 0 && $product->data['products_matrix2'] > 0) ? true : false;

ca. Zeile 55

      if ($product->data['products_fsk18'] == '0') {
        $info_smarty->assign('ADD_QTY', xtc_draw_input_field('products_qty', '1', 'size="3"').' '.xtc_draw_hidden_field('products_id', $product->data['products_id']));
ersetzen durch
      if ($product->data['products_fsk18'] == '0') {
        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', 'size="3"').' '.xtc_draw_hidden_field('products_id', $product->data['products_id']));
        }

ca. Zeile 63

    } else {
      $info_smarty->assign('ADD_QTY', xtc_draw_input_field('products_qty', '1', 'size="3"').' '.xtc_draw_hidden_field('products_id', $product->data['products_id']));
ersetzen durch
    } else {
      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', 'size="3"').' '.xtc_draw_hidden_field('products_id', $product->data['products_id']));
      }

lang/german/german.php

Am Ende (vor dem ?>) einfügen

define('TEXT_AVAILABLE_QUANTITY', 'Verf&uuml;gbare Menge: ');

lang/german/admin/german.php

ca. Zeile 140

define('BOX_ATTRIBUTES_MANAGER','Attribut Verwaltung');
danach einfügen
define('BOX_ATTRIBUTES_MATRIX','Attribut Matrix');

templates/TEMPLATE/stylesheet.css

Am Ende anfügen

.tooltip {
	position: absolute;
	display: none;
	background-color: #CCF;
	border: 1px solid #66F;
	padding: 3px;
}

5. Änderungen in der Datenbank

Bitte die Datei database.sql in die Datenbank importieren (z.B. mittels phpmyadmin)

6. Hinweise

Bitte darauf achten, den entsprechenden Artikeln im Administrationsbereich auch das richtige Optionstemplate (table_matrix.html) zuzuweisen.