Dynamische Preisanpassung bei Auswahllisten

Gentlemen, here it is my dirty and quick solution. I’m running slightly castrated and modified 4.6.4 CE (mostly templates).

  1. Disable option “[I]Load Selection Lists in Product Lists[/I]” to simplify life.
  2. Apply the following oxid anti-bug patch (I found it somewhere in bug tracks):

in the file [I]out/azure/tpl/page/checkout/inc/basketcontents.tpl[/I] replace (or comment) near line 72:

                            [{if !$basketitem->isBundle() || !$basketitem->isDiscountArticle()}]
                                [{if $oViewConf->showSelectListsInList()}]
                                    [{assign var="oSelections" value=$basketproduct->getSelections(null,$basketitem->getSelList())}]
                                    [{if $oSelections}]
                                        <div class="selectorsBox clear" id="cartItemSelections_[{$smarty.foreach.basketContents.iteration}]">
                                            [{foreach from=$oSelections item=oList name=selections}]
                                                [{include file="widget/product/selectbox.tpl" oSelectionList=$oList sFieldName="aproducts[`$basketindex`][sel]" iKey=$smarty.foreach.selections.index blHideDefault=true sSelType="seldrop"}]
                                            [{/foreach}]
                                        </div>
                                    [{/if}]
                                [{/if}]
                            [{/if }]

with:


                            [{if !$basketitem->isBundle() || !$basketitem->isDiscountArticle()}]
                                [{assign var="oSelections" value=$basketproduct->getSelections(null,$basketitem->getSelList())}]
                                [{if $oSelections}]
                                    <div class="selectorsBox clear" id="cartItemSelections_[{$smarty.foreach.basketContents.iteration}]">
                                    [{foreach from=$oSelections item=oList name=selections}]
                                        [{if $oViewConf->showSelectListsInList()}]
                                            [{include file="widget/product/selectbox.tpl" oSelectionList=$oList sFieldName="aproducts[`$basketindex`][sel]" iKey=$smarty.foreach.selections.index blHideDefault=true sSelType="seldrop"}]
                                        [{else}]
                                            [{assign var="oActiveSelection" value=$oList->getActiveSelection()}]
                                            [{if $oActiveSelection}]
                                                <input type="hidden" name="aproducts[[{$basketindex}]][sel][[{$smarty.foreach.selections.index}]]" value="[{if $oActiveSelection }][{$oActiveSelection->getValue()}][{/if}]">
                                                <div>[{$oList->getLabel()}]: [{$oActiveSelection->getName()}]</div>
                                            [{/if}]
                                        [{/if}]
                                    [{/foreach}]
                                    </div>
                                [{/if}]
                            [{/if }]

  1. Create a file out/azure/src/js/widgets/price.js:
window.basePrice=null;
$("ul.drop.seldrop.FXgradGreyLight.shadow li a").click(function() {

if (document.getElementById("ThisIsaPrice") != null) {
	if (basePrice==null ) basePrice = parseFloat(document.getElementById("ThisIsaPrice").innerText);
}

var currentMod = parseFloat(getAmount($(this).text()));

curItemIndex= $(this).parent().parent().parent().index();

$('#productSelections > div > p > span').each(function(i){
    if (i != curItemIndex) currentMod = currentMod + parseFloat(getAmount($(this).text()));
});

document.getElementById("ThisIsaPrice").innerText = toFixed(currentMod + basePrice,2);
return false;

function toFixed(value, precision) {
    var power = Math.pow(10, precision || 0);
    return String(Math.round(value * power) / power);
}

function getAmount(value) {
	modSum = value.match(/[-+]?\d*\.\d+/);
	if (modSum==null) return ("0");
	return modSum;
}
});

  1. In the file out/azure/tpl/page/details/inc/productmain.tpl near line 252 insert [B]id=“ThisIsaPrice”[/B]:
                                <strong >
                                    <span id="ThisIsaPrice">[{$fPrice}]</span>
                                    <span>[{ $currency->sign}]</span>
                                    <span>*</>
                                </strong>

  1. In the file [I]out/azure/tpl/widget/product/selectbox.tpl[/I] insert line in the beginning:
[{oxscript include="js/widgets/price.js" priority=10 }]

  1. Enjoy or fix my bugs.

Hi,

ich bin kompletter anfänger bei Oxid eSales und scheitere schon daran, dass ich den Ordner out/azure/tpl/ gar nicht habe / sehe ?!
Kann mir jemand weiterhelfen?
Liegt das an der Community Edition oder woran kann das liegen?

Grüße

Sallii

Servus Sallii,

da hast Du wohl nicht intensiv genug in den Untiefen der Verzeichnise geguckt.

application/views/azure/

Die Angabe bezieht sich wohl noch auf die 4.6.* er Version von OXID. Die Pfade haben sich in 4.7.* geändert.

Super Danke für die schnelel Antwort.

