Dynamische Preisanpassung bei Auswahllisten

Ja, beides in die details.tpl. Eigentlich kann er hier keinen Syntax-Fehler bringen, da das ein ganz normaler Smarty-Befehl ist…

Hallo zusammen,

ich hoffe ihr könnte mir weiter helfen, weil ich echt nicht weiß, was ich falsch gemacht habe! ? :confused:

Ich habe euer Script den Angaben nach eingebunden und immerhin meckert er nicht oder dergleichen. Das Script funktioniert also. Nur befindet sich nichts in den “rel” und “rev” Attributen:


 <select id="test_select_d946ed863538c32f903f938aa390acb2_1" name="sel[1]" onchange="change_price(this);">
<option value="1" rel="" rev="1">mit Aufpreis</option>
<option value="2" rel="" rev="1">ohne Aufpreis</option>
</select>

In der Auswahlliste existiert aber ein Aufpreis von 9.95€… nur kommt der irgendwie nicht bis zum Frontend an. Kann mir einer sagen, was ich falsch mache, oder nen Tipp geben, wo man eventuell mal nachgucken könnte? Vielleicht hab ich was bei den Grundeinstellungen falsch eingestellt? :confused:

Ich habe die CE Version, falls das damit was zu tun hat :slight_smile:

Hat sich erledigt, ich habe in den Grundeinstellungen das Häkchen vergessen XD…sorry!

Bei mir tut sich rein garnicht!!! Hab alles wie beschrieben kopiert ausgebessert etc.

Performance: Preisänderungen durch Auswahllisten unterstützen - ist auch ON

CE-Edition: 4.4.0

Kann mir evtl. jemand helfen???

Ohne nähre Angaben läßt sich da schlecht was sagen, wo das Problem liegt.

evtl. eine URL z.B. :slight_smile:

Moin moin,

Code heute mal getestet …
Shop Version CE 4.2

Soweit so gut…ohne zufügen des Codes:

<form action=“[{ $oViewConf->getSelfActionLink() }]” method=“post”>

&lt;div&gt;

[{ $oViewConf->getHiddenSid() }]
[{ $oViewConf->getNavFormParams() }]
<input type=“hidden” name=“cl” value=“[{ $oViewConf->getActiveClassName() }]”>
<input type=“hidden” name=“fnc” value=“tobasket”>
<input type=“hidden” name=“aid” value=“[{ $product->oxarticles__oxid->value }]”>
<input type=“hidden” name=“anid” value=“[{ $product->oxarticles__oxnid->value }]”>
</div>

[{if $oView-&gt;getSelectLists() }]

klappt alles mit dem Preis (aber der Warenkorb funktioniert natürlich nicht)…gebe ich obigen code dazu …klappt nix mehr…leere weisse Seite.

Irgendwer eine Idee ?

Mfg
Andreas

Aus dem Stehgreif würd ich sagen, das er es nicht mag, wenn du innerhalb eines Formulars, ein zweites Formular aufmachst. Damit das ganze funktioniert mußt du das bestehende Formular in der details.tpl anpassen :slight_smile:

Im Internet Explorer wird, nach Einbau des Scripts, alles verschoben

Hallo,

hat jemand schon das Problem mit dem Internet Explorer behoben oder kann einen Lösungsvorschlag geben?

Danke

Gruß

… hat sich erledigt.

Code in falscher Stelle eingefügt :mad:

Gruß

hallo und vielen dank für diese sinnvolle änderung :wink:
eine kleine frage noch: wie kann ich das +XX€ entfernen im drop down???
also nur die anpassung des preises im preisfeld ohne anzeige wieviel aufgeschlagen wird

vielen dank

Hi,
absolut geniale Sache und vielen, vielen, lieben Dank!!!

Allerdings habe ich 2 Fragen…

[B]1. Geht das auch mit den “Mengenangaben”?[/B]
Beispiel:
10,58 € inkl. MwSt., zzgl. Versandkosten.
(0,88 €/Monat) <-Mengenangabe

Wähle ich jetzt aus der Auswahlliste “bliblablub + 1,00€” aus errechnet sich ja automatisch der Artikelpreis(Jahr) von 11,58 €…, jedoch verändert sich nicht die “Mengenangabe”.

Nach ein paar Versuchen das Script umzuschreiben habe ich es mangels JS-Kenntnisse leider aufgegeben müssen. Es hat sich zwar der Wert geändert, wurde aber falsch gerundet und der Artikelpreis hat sich nicht mehr automatisch verändert.:frowning:

[B]2. Wie kann ich das Script in die list.tpl einbinden?[/B]
Ich habe einfach nur mal den JS code hinzugefügt und habe eine leere weiße Seite vorgefunden :frowning:

Vielen Dank für eure Lösungen und Anleitungen!

Waiti

Zu 1.

Du willst also zusätzlich zum Preis, die Mengenangabe ändern ?

Dann musst du das entsprechende Feld in der Funktion “CalculateAndUpdate” mit berücksichtigen und entsprechend anpassen.

Zu 2.

Genauso wie in der Details. Du mußt nur die id des feldes im Template mit an den
onchange-handler einbauen und die Funktionen change_price und CalculateAndUpdate
anpassen, so das die Feld-Id entsprechend berücksichtigt wird.

[QUOTE=Uwe rupprecht;51894]Zu 1.

Du willst also zusätzlich zum Preis, die Mengenangabe ändern ?

Dann musst du das entsprechende Feld in der Funktion “CalculateAndUpdate” mit berücksichtigen und entsprechend anpassen.
[/QUOTE]

Ja möchte ich
habe ich versucht aber ich bekomme das nicht richtig angezeigt. Könntest du mir das kurz umschreiben wie es auszusehen hat?
“Nach ein paar Versuchen das Script umzuschreiben habe ich es mangels JS-Kenntnisse leider aufgegeben müssen…”

