Problem mit sub modify_db_price "Nachtrag EDITIERT !!!"

Begonnen von dobra, November 01, 2008, 15:43:30

« vorheriges - nächstes »

0 Mitglieder und 1 Gast betrachten dieses Thema.

dobra

Hallo,

ich habe mal wieder ein "verzwicktes" Problem  ;)

Die Aufgabe:
Monatsaktion -  bei Kauf von mindestens 5 (gleichen oder verschiedenen beliebigen) Artikeln eines Herstellers 10% Rabatt.
Der rabattierte Preis soll (in Form von "alter Preis / Aktionspreis") aber nicht nur im WK angezeigt und berechnet werden, sondern auch auf den Produktseiten.

Soweit funktioniert das auch alles schon :D
Da ich die Anzahl der bereits bestellten Artikel von Herstelle "X" aber nur im WK auslesen kann, habe ich das so gelöst, daß diese Anzahl in die Warenkorbdatei geschrieben wird und im  sub modify_db_price Callback abgefragt werden kann.
ABER hier liegt das Problem  ???

sub calc1 { # alle Artikel eines Herstellers minus x% ab x Stueck
my $p = $_[0];
my $artid = $_[1];
    my $pre = ssp::db_get_prefix();
    my $MERCH = $pre . "MERCH";
    ssp::readSQLData(qq|SELECT AKTIMARKE, ABSTUECK FROM $MERCH WHERE STANDARD=1|,  "AKTIMARKE", "ABSTUECK");

    my $pf = ssp::get_var_db('AKTIFAKTOR',0); # Preisfaktor vom benutdef.  Feld des Haendlers holen
    my $marke = ssp::get_var_db('AKTIMARKE',0);
    my $von = ssp::get_var_db('AKTIONVON',0);
    my $bis = ssp::get_var_db('AKTIONBIS',0);
    my $abstueck = ssp::get_var_db('ABSTUECK',0);
if (!length($abstueck)) {$abstueck = 0}
my $sum = ssp::cart_read_var('aktistueck');
    ($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
    $mon += 1; $year += 1900; # Y2K
    my $datum = sprintf("%04d%02d%02d",$year,$mon,$mday);
   
    my $ITEM = $pre . "ITEM";
    my $SITM = $pre . "SITM";
    ssp::readSQLData("SELECT FIRMA FROM $ITEM WHERE ITEMID='$artid' UNION SELECT FIRMAV FROM $SITM WHERE ITEMID='$artid'","FIRMA");
    my $artikel = ssp::get_var_db('FIRMA',0);
    if($artikel ne $ssp::undefined && $artikel ne "" && $sum >= $abstueck){
        if ($marke ne $artikel || ($datum <= $von && $datum >= $bis))  {
            $pf = 1;   
        }
        return ($p*$pf);
    }
    else
    {
        return $p;
    }
}


Obwohl der aktuelle Wert sofort in der Cart-Datei steht, wird er erst bei nochmaligem Laden des WK bei der Abfrage my $sum = ssp::cart_read_var('aktistueck'); berücksichtigt   :(

mt hatte mal ein ähnliches Problem mit sub invoice_addpos_final ....
ahe hat das dann irgendwie gelöst - vielleicht geht das auch für mein Problem und jemand verrät mir die Lösung?

Nachtrag (editiert):
Es hat offensichtlich garnichts mit cart_read_var zu tun ...
Wenn ich diesen Wert auslese, wird er sofort - also bei Artikel in WK legen oder Menge ändern - korrekt ausgegeben
<!--spmacro:module(show)
sub test {
my $sum = ssp::cart_read_var('aktistueck');
main::mprint $sum;
}
-->

Das Problem ist also scheinbar das Callbackscript, das erst nach dem Laden der Seite ausgeführt wird  :-\
<!--spmacro:module(Callback)            
sub modify_db_price {
...
(steht in stdall)

Wie kann ich das lösen?
mfG
dobra

dobra

nach oben schieb - hat wirklich niemand einen Lösungsvorschlag?
mfG
dobra

mt

Hallo dobra,

Zitatmt hatte mal ein ähnliches Problem mit sub invoice_addpos_final ....

wir hatten doch bei meinem Problem eine Brückenseite gebaut.

Heißt auf einer leeren Seite wird diese Funktion ausgeführt und
danach die Weiterleitung auf den Referer gemacht.

Hier nochmal Deine Antwort:
http://www.shoppilot.net/pf/ssp_shop_server_pages/invoiceaddposfinal-t1102.0.html;msg4119#msg4119

Hoffe dass Dir das weiterhilft.

Gruß
mt

dobra

Hallo mt,

nein, in diesem Fall kann ich leider keine Brückenseite verwenden, da ich das Problem ja nicht nur bei Artikelanzahl im WK ändern habe, sondern auch wenn ein Artikel von einer beliebigen Detailseite aus in den WK gelegt wird.
mfG
dobra

ahe

Hallo dobra,

habe mir das Problem mal angeschaut (in einem Demoshop) und kann folgendes festellen:

- beim Aufruf des Callbacks ist die Warenkorbdatei aktuell (heisst: beinhaltet neue Artikel)
- ssp::cart_read_var öffnet die Warenkorbdatei beim Funktionsaufruf (heisst: es werden die aktuellen Daten auch zurückgegeben)
- modify_db_price wird immer aufgerufen BEVOR irgendetwas ausgegeben wird (heisst: zum Zeitpunkt der Ausgabe wurde das Callback schon ausgeführt)

Folglich scheint irgendwo anders noch ein Fehler aufzutreten.
Ich würde empfehlen im Callback mal genaue Logausgaben (plog) einzubauen, sodass Sie nachvollziehen können,
wann welche Variablen welchen Inhalt haben und welcher Programmablauf dadurch erfolgt.

Bsp (natürlich noch zu komplettieren ;)):
my $artikel = ssp::get_var_db('FIRMA',0);
    main::plog("D, artikel=$artikel\n");
    if($artikel ne $ssp::undefined && $artikel ne "" && $sum >= $abstueck){
        main::plog("D, zweig1 (sum=$sum; datum=$datum)\n");
        if ($marke ne $artikel || ($datum <= $von && $datum >= $bis))  {
            $pf = 1;   
        }
        main::plog("D, returning -".($p*$pf)."-\n");
        return ($p*$pf);
    }
    else
    {
        main::plog("D, zweig2 (sum=$sum)\n");
        main::plog("D, returning -$p-\n");
        return $p;
    }
MfG ahe

dobra

Hallo ahe,

Danke für den Code - hab ihn eingebaut
(Ergebnis kommt per Mail - die Details sind hier vermutlich ausführlich  ;))
mfG
dobra

dobra

EDIT - diesen Fehler gefunden   ;)

1) Callback begin_read_template  wird korrekt ausgeführt   :D
- aber
2) modifiy_db_price funktioniert noch immer nicht (erst nach neuladen der WK Seite)  :(
mfG
dobra

ahe

Hallo dobra,

ich tippe immer noch darauf, dass irgendwo die Funktion begin_read_template schon definiert wurde,
und deshalb die 2. (neue) Funktion ignoriert wird.
MfG ahe

dobra

Hallo ahe,

hab DIESEN Fehler gefunden und Beitrag gerade editiert - hat sich überschnitten  ;)
Aber Punkt 2) funktioniert leider noch immer nicht  ???
mfG
dobra

ahe

Ich schlage vor wir machen morgen per Mail weiter.
Ist doch ein *wenig* speziell Ihr Problem :D
MfG ahe

dobra

OK
gute Nacht
ich mach für heute auch Feieradend  ;)
mfG
dobra

ahe

MfG ahe