Preisverändung im Produkt mit Auswahllisten?

Hallo,

durch Auswahllisten wird der Preis nicht direkt in der Produktbeschreibung geändert und nur im Warenkorb, wenn die folgende Einstellung gemacht wurde:
Stammdaten -> Grundeinstellungen -> Perform. -> Erweiterte Performance-Einstellungen -> Preisänderungen durch Auswahllisten unterstützen

Mit den folgenden Anpassungen sollte auch der Preis in der Seite mit der Produktbeschreibung geändert werden:

1.) Unter “/out/azure/src/js/widgets” die Datei “oxdynamicprice.js” ablegen

/*

 *    Please retain this copyright header in all versions of the software
 *
 *    Author Thomas Röstel | 2012 | Version 1.0
 *
 *    This program is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program.  If not, see {http://www.gnu.org/licenses/}.
 
 */

( function ( $ ) {

    oxDynamicPrice = {

        _create: function(){
             
            var productPriceElement = $('#productPrice span:first');
            var productPriceString = productPriceElement.text();
            var productPriceOriginal = oxDynamicPrice.extractPrice(productPriceString);

            this.head               = this.element;
            this.oxDropDown         = this.head.parent( 'div' );
            this.valueList          = this.oxDropDown.children( 'ul' );
            
            var surcharges = oxDynamicPrice.initSurcharges();

            oxDynamicPrice.updatePrice(productPriceOriginal,surcharges);
            oxDynamicPrice.bindSelectionList(productPriceOriginal,productPriceElement);

        },
        initSurcharges : function()
        {
            var selectedValues = $('#productSelections ul li a[class="selected"]');
            var surcharges = [];
            
            $.each($(selectedValues), function(i, field) {
                
                var aufschlag = field.innerHTML.replace('.', '').replace(',', '.');

                var p = new RegExp('.*([-+]\\d+.\\d+)',["i"]);
                
                aufschlag = p.exec(aufschlag);
                                
                if(aufschlag) {
                    aufschlag = parseFloat(aufschlag[1]);
                } else {
                    aufschlag = 0;
                }
                surcharges[i] = aufschlag;
            });
            return surcharges;
        },
        extractPrice : function(price)
        {
            return parseFloat(price.replace(/\./g, '').replace(/,/g,'.').replace(/[^\d\.]/g,''), 10);
        },
        updatePrice : function(originalPrice, surcharges)
        {
            if(surcharges.length>0) {
                var productPriceAdjusted = originalPrice;
                for(var i = 0; i < surcharges.length; i++) {
                    productPriceAdjusted += surcharges[i];
                };
                $('#productPrice span:first').text(productPriceAdjusted.toFixed(2).replace('.', ','));
            }
        },
        bindSelectionList : function(originalPrice)
        {
            $.each($('#productSelections ul li a'), function() {
                $(this).bind('click', function() {
                    var surcharges = oxDynamicPrice.initSurcharges();
                    
                    var aufschlag = $(this).text().replace('.', '').replace(',', '.');

                    var i = $(this).parent().parent().prev().attr('name').replace(/[^\d\.]/g,'');
                    var p = new RegExp('.*([-+]\\d+.\\d+)',["i"]);
                    aufschlag = p.exec(aufschlag);
                                        
                    if(aufschlag) {
                        aufschlag = parseFloat(aufschlag[1]);
                    } else {
                        aufschlag = 0;
                    }
                    surcharges[i] = aufschlag;
                    
                    oxDynamicPrice.updatePrice(originalPrice,surcharges);
                });
            });
        }
    }    

    $.widget("ui.oxDynamicPrice", oxDynamicPrice );

})( jQuery );

2.) Am Anfang der Datei "/application/views/azure/tpl/page/details/inc/productmain.tpl folgende Zeilen einfügen

[{oxscript include="js/widgets/oxdynamicprice.js"}]
[{oxscript add="$( '#productSelections' ).oxDynamicPrice();"}]

