Danke Thomas, ganz trifft es das nicht. Ich habe jetzt aus den verschiedenen Quellen hier im Forum ein bisschen zusammengetragen und etwas daraus gebastelt was für mich genau diese Anforderung erfüllt, das heißt Lager und Bestellware können gleichzeitig verkauft werden, Verkauf also auch mit Warenbestand 0, gelichzeitig können Unikate verkauft werden (unabhängig vom Lagerbestand), die sich aber mit Ihrem Verkauf automatisch deaktivieren. Über ein zusätzliches Feld im Artikel wird definiert ob es sich um einen normalen Artikel (0) ein Unikat (1) oder ein verkauftes Unikat (2) handelt. Verkaufte Unikate bleiben sichtbar (Quasi ein Archiv) und können nicht mehr in den Warenkorb gelegt werden. Auf diese Weise kann man auch endgültig verkaufte Lagerware "abschalten". Ich werde mich ein anderes Mal noch damit beschäftigen, dass man von Unikaten natülich auch maximal 1 Stück in den Warenkorb legen kann, und dass der Warenkorb dann auch prüft ob das Unikat nicht zwischenzeitlich verkauft wurde, dazu bin ich aber noch nicht gekommen.
Benötigt wird noch eine Grafik als Ersatz für das "Add to cart", die man sich halt in Anlehnung an das eigene Template selber erstellen sollte.
Hier soweit die Änderungen:
Grafiken:
Datei /templates/templateordner/buttons/german/soldout.gif installieren
Datei /templates/templateordner/buttons/english/soldout.gif installieren
Datenbank:
ALTER TABLE `products` ADD COLUMN `products_ooak` INT(4) NOT NULL ;
Sprachvariablen:
Datei: lang/german/admin/categories.php
// BOF Zaldoran - 2012-06-19 - OOAK Itemsdefine('TEXT_PRODUCTS_OOAK','Unikat (0=Nein, 1=Ja, 2=Ja verkauft)');// EOF Zaldoran - 2012-06-19 - OOAK Items Datei: lang/lang_german.conf
Finde Abschnitt [product_info] und füge dahinter ein:
#BOF Zaldoran - 2012-06-19 - OOAK Items
text_soldout = 'AUSVERKAUFT!'
#EOF Zaldoran - 2012-06-19 - OOAK Items
Finde Abschnitt [index] und füge dahinter ein:
#BOF Zaldoran - 2012-06-19 - OOAK Items
text_soldout = 'VERKAUFT'
#EOF Zaldoran - 2012-06-19 - OOAK Items
Finde Abschnitt [new_products] und füge dahinter ein:
#BOF Zaldoran - 2012-06-19 - OOAK Items
text_soldout = 'VERKAUFT'
#EOF Zaldoran - 2012-06-19 - OOAK Items
Änderungen sind für weitere Sprachen gegebenenfalls analog vorzunehmen.
Anzeige des neuen Feldes im Backend:
Datei: admin/includes/modules/new_product.php
Finde:
<tr>
<td><span class="main"><?php echo TEXT_PRODUCTS_EAN; ?></span></td>
<td><span class="main"><?php echo xtc_draw_input_field('products_ean', $pInfo->products_ean); ?></span></td>
</tr>
Füge dahinter ein:
<!-- BOF Zaldoran - 2012-06-19 - OOAK Items -->
<tr>
<td><span class="main"><?php echo TEXT_PRODUCTS_OOAK; ?></span></td>
<td><span class="main"><?php echo xtc_draw_input_field('products_ooak', $pInfo->products_ooak); ?></span></td>
</tr>
<!-- EOF Zaldoran - 2012-06-19 - OOAK Items -->
Damit das neue Feld abgespeichert und beim Kopieren von Artikeln übernommen wird:
Datei: admin/includes/classes/categories.php
Finde (ca. Z. 522):
$sql_data_array = array ( 'products_quantity' => xtc_db_prepare_input
($products_data['products_quantity']), 'products_model' => xtc_db_prepare_input
($products_data['products_model']), 'products_ean' => xtc_db_prepare_input
($products_data['products_ean']), 'products_price' => xtc_db_prepare_input
($products_data['products_price']), 'products_sort' => xtc_db_prepare_input
($products_data['products_sort']), 'products_shippingtime' => xtc_db_prepare_input
($products_data['shipping_status']), 'products_discount_allowed' => xtc_db_prepare_input
($products_data['products_discount_allowed']), 'products_date_available' => $products_date_available, 'products_weight' => xtc_db_prepare_input
($products_data['products_weight']), 'products_status' => $products_status, 'products_startpage' => xtc_db_prepare_input
($products_data['products_startpage']), 'products_startpage_sort' => xtc_db_prepare_input
($products_data['products_startpage_sort']), 'products_tax_class_id' => xtc_db_prepare_input
($products_data['products_tax_class_id']), 'product_template' => xtc_db_prepare_input
($products_data['info_template']), 'options_template' => xtc_db_prepare_input
($products_data['options_template']), 'manufacturers_id' => xtc_db_prepare_input
($products_data['manufacturers_id']), 'products_fsk18' => xtc_db_prepare_input
($products_data['fsk18']), 'products_vpe_value' => xtc_db_prepare_input
($products_data['products_vpe_value']), 'products_vpe_status' => xtc_db_prepare_input
($products_data['products_vpe_status']), 'products_vpe' => xtc_db_prepare_input
($products_data['products_vpe']) ); Ergänze wie folgt:
$sql_data_array = array ( 'products_quantity' => xtc_db_prepare_input
($products_data['products_quantity']), 'products_model' => xtc_db_prepare_input
($products_data['products_model']), 'products_ean' => xtc_db_prepare_input
($products_data['products_ean']), // BOF Zaldoran - 2012-06-19 - OOAK Items 'products_ooak' => xtc_db_prepare_input
($products_data['products_ooak']), // EOF Zaldoran - 2012-06-19 - OOAK Items 'products_price' => xtc_db_prepare_input
($products_data['products_price']), 'products_sort' => xtc_db_prepare_input
($products_data['products_sort']), 'products_shippingtime' => xtc_db_prepare_input
($products_data['shipping_status']), 'products_discount_allowed' => xtc_db_prepare_input
($products_data['products_discount_allowed']), 'products_date_available' => $products_date_available, 'products_weight' => xtc_db_prepare_input
($products_data['products_weight']), 'products_status' => $products_status, 'products_startpage' => xtc_db_prepare_input
($products_data['products_startpage']), 'products_startpage_sort' => xtc_db_prepare_input
($products_data['products_startpage_sort']), 'products_tax_class_id' => xtc_db_prepare_input
($products_data['products_tax_class_id']), 'product_template' => xtc_db_prepare_input
($products_data['info_template']), 'options_template' => xtc_db_prepare_input
($products_data['options_template']), 'manufacturers_id' => xtc_db_prepare_input
($products_data['manufacturers_id']), 'products_fsk18' => xtc_db_prepare_input
($products_data['fsk18']), 'products_vpe_value' => xtc_db_prepare_input
($products_data['products_vpe_value']), 'products_vpe_status' => xtc_db_prepare_input
($products_data['products_vpe_status']), 'products_vpe' => xtc_db_prepare_input
($products_data['products_vpe'])); Finde (ca. Z. 822):
$sql_data_array=array('products_quantity'=>$product['products_quantity'], 'products_model'=>$product['products_model'], 'products_ean'=>$product['products_ean'], 'products_shippingtime'=>$product['products_shippingtime'], 'products_sort'=>$product['products_sort'], 'products_startpage'=>$startpage, 'products_sort'=>$product['products_sort'], 'products_price'=>$product['products_price'], 'products_discount_allowed'=>$product['products_discount_allowed'], 'products_date_added'=>'now()', 'products_date_available'=>$product['products_date_available'], 'products_weight'=>$product['products_weight'], 'products_status'=>$products_status, 'products_tax_class_id'=>$product['products_tax_class_id'], 'manufacturers_id'=>$product['manufacturers_id'], 'product_template'=>$product['product_template'], 'options_template'=>$product['options_template'], 'products_fsk18'=>$product['products_fsk18'],); Ergänze wie folgt:
$sql_data_array=array('products_quantity'=>$product['products_quantity'], 'products_model'=>$product['products_model'], 'products_ean'=>$product['products_ean'], // BOF Zaldoran - 2012-06-19 - OOAK Items 'products_ooak'=>$product['products_ooak'], // EOF Zaldoran - 2012-06-19 - OOAK Items 'products_shippingtime'=>$product['products_shippingtime'], 'products_sort'=>$product['products_sort'], 'products_startpage'=>$startpage, 'products_sort'=>$product['products_sort'], 'products_price'=>$product['products_price'], 'products_discount_allowed'=>$product['products_discount_allowed'], 'products_date_added'=>'now()', 'products_date_available'=>$product['products_date_available'], 'products_weight'=>$product['products_weight'], 'products_status'=>$products_status, 'products_tax_class_id'=>$product['products_tax_class_id'], 'manufacturers_id'=>$product['manufacturers_id'], 'product_template'=>$product['product_template'], 'options_template'=>$product['options_template'], 'products_fsk18'=>$product['products_fsk18'], 'products_vpe'=>$product['products_vpe'], 'products_vpe_value'=>$product['products_vpe_value'], 'products_vpe_status'=>$product['products_vpe_status'] ); Variable für das neue Feld definieren:
Datei: includes/modules/product_info.php
Finde (ca. Z. 159):
$info_smarty->assign('PRODUCTS_EAN', $product->data['products_ean']);
Füge dahinter ein:
// EOF Zaldoran - 2012-06-19 - OOAK Items
$info_smarty->assign('PRODUCTS_OOAK', $product->data['products_ooak']);
// EOF Zaldoran - 2012-06-19 - OOAK Items
Datei: includes/classes/product.php
Finde (ca. Z. 424):
$productData = array ( 'PRODUCTS_NAME' => $array['products_name'], 'COUNT' => isset($array['ID']) ?
$array['ID'] : 0, 'PRODUCTS_ID'=> $array['products_id'], 'PRODUCTS_MODEL'=> isset($array['products_model']) ?
$array['products_model'] : '', 'PRODUCTS_VPE' => $this->getVPEtext($array, $products_price['plain']), 'PRODUCTS_IMAGE' => $this->productImage($array['products_image'], $image), 'PRODUCTS_LINK' => xtc_href_link
(FILENAME_PRODUCT_INFO
, xtc_product_link
($array['products_id'], $array['products_name'])), 'PRODUCTS_PRICE' => $products_price['formated'], 'PRODUCTS_TAX_INFO' => $main->getTaxInfo($tax_rate), 'PRODUCTS_SHIPPING_LINK' => $main->getShippingLink(), 'PRODUCTS_BUTTON_BUY_NOW' => $buy_now, 'PRODUCTS_SHIPPING_NAME'=>$shipping_status_name, 'PRODUCTS_SHIPPING_IMAGE'=>$shipping_status_image, 'PRODUCTS_DESCRIPTION' => isset($array['products_description']) ?
$array['products_description'] : '', //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_EXPIRES' => isset($array['expires_date']) ?
$array['expires_date'] : 0, //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_CATEGORY_URL' => isset($array['cat_url']) ?
$array['cat_url'] : '', //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_SHORT_DESCRIPTION' => isset($array['products_short_description']) ?
$array['products_short_description'] : '', //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_FSK18' => isset($array['products_fsk18']) ?
$array['products_fsk18'] : 0, //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_BUTTON_DETAILS' => '<a href="'.xtc_href_link
(FILENAME_PRODUCT_INFO
, xtc_product_link
($array['products_id'], $array['products_name'])).'">'.xtc_image_button
('button_product_more.gif', $array['products_name'].TEXT_NOW
).'</a>', //GTB - 2010-08-27 make Button Details global 'PRODUCTS_QUANTITY' => isset($array['products_quantity']) ?
$array['products_quantity'] : '' //Tomcraft - 2010-07-15 - Added PRODUCTS_QUANTITY for further use in template ); Ergänze wie folgt:
$productData = array ( 'PRODUCTS_NAME' => $array['products_name'], 'COUNT' => isset($array['ID']) ?
$array['ID'] : 0, 'PRODUCTS_ID'=> $array['products_id'], 'PRODUCTS_MODEL'=> isset($array['products_model']) ?
$array['products_model'] : '', 'PRODUCTS_VPE' => $this->getVPEtext($array, $products_price['plain']), 'PRODUCTS_IMAGE' => $this->productImage($array['products_image'], $image), 'PRODUCTS_LINK' => xtc_href_link
(FILENAME_PRODUCT_INFO
, xtc_product_link
($array['products_id'], $array['products_name'])), 'PRODUCTS_PRICE' => $products_price['formated'], 'PRODUCTS_TAX_INFO' => $main->getTaxInfo($tax_rate), 'PRODUCTS_SHIPPING_LINK' => $main->getShippingLink(), 'PRODUCTS_BUTTON_BUY_NOW' => $buy_now, // BOF Zaldoran - 2012-06-19 - OOAK Items 'PRODUCTS_OOAK' => $array['products_ooak'], // EOF Zaldoran - 2012-06-19 - OOAK Items 'PRODUCTS_SHIPPING_NAME'=>$shipping_status_name, 'PRODUCTS_SHIPPING_IMAGE'=>$shipping_status_image, 'PRODUCTS_DESCRIPTION' => isset($array['products_description']) ?
$array['products_description'] : '', //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_EXPIRES' => isset($array['expires_date']) ?
$array['expires_date'] : 0, //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_CATEGORY_URL' => isset($array['cat_url']) ?
$array['cat_url'] : '', //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_SHORT_DESCRIPTION' => isset($array['products_short_description']) ?
$array['products_short_description'] : '', //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_FSK18' => isset($array['products_fsk18']) ?
$array['products_fsk18'] : 0, //DokuMan - 2010-02-26 - set Undefined index 'PRODUCTS_BUTTON_DETAILS' => '<a href="'.xtc_href_link
(FILENAME_PRODUCT_INFO
, xtc_product_link
($array['products_id'], $array['products_name'])).'">'.xtc_image_button
('button_product_more.gif', $array['products_name'].TEXT_NOW
).'</a>', //GTB - 2010-08-27 make Button Details global 'PRODUCTS_QUANTITY' => isset($array['products_quantity']) ?
$array['products_quantity'] : '' //Tomcraft - 2010-07-15 - Added PRODUCTS_QUANTITY for further use in template ); Datei: includes/modules/default.php
Finde (ca. Z. 209):
$listing_sql = "-- /includes/modules/default.php
SELECT ".$select."
p.products_id,
p.products_ean,
p.products_quantity,
p.products_shippingtime,
p.products_model,
p.products_image,
p.products_price,
p.products_discount_allowed,
p.products_weight,
p.products_tax_class_id,
p.manufacturers_id,
p.products_fsk18,
p.products_vpe,
p.products_vpe_status,
p.products_vpe_value,
pd.products_name,
pd.products_description,
pd.products_short_description
Ergänze wie folgt:
[...]
p.products_ean,
p.products_ooak,
p.products_quantity,
[...]
Statt der Lieferzeit und dem Button "zum Warenkorb hinzufügen" soll "Leider Ausverkauft" angezeigt werden, wenn OOAK verkauft ist:
Datei: templates/templateordner/module/product_info/product_info_tabs_v1.html
Finde:
{if $SHIPPING_NAME}<p class="shippingtime"><strong>{#text_shippingtime#}</strong>{if $SHIPPING_IMAGE}<img src="{$SHIPPING_IMAGE}" alt="{$SHIPPING_NAME}" />{/if} {$SHIPPING_NAME}</p>
{/if}
Ersetze durch:
<!-- BOF Zaldoran - 2012-06-19 - OOAK Items -->
{if $PRODUCTS_OOAK != 2}
{if $SHIPPING_NAME}<p class="shippingtime"><strong>{#text_shippingtime#}</strong>{if $SHIPPING_IMAGE}<img src="{$SHIPPING_IMAGE}" alt="{$SHIPPING_NAME}" />{/if} {$SHIPPING_NAME}</p>
{/if}
{else}
<p class="shippingtime"><strong>{#text_shippingtime#} {#text_soldout#}</strong><p>
{/if}
<!-- EOF Zaldoran - 2012-06-19 - OOAK Items -->
Finde:
<div class="addtobasket-tabs"><div class="add-Qty-tabs">{$ADD_QTY}</div><span>{$ADD_CART_BUTTON}</span></div>
Ersetze durch:
<!-- BOF Zaldoran - 2012-06-19 - OOAK Items -->
{if $PRODUCTS_OOAK != 2}
<div class="addtobasket-tabs"><div class="add-Qty-tabs">{$ADD_QTY}</div><span>{$ADD_CART_BUTTON}</span></div>
{else}
<div class="addtobasket-tabs"><span style="left:33px;"><img src="{$tpl_path}buttons/{$language}/button_soldout.gif" alt="{#text_soldout#}" /></span></div>
{/if}
<!-- EOF Zaldoran - 2012-06-19 - OOAK Items -->
Im Listing soll statt dem Preis "Verkauft" angezeigt werden, wenn der Artikel verkauft ist (Kaufen Button gibts in meinem Template eh nicht):
Datei: templates/templateordner/module/product_listing/product_listing_v1.html
Datei: templates/templateordner/module/new_products.html
Datei: templates/templateordner/module/new_products_overview.html
Datei: templates/templateordner/module/new_products_default.html
Bei bedarf auch noch in /module/cross_selling.html und specials.html
Finde:
<p class="price">{$module_data.PRODUCTS_PRICE}</p><div class="clear"></div></div>
Ersetze durch:
<!-- BOF Zaldoran - 2012-06-19 - OOAK Items -->
{if $module_data.PRODUCTS_OOAK !=2}
<p class="price">{$module_data.PRODUCTS_PRICE}</p><div class="clear"></div></div>
{else}
<p class="price">{#text_soldout#}</p><div class="clear"></div></div>
{/if}
<!-- EOF Zaldoran - 2012-06-19 - OOAK Items -->
Beim Verkauf eines OOAKs automatisch products_ooak auf 2 (Ja, verkauft) ändern:
Datei /checkout_process.php:
Finde (Ca. Z. 246):
$stock_query = xtc_db_query("
select products_quantity
from ".TABLE_PRODUCTS."
where products_id = '".xtc_get_prid($order->products[$i]['id'])."'");
Ändere wie folgt:
// BOF Zaldoran - 2012-06-19 - OOAK Items
$stock_query = xtc_db_query("
select products_quantity, products_ooak
from ".TABLE_PRODUCTS."
where products_id = '".xtc_get_prid($order->products[$i]['id'])."'");
// EOF Zaldoran - 2012-06-19 - OOAK Items
Kurz danach finde:
// do not decrement quantities if products_attributes_filename exists
if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {
$stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];
} else {
$stock_left = $stock_values['products_quantity'];
}
Füge dahinter ein:
// BOF Zaldoran - 2012-06-19 - OOAK Items
$products_ooak = $stock_values['products_ooak'];
if ($products_ooak == 1) {
xtc_db_query("update ".TABLE_PRODUCTS." set products_ooak = '2' where products_id = '".xtc_get_prid($order->products[$i]['id'])."'");
}
// EOF Zaldoran - 2012-06-19 - OOAK Items
OOAKs sollen wieder verfügbar werden, wenn eine Bestellung gelöscht und dem Lager gutgebucht wird:
Wenn Einzelartikel aus einer Bestellung gelöscht werden: Datei /admin/orders_edit.php
Finde:
//BOF - Dokuman - 2010-03-17 - calculate stock correctly when editing orders
xtc_db_query("UPDATE ".TABLE_PRODUCTS." SET products_quantity = products_quantity + ".xtc_db_input($_POST['del_qty'])." WHERE products_id = " . (int)$_POST['del_pID']);
//EOF - Dokuman - 2010-03-17 - calculate stock correctly when editing orders
Füge dahinter ein:
// BOF Zaldoran - 2012-06-19 - OOAK Items
$products_query = xtc_db_query("
select products_ooak
from ".TABLE_PRODUCTS."
WHERE products_id = " . (int)$_POST['del_pID']);
$products_values = xtc_db_fetch_array($products_query);
if ($products_values['products_ooak'] == 2) {
xtc_db_query("UPDATE ".TABLE_PRODUCTS." SET products_ooak = '1' WHERE products_id = " . (int)$_POST['del_pID']);
}
// EOF Zaldoran - 2012-06-19 - OOAK Items
Wenn die Gesamtbestellung gelöscht wird: Datei /admin/includes/functions/general.php
Finde (ca. Z. 1551):
function xtc_remove_order($order_id, $restock = false) {
if ($restock == 'on') {
xtc_db_query("update ".TABLE_PRODUCTS." p
join ".TABLE_ORDERS_PRODUCTS." o on o.products_id = p.products_id
set p.products_quantity = p.products_quantity + o.products_quantity,
p.products_ordered = p.products_ordered - o.products_quantity
where o.orders_id = '".xtc_db_input($order_id)."'");
Füge dahinter ein:
// BOF Zaldoran - 2012-06-19 - OOAK Items
xtc_db_query("update ".TABLE_PRODUCTS." p
join ".TABLE_ORDERS_PRODUCTS." o on o.products_id = p.products_id
set p.products_ooak = 1
where o.orders_id = '".xtc_db_input($order_id)."' AND p.products_ooak = 2");
// BOF Zaldoran - 2012-06-19 - OOAK Items
Das wars im großen und ganzen. Vielleicht ist es ja jemandem dienlich, und wenn es Anmerkungen oder Verbesserungsvorschläge dazu gibt, dann nur zu. Die Erweiterung für den Warenkorb werde ich bei Gelegenheit dann noch nachreichen.
LG
Zaldo