Veröffentlichungsdatum: 20. November 2023
Änderungsdatum: 18. Dezember 2023
Projektgrundlage: BASE
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.
Ö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".
Aufgrund der Datenstruktur für Varianten, wird die Pflegemaske für die Varianten in XSLT eingebunden.
In diesem Beispiel wurde die Information orderMax für die Variante angegeben.
<!-- 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>
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.
[!--#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--]
<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>
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.
//*********************************************************************************/
/**
* @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;
}
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."