Maximale Bestellmenge im Mini-Shop Weblic ergänzen

Dieser Artikel beschreibt, wie der Minishop um die Möglichkeit erweitert wird, eine maximale Bestellmenge anzugeben.

Über die Pflegemaske soll es ermöglicht werden, die maximale Bestellmenge für die Produkte festzulegen.

Schritt 1: Ergänzung der Pflegemaske für Produkte

Öffnen Sie den Objektwizard für Produkte und fügen Sie in der Pflegemaske den Varianten die Information "orderMax" hinzu. Ein Beispiel finden Sie in dem Bereich "Quelltext für Varianten".

Pflegemaske in Objektwizard
Quelltext für Varianten
Pflegemaske in Objektwizard
Pflegemaske Objektwizard Varianten

Aufgrund der Datenstruktur für Varianten, wird die Pflegemaske für die Varianten in XSLT eingebunden.

Quelltext für Varianten

In diesem Beispiel wurde die Information orderMax für die Variante angegeben.

Auszug Pflegemaske Varianten ergänzt duch orderMax

<!-- Hierüber werden die Varianten abgebildet -->
<
xsl:variable name="thousandsSeparator"><xsl:choose><xsl:when test="php:functionString('wVariables::getValue', 'decimal_mark', '', concat($wProjectPath, '/shop/variables/default.wVariables.php')) = '.'">'</xsl:when><xsl:otherwise>.</xsl:otherwise></xsl:choose></xsl:variable>
<xsl:variable name="considerStock"><xsl:value-of select="php:functionString('
wEnv::getGlobalValue', 'consider_stock')"/></xsl:variable>
<xsl:variable name="deliveryTimeValues"><xsl:value-of select="php:functionString('
wEnv::getGlobalValue', 'deliveryTime_values')"/></xsl:variable>
<xsl:variable name="deliveryTimeTexts"><xsl:value-of select="php:functionString('
wEnv::getGlobalValue', 'deliveryTime_texts')"/></xsl:variable>

<div style="overflow:hidden;margin:0 0 10px 0">

<table style="width:100%" cellpadding="0" cellspacing="0">
<tr>
<td><xsl:value-of select="php:functionString('
wTexts::showTextUser', 'Product ID', 'Artikel-ID', 'ID de lwAposarticle')"/></td>
<td style="width:50%"><xsl:if test="wd:data[@id = '
variantDescription'] != '' or wd:data[@id = 'variants']/wd:item"><xsl:value-of select="php:functionString('wTexts::showTextUser', 'Variant info', 'Variantenbezeichnung', 'Désignation variante')"/></xsl:if></td>
<td><xsl:value-of select="php:functionString('
wTexts::showTextUser', 'Original price', 'Ursprungspreis', 'Prix initial')"/></td>
<td><xsl:value-of select="php:functionString('
wTexts::showTextUser', 'Price', 'Preis', 'Prix')"/></td>
<td><xsl:value-of select="php:functionString('
wTexts::showTextUser', 'Delivery time', 'Lieferzeit', 'Délai de livraison')"/></td>
<xsl:if test="$considerStock = '
yes'">
<td><xsl:value-of select="php:functionString('
wTexts::showTextUser', 'Stock', 'Bestand', 'Stock')"/></td>
<td><xsl:value-of select="php:functionString('
wTexts::showTextUser', 'max order value', 'max Bestellwert', 'max commande')"/></td>
</xsl:if>
<xsl:if test="wd:data[@id = '
variants']/wd:item">
<td style="width:50px"><span style="color:transparent">Funktion</span></td>
</xsl:if>
</tr>

<tr>
<td><!-- web:text:start editor="input" validator="required" inputStyle="width:72px;margin-right:3px" --><xsl:value-of select="wd:data[@id = '
id']"/><!-- web:text:stop --></td>
<td>
<xsl:choose>
<xsl:when test="wd:data[@id = '
variants']/wd:item">
<!-- web:text:start editor="input" validator="required" inputStyle="width:99%;margin-right:3px"--><xsl:value-of select="wd:data[@id = '
variantDescription']"/><!-- web:text:stop -->
</xsl:when>
<xsl:when test="wd:data[@id = '
variantDescription']/text() != ''">
<!-- web:text:start editor="input" inputStyle="width:99%;margin-right:3px"--><xsl:value-of select="wd:data[@id = '
variantDescription']"/><!-- web:text:stop -->
</xsl:when>
</xsl:choose>
</td>
<td><!-- web:text:start validator="/^(\d+,\d\d|)$/" errorMessage="Format: 29,99" editor="input" inputStyle="width:48px;margin-right:3px"--><xsl:value-of select="wd:data[@id = '
priceOriginal']"/><!-- web:text:stop --></td>
<td><!-- web:text:start validator="/^\d+,\d\d$/" errorMessage="Format: 29,99" editor="input" inputStyle="width:48px;margin-right:3px"--><xsl:value-of select="wd:data[@id = '
price']"/><!-- web:text:stop --></td>
<td><!-- web:text:start editor="select" values="<xsl:value-of select="$deliveryTimeValues"/>" texts="<xsl:value-of select="$deliveryTimeTexts"/>" inputStyle="width:auto;margin-right:3px"--><xsl:value-of select="wd:data[@id = '
deliveryTime']"/><!-- web:text:stop --></td>
<xsl:if test="$considerStock = '
yes'">
<td><!-- web:text:start editor="input" validator="/^(\d+|)$/" inputStyle="width:40px"--><xsl:value-of select="wd:data[@id = '
stock']"/><!-- web:text:stop --></td>
<td><!-- web:text:start editor="input" validator="/^(\d+|)$/" inputStyle="width:40px"--><xsl:value-of select="wd:data[@id = '
orderMax']"/><!-- web:text:stop --></td>
</xsl:if>
</tr>

<xsl:for-each select="wd:data[@id = '
variants']/wd:item">
<!--web:row:start copyMode="insertAfter"-->
<tr>
<td><!-- web:text:start editor="input" validator="required" inputStyle="width:72px;margin-right:3px"--><xsl:value-of select="wd:fragment[@id = '
id']"/><!-- web:text:stop --></td>
<td><!-- web:text:start editor="input" validator="required" inputStyle="width:99%;margin-right:3px"--><xsl:value-of select="wd:fragment[@id = '
description']"/><!-- web:text:stop --></td>
<td><!-- web:text:start editor="input" validator="/^(\d+,\d\d|)$/" errorMessage="Format: 29,99" inputStyle="width:48px;margin-right:3px" --><xsl:value-of select="wd:fragment[@id = '
priceOriginal']"/><!-- web:text:stop --></td>
<td><!-- web:text:start editor="input" validator="/^\d+,\d\d$/" errorMessage="Format: 29,99" inputStyle="width:48px;margin-right:3px" --><xsl:value-of select="wd:fragment[@id = '
price']"/><!-- web:text:stop --></td>
<td><!-- web:text:start editor="select" values="<xsl:value-of select="$deliveryTimeValues"/>" texts="<xsl:value-of select="$deliveryTimeTexts"/>" inputStyle="width:auto;margin-right:3px"--><xsl:value-of select="wd:fragment[@id = '
deliveryTime']"/><!-- web:text:stop --></td>
<xsl:if test="$considerStock = '
yes'">
<td><!-- web:text:start editor="input" validator="/^(\d+|)$/" inputStyle="width:40px"--><xsl:value-of select="wd:fragment[@id = '
stock']"/><!-- web:text:stop --></td>
<td><!-- web:text:start editor="input" validator="/^(\d+|)$/" inputStyle="width:40px"--><xsl:value-of select="wd:fragment[@id = '
orderMax']"/><!-- web:text:stop --></td>
</xsl:if>
</tr>
<!--web:row:stop-->
</xsl:for-each>
</table>

</div>
<xsl:if test="wd:data[@id = '
variants']">
<wsl:button showInEditor="1" onclick="wAppendItemNew('
{wd:data[@id = 'variants']/@wEditorId}', 'document(\\'/holly2-wGlobal/wGlobal/mastertemplates/items/product.variant.wItemMastertemplate.php\\')//wd:group/wd:item[@name=\\'Variante\\']')" caption="Weitere Variante hinzufügen" icon="add" style="margin-top:4px;float:right"/>
</xsl:if>

Schritt 2: Anpassen der Warenkorb-Datei

Es ist wichtig, dass die Warenkorb-Datei stets aktuell ist.

Wurde der Bestellwert überschritten, wird der Platzhalter auf 1 gesetzt. Für die Ausgabe der Fehlermeldung an den Benutzer kann der Platzhalter entsprechend dem Beispiel eingefügt werden.


Auszug aus der warenkorb.php

