Artikelpreise vergleichen klappt nicht

Hi!

Ich kenne den Bug, dass die Vergleiche vom FPrice und FTPrice nicht korrekt funktionieren und deswegen nicht passend der durchgestrichene UVP angezeigt wird, wenn der FPrice und der FTPrice sich in einer Stelle der Länge unterscheiden.

Ich habe mir da einen kleinen umständlichen Workaround gebaut, der in meinem Fall funktioniert:

[{assign var="ftpriceSchwelle" value=1000 }]
[{if $product->getFTPrice() > $product->getFPrice() || ($product->getFTPrice() > $ftpriceSchwelle->value && $product->getFPrice() != $product->getFTPrice()) }]

Jetzt brauche ich aber für eine andere Einblendung den Vergleich mit der Zahll 200, und das klappt einfach nicht.

Ich möchte also vergleichen ( in Pseudocode )

if aktuellerPreis >= 200 ODER aktuellerPreis >= 1000 ODER aktuellerPreis >= 2000 …
dann xyz

Und diese Vergleichsoperatoren wollen einfach nicht klappen.

FPrice() >= 200 , FPrice() >= ‘200’, FPrice() >= ‘200,00’ und dann mit 1000er Beträge 1000, ‘1000’, ‘1000,00’, ‘1.000,00’ - klappt alles nicht!

Jetzt habe ich gehofft, dass hier irgendwer eine Idee hat, wie man die formatierten Preise irgendwie vergleichen kann …

Ich freue mich über jede Idee!
Niklas

Vielleicht geht es, wenn du folgendes anfügst, um einen Punkt bei der Berechnung zu erhalten.


product->getFTPrice()|replace:",":"."

Ist schon eine gute Idee, aber scheint den immer noch nicht zu interessieren.
Ich versteh einfach nicht was da im Hintergrund passiert:

Wenn ich gucke, ob der FPrice >= 200 ist, kriegt der das für alle Preise von 100 bis 999,99 gebacken, aber Artikel mit einem FPrice von <= 99,99 sagt er mir, dass dieser >= 200 ist.

Das macht einfach keinen Sinn…
Ich probier weiter. Aber trotzdem Danke, die Idee war schonmal sehr gut, damit probiere ich

Bin da auch nicht wirklich fit, aber versuch doch mal eine Art Debugausgabe ala


[{math equation="x - y" x=200 y=$product->getFTPrice()|replace:",":"." format="%.2f" assign="variable"}]


[{ $variable }]

ob Berechnung grundsätzlich gemacht werden und richtig sind. Ferner versuch mal Smarty Operatoren:

http://www.smarty.net/docsv2/de/language.function.if.tpl

Das war schon einmal eine gute Idee, und zwar klappt die Überprüfung, ob der Preis über 200 Euro ist, wenn man guckt:

FPrice - 200 >= 0

Das klappt schonmal sehr gut!
Sobald aber der Preis die 1000er Marke knackt schepperts, weil SMarty meckert, das der FPrice nicht mehr numerisch ist.

Heisst für mich, dass der Preis ab 1000 als String vorliegt.
Ich guck mal weiter ob man den String in ein int machen kann und benutzen kann …

Wie ich gerade auch gesehen hab besteht der Bug bei OXID noch im aktuellen Demoshop ( 4.5.8 !! )

Vermutlich wegen dem Tausenderpunkt?

Ich komme langsam der Sache näher. Dein Tipp war wieder gut.

Und zwar steht wirklich im FPrice wenn da steht “ab 1.200,00” die “ab 1.200,00” drin und liegt somit als String vor.

Jetzt bin ich dabei zu gucken, ob dieses ab enthalten ist oder nicht. Weil wenn es enthalten kann ich nich Stringketten ersetzen, weil es eben kein String ist.

Ich such mir schon die Fingerwund, und das einzige was ich finde ist string_format. Das macht mir aber den ganzen String kaputt so das nur noch 0 enthalten sind.

Soweit bin ich:



[{if $product->getFPrice()}]
    
    	[{if !strstr($product->getFPrice(),"ab") }]
        
            [{math equation="y - x" x=200 y=$product->getFPrice()|replace:".":""|replace:",":"." format="%.2f" assign="variable"}]            
            [{ if $variable >= 0}]
            
                Über 200 euro
            
            [{/if}]
            
        [{else}]
        
        	[{math equation="y - x" x=200 y=$product->getFPrice()|string_format:"%.2f"|replace:"ab":""|replace:".":""|replace:",":"." assign="variable"}]  
            
            [{ $product->getFPrice()|string_format:"%.2f"|replace:"ab":""|replace:".":""|replace:",":"." }]
            
            [{ if $variable >= 0}]
            
                Über 200 euro
            
            [{/if}]
        
        [{/if}]
        
    [{/if}]


Im Klartext: Ich suche jetzt wie ich einen String in einen Int bekomme. Da String_format mir das Ding kaputt macht muss das irgendwie anders gehen. Wenn ich das habe kann ich die Rechnung durchführen und es müsste klappen …

Sorry, da weiß ich jetzt selbst nicht mehr weiter. Vielleicht kommst du mit substring weiter, dann beginnt der String erst nach dem ‘ab’ inkl. dem folgenden Leerzeichen. Also nach 3 Zeichen quasi.


$product->getFPrice()|substr:3

Erstmal vielen Dank für deine lange Ausdauer! :slight_smile:
Das hab ich schon hinbekommen, ich replace das ab mit einem leeren “”.

Das einzige was mir noch fehlt einen String in einen Int zu casten.
Wenn ich das hab kann ich die ganze Lösung posten weil es dann funktioniert.

Hier kriege ich den richtigen String-Preis raus:

[{assign var="aktuellerArtikelPreis" value=$product->getFPrice()|replace:"ab":""|replace:".":""|replace:",":"." }]

Und dann kracht es bei der Berechnung:

[{math equation="y - x" x=200 y=$aktuellerArtikelPreis assign="variable2"}]  

Deswegen muss ich den $aktuellerArtikelPreis in einen int bekommen. Mit (int) oder string_format klappt es einfach nicht … das ist ja zum verrückt werden

Ich antworte nochmal weil ich die Lösung hab.
Das Problem war der FPrice, wenn da steht “ab 123”, wenn der Artikel Variantenkinder hat und eben der günstigste Preis drin steht.

Das hat Probleme gemacht, weil nicht nur der Preis dann darin steht sondern wirklich “<span class…ab</span> 1.234,00”.

Deswegen muss man den ganzen Kram vorne abschneiden umd en überhaupt vergleichen zu können. Das ganze sieht so aus:



[{if $product->getFPrice()}]
        
            [{if strpos($product->getFPrice(),"ab") === false }]
            
                [{math equation="y - x" x=200 y=$product->getFPrice()|replace:".":""|replace:",":"." format="%.2f" assign="variable"}]           

             [{else}]

               [{math equation="y - x" x=200 y=$product->getFPrice()|substr:34|replace:".":""|replace:",":"." assign="variable"}]      

             [{/if}]
 
                [{ if $variable >= 0}]
                
                    Hinweis, wenn der Artikel über 200 kostet ...
                
                [{/if}]
            
        [{/if}]


Mag nicht sonderlich toll sein, aber es funktioniert.
Vielleicht für den einen oder anderen eben auch interessant, um so Artikel zu markieren die eben als Beispiel über 200€ liegen.

Viel Spaß damit!

EDIT: Hab statt strstr nun strpos benutzt, weil es laut PHP besser in der Speichernutzung ist.
EDIT2: Bei mehreren Sprachen müsst ihr das wenn irgendwie abfangen und vielleicht nicht nicht abschneiden sondern nach dem ganze Teil im String suchen und diesen ersetzen …