Jetzt stellt sich für mich nur die Frage:

Um die Dynamische Anpassung zum laufen zu bringen, nehme ich dazu den Code der ganz am Anfang dieses Threats beschrieben wird oder das ganz zum Schluß, oder beides?!

Und eine details.tpl habe ich auch noch nicht gefunden…

Wenn Du das Basic Template verwendest, das am Anfang, bei Azure natürlich das am Schluß.

okay danke. Werde nacher mal mein Glück versuchen.

Ich habe einfach den Shop installiert (mit Demo) und da war Azure schon drin…

So ich habe es versucht, leider ohne Erfolg. Habe alles so ersetzt und geändert wie es oben beschrieben wird.

Die thisisaprice Funktion wird auch verwendet.

Aber eine neuberechnung des Preises bei Verwendung von Auswahllisten erfolgt nicht :frowning:

Hat es schonmal bei jemandem funktioniert?

Gibt`s einen Link?

klar :slight_smile:

http://www.styleyourdogs.de/Bekleidung/Fashion/Accessoires/Kuyichi-Lederguertel-JEVER.html

Das ist ein Artikel auf den ich zwei Auswahllisten gelegt habe. Aber es passiert nichts wenn ich was auswähle mit dem Preis.

Die Pro-Version willst wahrscheinlich nicht haben?

Ok, hab schon verstanden, aber auch so klappt`s mit dem Nachbarn. Anhang einfach ersetzen. :wink:

Hi,

WOW Danke.

Das Forum hier ist ja echt super, dass einem hier so geholfen wird.

habe das price.js ersetzt. und es funktioniert fast einwandfrei. Er berechnet jetzt tatsälich live den Preis. Nur bei manchen konstellationen ( ich habe aktuell auf dem einen Produkt zwei Auswahllisten) erscheint statt dem entsprechenden Preis nur "NaN €"
Könnte mir vorstellen dass das auch an irgendeinem Fehler in den Auswahllisten liegt, aber ich habe sie jetzt so angepasst, dass die erste Auswahl keinen Aufschalg hat und trotzdem passiert es manchmal.

hier der Link zum Artikel: http://www.styleyourdogs.de/Bekleidung/Fashion/Accessoires/Kuyichi-Lederguertel-JEVER.html

Weis jemand woran das liegen könnte?

Dann passe folgende Funktion noch so an. Sollte für den Hausgebrauch reichen ;):

$('#productSelections > div > p > span').each(function(i){
    if (i != curItemIndex) currentModx = parseFloat(currentMod) + parseFloat( getAmount($(this).text()));
	if(currentModx == "" || isNaN(currentModx)){currentModx = 0.00};
	price = parseFloat(Math.round(currentModx * 100) / 100) +  parseFloat(Math.round(basePrice * 100) / 100);
});

Hi,

Super Danke. Es funktioniert. Zwar erfolgt die Berechung erst wenn alle Auswahllisten einmal geklickt wurden, was n bissl strange ist, aber wenn überall was ausgewählt wurde berechnet er.
Ka woran das liegt.

Die Vorauswahl einer kostenpflichtigen Auswahl halte ich für sehr undurchsichtig, wenn nicht sogar abmahnfähig. Das geht natürlich auch, aber dann muss das Skript etwas anders ansetzen.

Naja es gibt ja die Grundausstattung, deren Preis ja von anfang an angegeben ist. Möchte man sozusagen zusätzliches haben, kostet das Aupdreis und man kann es in den Auswahllisten dazu konfigurieren.

Was ist das Problem?

Moin sallii,

ich denke mal, Rubbercut meint, dass dann in der Grundausstattung der Startpreis drin ist.
Dann sind schon kostenpflichtige Auswahllisten vordefiniert (ist eben die erste Auswahl) und wenn ich dann den Artikel einfach in den Warenkorb klicke steht beim Preis nicht 20,00 Euro (Grundausstattung) sonder 30,00 Euro (die vordefinierten kostenpflichtigen Auswahllisten mit Aufpreis).

Beste Grüsse

Thomas

Wenn die erste Auswahl nichts kostet, gibt es kein Problem und das Skript funktioniert dann auch, denn wie festgestellt, arbeitet das Skript passiv und reagiert auf Click :rolleyes:

da bin ich aber erleichtert.

Die erste Auswahl ist immer ohne Aufpreis.

Das einzige “Problem”: Belässt der Kunde eine Auswahl wie sie ist und ändert nur eine andere, berechnet sich der Preis nicht.
Er muss erst jede Auswahl einmal angeklickt haben, auch wenn er an der Grundauswahl nichts ändern will, damit sich der Preis neu berechnet.

Hoffe das ist so verständlich?

OK, zum Feierabend. Jetzt ist aber Feierabend…ungetestet, sollte aber gehen :cool:

Funzt! Top! Danke!

RubberCut du hast schon ziemlich drauf?! :slight_smile: