Dynamische Preisanpassung bei Auswahllisten


#31

… hat sich erledigt.

Code in falscher Stelle eingefügt :mad:

Gruß


#32

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


#33

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


#34

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.


#35

[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!


#36

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:


Dynamische Preisänderung bei Auswahllisten in PE 6.0.3
#37

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


#38

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


#39

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.


#40

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.


#41

Bei mir wurde im IE auch alles verschoben, habe nun das Script in die _header.tpl gesetzt:

<script src="[{ $oViewConf->getResourceUrl() }]dyn_cost.js" type=“text/javascript”></script>

Der Inhalt der JS Datei ist das genannte Script. Nur leider funktioniert es so nicht. Im Quelltext finde ich die Datei, welche auch ausführbar ist.

Habe ich hier einen Denkfehler?

Danke für jeden Tipp,
Carino


#42

[QUOTE=Carino;54832]Bei mir wurde im IE auch alles verschoben, habe nun das Script in die _header.tpl gesetzt:

Der Inhalt der JS Datei ist das genannte Script. Nur leider funktioniert es so nicht. Im Quelltext finde ich die Datei, welche auch ausführbar ist.

Habe ich hier einen Denkfehler?

Danke für jeden Tipp,
Carino[/QUOTE]

Hi Carino,

diesen Weg hatte ich zunächst auch gewählt, hauptsächlich weil mir das große Script im Header zu unübersichtlich war… Es funktioniert nicht über eine externe Datei da innerhalb des Scripts Daten mit smarty eingefügt werden. Da OXID “nur” die Templates Parst und nicht die externen Dateien die mit eingebunden werden (CSS oder JS Dateien), werden die Daten nicht mit smarty eingefügt und stehen dem Script dann auch nicht zur Verfügung…

Bsp:


function toFloat(aString){
		var dezimals="[{$currency->dec}]";

Mit leeren Variablen arbeitet ein Script natürlich nicht.

MFG

Jhonny


#43

hallo!
ich wollte das nun auch bei mir einbauen (vorübergehende domain: www.computer-salzburg.de).

habe den ersten teil am ende meiner details.tpl eingefügt und den zweiten teil direkt danach.

ich hatte es bei 2 templates (basic + azure) versucht, aber leider tut sich rein gar nichts. der preis bleibt bei 0,00€ stehen. den haken in den grundeinstellungen hab ich gesetzt, mir werden auch die preise der auswahlliste angezeigt und im warenkorb problemlos berechnet.

kann mir da bitte wer helfen?


#44

Hy,

verwendest du die Version 4.5.0 ??? die ist ziemlich geändert worden, und ich denke das passt da nicht mehr.

Könnte vieleicht jemand ein neues Script für die Automatische Preisaktualisierung bei den Auswahllisten erstellen?


#45

Hallo,
ich verwende bei einem Kunden auch noch Version 4.4. Habe den Code eingefügt, und soweit funktioniert auch alles, nur leider wird der neue Preis nicht an den Warenkorb übergebe. Dort wird immer der Preis des ersten Eintrags aus dem Dropdown übernommen. Was mache ich hier noch falsch?

Danke schonmal :slight_smile:

Lg,
Robert


#46

Hi zusammen,

hat das Ganze schon jemand mit prozentualen Preisaufschlägen zum Laufen bekommen?
Mir fehlt gerade irgendwie der Durchblick hierfür. Eventuell komme ich Morgen auf nen grünen
Zweig im Winter :wink: Heute ist der Kopf schon zu…


#47

<!-- PREISAKTUALISIERUNG START -->

<script type="text/javascript">

function toFloat(aString){
  var dezimals="[{$currency->dec}]";
  aString=aString.replace(/\[{$currency->thousand}]/g,"");
    if (dezimals != '.'){
      aString=aString.replace(/\[{$currency->dec}]/g,".");
    }
    return parseFloat(aString);
}	

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

/* Berechnet den Preis und aktualisiert das Anzeigefeld*/ 
function CalculateAndUpdate(ground, percent){ 

  var price_field = document.getElementById("test_product_price"); 
  var m = prices.length; 
  var cur_price=0; 
  var vground = document.getElementById("groundprice").innerHTML;
  vground = parseFloat(vground.replace(/,/g,"."));
  
    for (i=0;i <= m;i++){ 
    if (prices[i]){      
    per_price = vground / 100 * percent; 
    cur_price = vground + per_price;
    }
  }
  if (ground != false){
  price_field.innerHTML = formatCurrency(vground);
  }
  else {
  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"); 
  var ground = false;

    if (idx >=0){ 
    idx++;  
    if (opti){ 
      prices[idx] = parseFloat(opti.replace(/,/g,".")); 
    } else {  
      ground = true;
    } 
  } 
CalculateAndUpdate(ground, prices[idx]); 
} 

</script> 

So funktioniert das Ganze. Muss natürlich noch in Quellcode ein DIV mit dem Grundpreis. Vielleicht hat jemand noch ne elegantere Lösung parat…


#48

Super Arbeit. Funktioniert das ganze aber mit der 4.5.* bevor ich gegen die Wand renne :stuck_out_tongue:

Grüsse
Thomas


#49

Hallo!

Hat jemand eine Lösung für Version 4.5.x? Suche genau diese Funktion, klappt aber leider bei mir nicht.

Ciao,
Mario


#50

Hallo,

ich habe vor einer ganzen Weile die dynamische Preisänderung im Artikel eingebaut. Funktioniert 1a.

Danke schonmal dafür :slight_smile:

Interessieren würde mich, ob so etwas ähnliches auch für den Warenkorb möglich ist. Hier aber nicht für die Varianten, sondern “einfach” für die Menge.

Wenn man also seine Artikel bereits im Warenkorb ist und die Anzahl ändern möchte geht das ja natürlich bereits im Standard Oxid Shop. Das ganze aber per javascript zu realisieren wäre schon noch etwas “moderner”

Oder ist dies für einen schnellen “Hack” zu aufwendig?

Vielen Dank und viele Grüße
Thomas