[QUOTE=Uwe rupprecht;51894]
Zu 2.

Genauso wie in der Details. Du mußt nur die id des feldes im Template mit an den
onchange-handler einbauen und die Funktionen change_price und CalculateAndUpdate
anpassen, so das die Feld-Id entsprechend berücksichtigt wird.
[/QUOTE]
:confused: Wie soll ich denn das anstellen:D

Vielen Dank für deine Antwort!

Zu 1.
Orginal:


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);
   } 

wird in etwa:


function CalculateAndUpdate(){
        var price_field = document.getElementById("test_product_price");
        var amount_field = document.getElementById("test_product_amount");
        var m = prices.length;
        var cur_price=0;
        for (i=0;i <= m;i++){
            if (prices[i]){
                cur_price += prices[i];
            }
        }
        var myamount = amount_field.value;
        myamount += 1;
        amount_field.value = myamount;
        price_field.innerHTML=formatCurrency(cur_price);
   } 

Zu 2:

Im Template, such dir die stelle, an der die Listen eingebaut werden und statt


<select id="test_select_[{$product->oxarticles__oxid->value}]_[{$iSel}]"  
      name="sel[[{$iSel}]]" onchange="change_price(this);"> 

machst du


<select id="test_select_[{$product->oxarticles__oxid->value}]_[{$iSel}]"  
      name="sel[[{$iSel}]]" onchange="change_price(this,'ID_PREIS_FELD');"> 

Damit übergibst du die ID des Preisfeldes an die funktion change_price. Die sollte so ungefähr aussehen:


   function change_price(selectobj,priceid){
   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(priceid);
    } 

Sie reicht also einfach die ID weiter an CalculateAndUpdate weiter. Die sollte ungefähr so aussehen:


 function CalculateAndUpdate(priceid){
        var price_field = document.getElementById(priceid);
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);
   } 

Das ganze ist aus der hohlen Hand und nicht getestet, sollte dir aber den grundsätzlichen Weg zeigen :slight_smile:

Hi Uwe rupprecht,
ich versuchs mal und melde mich auf jeden Fall nochmal wenn’s fertig ist!

Schon mal vielen Dank und bis später!

Waiti

Hmm… hallo nochmal,
beim 1 habe ich noch probleme.
Ich habe es wie folgt umgeschrieben:

			function CalculateAndUpdate(){
        var price_field = document.getElementById("test_product_price");
        var price_unit_field = document.getElementById("test_product_price_unit");
        var m = prices.length;
        var cur_price=0;
        for (i=0;i <= m;i++){
            if (prices[i]){
                cur_price += prices[i];
            }
        }
        var myamount = price_unit_field.value;
        myamount += 1;
        price_unit_field.value = myamount;
        price_field.innerHTML=formatCurrency(cur_price);
   }

So ändert sich nur der Ursprungspreis aber die Mengenangabe bleibt unverändert.

Zu2

in der list.tpl gibt es nicht solch eine Zeile:

<select id="test_select_[{$product->oxarticles__oxid->value}]_[{$iSel}]"  
      name="sel[[{$iSel}]]" onchange="change_price(this);">

Den einzigen select den ich finden kann ist:

<select name="attrfilter[[{ $sAttrID }]]" onchange="oxid.form.send('_filterlist');">

Diesen habe ich einfach mit dem den du mir geschrieben hast ersetzt.
Ich konnte dann zumindest noch die Seite sehen…

…Dann habe ich das Script eingefügt:

<script type="text/javascript">
					function toFloat(aString){
						var dezimals="[{$currency->dec}]";
						[{if $currency->thousand != ""}]
							aString=aString.replace(/\[{$currency->thousand}]/g,"");
						[{/if}]
						if ((dezimals != '.') && (dezimals !="")){
								aString=aString.replace(/\[{$currency->dec}]/g,".");
						}
						return parseFloat(aString);
					}
		</script>		
		<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]=toFloat("[{$product->getFPrice()}]");

				/*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;
				}
				if (num.length > 3){
					count=num.length%3;
					for (i=0;i<count;i++){
						p = num.length-((i*3)+3);
						num=num.substr(0,p)+thousand+num.substring(p);
					}
				}
				if (cents=="00"){
					cents="-";
				}
				return trim((((numsign)?"":"-") + num + dezimals + cents))+" "+sign;
			}

			/* Berechnet den Preis und aktualisiert das Anzeigefeld*/
			function CalculateAndUpdate(priceid){
        var price_field = document.getElementById(priceid);
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,priceid){
   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(priceid);
    }
		</script> 

jedoch bekomme ich dann eine weiße Seite…

was mach ich falsch?
Vielen Dank nochmal für deine Hilfestellung!
Waiti

Ok…zu 2. Falsches Template. Das ganze muß in die products.tpl, da sie ja für die Darstellung der einzelnen Artikel zuständig ist.

Zu 1.


function CalculateAndUpdate(){
				var price_field = document.getElementById("test_product_price");

				var amount_field = document.getElementById("test_AmountToBasket");

				var m = prices.length;
				var cur_price=0;
				for (i=0;i <= m;i++){
					if (prices[i]){
						cur_price += prices[i];
					}
				}

				myamount = parseInt(amount_field.value);
				myamount +=1;
				amount_field.value = myamount;

				price_field.innerHTML=formatCurrency(cur_price);
			}

Darauf achten das bei getElementById die Richtige ID eingetragen ist. Ansonsten sollte das jetzt mit der Menge funktionieren. Für den Fall, das du nichtganzzahlinge Mengen erlaubst, einfach parseInt durch parseFloat ersetzen.