Hallo liebe User,
als kleines Ostergeschenk (etwas verspätet, aber lieber spät als nie ), wollen wir euch einen kleinen Hack vorstellen. Dieser ermöglicht es, auf der Detail-Seite eines Produkts, den Preis dynamisch anzupassen, wenn der Kunde in einer Auswahlliste (mit Aufpreis)auswählt.
Folgender Code-Snipe müsst ihr in die details.tpl einfügen:
<script type="text/javascript">
/*Array zum speichern des Preises sowie der Auf-/Abschläge*/
var prices=new Array();
/*Index 0 ist immer der Basispreis*/
prices[0] = [{$product->oxarticles__oxprice}];
/*Hilfsfunktion um das Ergebnis zu trimmen*/
function trim(str){
if (str){
str=str.replace(/^s*|s*$/g,"");
}
return str;
}
/*Funktion zum Runden und formatieren des Ergebnisses
je nach Einstellung von OXID*/
function formatCurrency(num){
var thousand="[{$currency->thousand}]";
var dezimals="[{$currency->dec}]";
var sign="[{$currency->sign}]";
var decimal=Math.pow(10,[{$currency->decimal}]);
num = num.toString();
if (isNaN(num)){
num="0";
}
numsign=(num==(num=Math.abs(num)));
num = Math.floor(num*decimal+0.5000000000);
cents = num%decimal;
num = Math.floor(num/decimal).toString();
if (cents<10){
cents = "0" + cents;
}
for (i=0;i<Math.round((num.length-(1+i))/3);i++){
j=num.length-(4*i+3);
num=num.substring(0,j)+thousand+num.substring(j);
}
if (cents=="00"){
cents="-";
}
return trim((((numsign)?"":"-") + num + dezimals + cents))+" "+sign;
}
/* Berechnet den Preis und aktualisiert das Anzeigefeld*/
function CalculateAndUpdate(){
var price_field = document.getElementById("test_product_price");
var m = prices.length;
var cur_price=0;
for (i=0;i <= m;i++){
if (prices[i]){
cur_price += prices[i];
}
}
price_field.innerHTML=formatCurrency(cur_price);
}
/*Event-Handler für onChange bei der betreffenden Auswahlliste*/
function change_price(selectobj){
var opti_field=selectobj.selectedIndex;
var idx=selectobj.options[opti_field].getAttribute("rev");
var opti=selectobj.options[opti_field].getAttribute("rel");
if (idx >=0){
idx++;
if (opti){
prices[idx] = parseFloat(opti.replace(/,/g,"."));
}else{
prices[idx] = 0.0;
}
}
CalculateAndUpdate();
}
</script>
Dieser Teil macht im Prinzip die ganze Arbeit. Er berechnet den neuen Preis, aktuallisiert das Feld usw.
Folgend der Teil, der abgeändert wurde, um das ganze zum laufen zu bekommen.
[{foreach key=iSel from=$oView->getSelectLists() item=oList}]
<div class="variants">
<label>[{ $oList.name }]:</label>
<select id="test_select_[{$product->oxarticles__oxid->value}]_[{$iSel}]"
name="sel[[{$iSel}]]" onchange="change_price(this);">
[{foreach key=iSelIdx from=$oList item=oSelItem}]
[{ if $oSelItem->name }]<option value="[{$iSelIdx}]"
rel="[{$oSelItem->fprice}]" rev="[{"$iSel"}]">[{ $oSelItem->name }]</option>
[{/if}]
[{/foreach}]
</select>
</div>
[{/foreach}]
Wie ihr seht, wird für jeden Listeneintrag der Auf-/Abpreis in das Attribut rel geschrieben, sowie der Index der Liste (nicht der Index des Elements !!!), in das rev-Attribut geschrieben. Dazu noch das onChange im Select, und schon funktioniert
das ganze.
HINWEIS:
Das ganze wurde für Absolute Beträge entwickelt. Eine Anpassung für prozentuale Auf-/Abschläge sollte nicht schwierig sein.
Viel Spaß damit
euer Aggrosoft-Team