[!--#if test="'[!--consider_stock--]' == 'yes'"--]
[!--#if test="'[!--orderOutOfStock--]' == '1'"--]<div class="stockInfo outOfStock">[!--text_shop_stock_input_validation_failed--]</div>[!--#endif--]
[!--#if test="'[!--orderOutOfMax--]' == '1'"--]<div class="stockInfo outOfStock">[!--text_shop_orderMax_input_validation_failed--]</div>[!--#endif--]
<div class="stockInfo [!--class_stockAvailable--]">[!--dynamicStockInfo--] ([!--stock--])</div>
[!--
#endif--]

Falls die Datei durch individuelle Anpassungen und Darstellungen verändert wurde, sollte im Element "Warenkorb-Ausgabe" innerhalb des Formulars "updateArticle_" anstelle des Eingabefelds "amount" der folgende Platzhalter verwendet werden:

[!--formInputCart--]


Auszug aus der warenkorb.php

<form id="updateArticle_[!--formId--]" action="[!--page_dir_application--]/scripts/cart.php">
<
input type="hidden" name="project" value="[!--wProjectPath--]"/>
<
input id="action_updateArticle_[!--formId--]" type="hidden" name="action" value="updateArticle"/>
<
input type="hidden" name="referrer" value="[!--page_path--]"/>
<
input type="hidden" name="item" value="[!--item--]"/>
<
input type="hidden" name="wcsrf" value="0Z0"/>
[!--
formInputCart--]
<
button type="submit" class="refreshAmount" onclick="jQuery('#action_updateArticle_[!--formId--]').val('updateArticle');" title="[!--text_shop_set_number_articles--]"><img src="[!--wProjectLayoutPath--]/wGlobal/layout/images/links/refresh.svg?stroke=#ffffff"/></button>
<
button type="submit" class="deleteAmount" onclick="jQuery('#action_updateArticle_[!--formId--]').val('deleteArticle');" title="[!--text_shop_delete_from_cart--]"><img src="[!--wProjectLayoutPath--]/wGlobal/layout/images/links/delete.svg"/></button>
</
form>

Schritt 3: Überlagern der Produktdaten

Seit November 2023 besteht die Möglichkeit, die Produktdaten des Warenkorbs über die Callback-Funktion wMyProject::callbackShopPrepareProductData zu überschreiben.

Um das Maximum für Bestellwerte umzusetzen, ist es ausreichend, die Validierung der Eingabefelder "formInputCart" und "formInputVariant" je nach der ausgewählten Bestellmenge zu überschreiben.

Auszug aus der wMyProject.php

//*********************************************************************************/
/**
* @method String callbackShopPrepareCart($resultStr)
*
* @description Callback Funktion, um das Ergebnis der Seite noch vor dem Schreiben in den Cache zu manipulieren
*
* @param $resultStr Ergebnis der generierten Seite
*
* @return String
*
*/
//*********************************************************************************/

public static function callbackShopPrepareProductData($productData){

$considerStock = wMyShop::getShopData('consider_stock');
$path = $productData['product_path'];

/*Produkte mit Varianten*/
if($productData['variants']){
foreach(
$productData['variants'] as $key => $value){
if(
$value['orderMax'] != '' || $value['orderMax'] != '0'){
/*Prüfen ob maximale Bestell-Anzahl überschritten wurde*/
$amount = wMyShop::getAmountOfArticle($path.'?variant='.$productData['variants'][$key]['id']);
$maxValue = $value['orderMax'];
if(
$amount > $maxValue){
$productData['variants'][$key]['orderOutOfMax'] = '1';

/*Überlagern des Bestellfeldes in der Produkt-Datei*/
$inputStrg = '<input id="variant_'.$value['id'].'" '.(!empty($value['checked']) && $value['checked'] ? 'checked="checked"' : '').' type="radio" name="variant" checked="checked" style="" value="'.$value['id'].'"
data-errormsg="[!--text_shop_orderMax_input_validation_failed--]" data-pattern="maxvalue('
.$maxValue.')"></input>';
$productData['variants'][$key]['formInputVariant'] = $inputStrg;

/*Überlagern des Bestellfeldes in der Warenkorb-Datei*/
$inputCart = '<input type="text" name="amount" id="amount[!--formId--]" data-pattern="maxvalue('.$maxValue.')" data-errormsg="[!--text_shop_orderMax_input_validation_failed--]" value="[!--amount--]"/>';
$productData['variants'][$key]['formInputCart'] = $inputCart;
}
}
}
}
/*Produkte ohne Varianten */
else{
if(
$productData['orderMax'] != '' || $productData['orderMax'] != '0'){
/*Prüfen ob maximale Bestell-Anzahl überschritten wurde*/
$amount = wMyShop::getAmountOfArticle($path.'?variant='.$productData['id']);
$maxValue = $productData['orderMax'];
$errormsg = wMyShop::getTexts('shop_orderMax_input_validation_failed');
if(
$amount > $maxValue){
$productData['orderOutOfMax'] = '1';

/*Überlagern des Bestellfeldes in der Produkt-Datei*/
$inputStrg = $productData['formInputVariant'];
$inputStrg = preg_replace('/(data-errormsg=")(.*?)(")/', '${1}'.$errormsg.'${3}', $inputStrg);
$inputStrg = preg_replace('/(data-pattern=")(.*?)(")/', '${1}maxvalue('.$maxValue.')${3}', $inputStrg);
$productData['formInputVariant'] = $inputStrg;

/*Überlagern des Bestellfeldes in der Warenkorb-Datei*/
$inputCart = '<input type="text" name="amount" id="amount[!--formId--]" data-pattern="maxvalue('.$maxValue.')" data-errormsg="[!--text_shop_orderMax_input_validation_failed--]" value="[!--amount--]"/>';
$productData['formInputCart'] = $inputCart;
}
}
}
return
$productData;

}

Schritt 4: Ergänzen der Shop-Texte durch Fehlermeldung

Für die Mitteilung an den Benuter ist es ratsam die Shop-Texte durch folgenden index zu ergänzen. 

shop_orderMax_input_validation_failed      "Achtung, Ihre Auswahl übersteigt den maximalen Bestellwert."