Allerdings wird dann hinter dem Preis “NaN” angezeigt, was auf einen fehlerhaften Wert hindeutet. Der Fehler entsteht vermutlich in Zeil 75 von “oxdynamicprice.js”. Dies wurde bereits geprüft, indem Zeile 75 in $(’#productPrice span:first’).text(‘Test’); geändert wurde.

Das ganze wurde getestet mit Oxid CE 4.9.9

Kann mir an dieser Stelle bitte jemand weiterhelfen? Was ist in dem Script falsch damit hinter dem Preis “NaN” angezeigt wird und nicht der gesamte Betrag durch einen Wert ersetzt wird?

Schon mal vielen Dank und allen ein gutes Wochenende :wink:

P S
Das Original zum Skript ist zu finden unter:
https://github.com/thomasroestel/Oxid_DynamicPrice
Getestet unter Oxid CE/PE 4.6.x

zwischen 4.6.x und 4.9.x hat sich einiges getan. Das wird vermutlich nicht mehr ohne weiteres laufen.

Vielleicht war das Script nur dazu da um einen Bug in der 4.6.x zu fixen? Ich hab die alte Version nicht mehr so in Erinnerung.
Würde der Preis für einen Artikel aus der Auswahlliste nur korrekt im Warenkorb erscheinen und auf der Produktseite der falsche Preis stehen wäre das ein grober Bug. Bei meinen OXID-Shops ist mir dieses Verhalten noch nicht aufgefallen.

Oder ich versteh Dich komplett falsch und wir reden aneinander vorbei.

Kann ich nicht bestätigen, gerade getestet: OXID 4.10.1 und Azure Theme.

Funktioniert nach wie vor Fehlerfrei. Überprüfe ID und HTML Aufbau und passe das Skript dementsprechend an.

Grüße
Rafig

Hallo,

vielen Dank für die tolle Beteiligung und Rückmeldungen :slight_smile:

@OXID-Design: Der Tipp mit ID’s und HTML Aufbau war sehr gut. Wir verwenden nämlich ein eigenes Theme, dass allerdings kompatibel zum Azure ist. In diesem Theme steht der Produktpreis in einem

<strong></strong>

weshalb im Script in den Zeilen 28 und 75 “span:first” in “strong:first” geändert werden musste…

Das Skript wurde jetzt mit Oxid CE 4.9.9 und 4.10.1 getestet. In beiden Versionen funktioniert die Originalversion ohne Veränderungen im Azure-Theme!

@MeisterYoda: Also der Aufpreis wird schon in der Auswahlliste angezeigt, aber der ursprüngliche Betrag nicht entsprechend erhöht. Ebenfalls getestet mit Oxid CE 4.9.9 und 4.10.1. Außerdem gibt es zu dem Thema mehrere Beiträge die das Problem behandeln:
http://forum.oxid-esales.com/showthread.php?t=2069
http://forum.oxid-esales.com/showthread.php?t=4907
Sollte die Preis-Aktualisierung tatsächlich ohne dieses Script funktionieren, welche zusätzliche Einstellung ist dann notwendig?

Wie bereits erwähnt “Preisänderungen durch Auswahllisten unterstützen” ist aktiviert, womit allerdings nur der Preis in Warenkorb und nicht auf der Produktseite aktualisiert wird.!

Nochmals allen ein angenehmes Wochenende…

[QUOTE=cyberduk;183141] Also der Aufpreis wird schon in der Auswahlliste angezeigt, aber der ursprüngliche Betrag nicht entsprechend erhöht. [/QUOTE]

Du hast recht, ich konnte das eben im Demoshop mit Flow-Theme reproduzieren. Da sind grobe Bugs drin.

In einem Live-Shop der auf CE 4.8.x läuft funktioniert es einwandfrei.

[QUOTE=MeisterYoda;183189]
In einem Live-Shop der auf CE 4.8.x läuft funktioniert es einwandfrei.[/QUOTE]
Dann ist da wohl das Skript drin, die Funktion gab es da auch nicht im Standard.

[QUOTE=leofonic;183191]Dann ist da wohl das Skript drin, die Funktion gab es da auch nicht im Standard.[/QUOTE]

sicher? Das Script kenn ich jedenfalls nicht, hab es auch nicht installiert und im Frontend funktioniert alles so wie es soll.

Sag doch mal die Url.

Hallo!

da ich eine absolute Null in Sachen Javascript bin, kann mir bitte einer sagen wie ich das € * einbinden kann.
Das Script unterschlägt dies leider!

Vielen Dank
Steffen Winde

Hallo ich habe es jetzt selbst herausbekommen!

Falls jemand mal darüber stolpert hier die Lösung:

Zeile 76 im Script erweitern mit

$('#productPrice strong:first').text(productPriceAdjusted.toFixed(2).replace('.', ',' )[B]+ " \u20ac" + " *"[/B]);

Hallo,

leider bin ich nicht der Experte für Java Skript. Kann mir jemand dabei helfen das Skript dahingehend anzupassen, dass auch die Berechnung für einen Preis Auf/Abschlag in % erfolgt?

Vermutlich ist es nur eine kleine Änderung in der Funktion "initSurcharges und “bindSelectionList” Hier müsste dann vermutlich nur der Prozentwert mit dem Preis verrechnet werden:


var aufschlag = field.innerHTML.replace('.', '').replace(',', '.');
var p = new RegExp('.*([-+]\\d+.\\d+)',["i"]);
               
aufschlag = p.exec(aufschlag);

Wie ist das möglich, kann jemand helfen?

Falls jemand so nett ist und das Skript direkt anpassen möchte, würde ich das ganze in ein Modul packen und hier kostenlos zur Verfügung stellen. So hätten alle etwas davon :wink:

Schon mal vielen Dank fürs lesen.

Hallo,
das Java-Skript funktioniert ja mit absoluten Preisangaben problemlos. Deshalb war meine überlegung an dem Skript nichts zu ändern. Dafür bei einem Preis Auf/Abschlag in % weiterhin den Prozentwert (Betrag) und nicht den Prozentsatz anzuzeigen. Wie kann aber jetzt der Prozentwert bzw. Betrag ermittelt werden?

Die Auswahlliste wird auf der Produktseite (“productmain.tpl”) unter “/application/views/azure/tpl/page/details/inc” in Zeile 179 eingebunden:


[{include file="widget/product/selectbox.tpl" oSelectionList=$oList iKey=$iKey blInDetails=true}]

Die Einträge (“selectbox.tpl”) der Auswahlliste unter “/application/views/azure/tpl/widget/product” werden in Zeile 33-37 hinzugefügt:


[{foreach from=$oSelections item=oSelection}]
    <li class="[{if $oSelection->isDisabled()}]js-disabled disabled[{/if}]">
        <a data-selection-id="[{$oSelection->getValue()}]" href="[{$oSelection->getLink()}]" class="[{if $oSelection->isActive()}]selected[{/if}]">[{$oSelection->getName()}]</a>
    </li>
[{/foreach}]

Der entsprechende Preis Auf/Abschlag (€ oder %) wird so hinzugefügt:


[{$oSelection->getName()}]

1.) Wie kann der Wert aus “$oSelection->getName()” zwischen € oder % unterschieden werden?
2.) Wie kann der eigentlichen Preis ermittelt werden um den Auf/Abschlag zu berechnen?

Für jeden weiteren Tipp bin ich dankbar!

Schon mal allen einen guten Start ins Wochenende :wink: