Virtuemart: Shopping mit nicht-Registrierung

Dieser Tage bin ich über ein interessantes Virtuemart Phänomen gestoßen (halt - gestolpert muss es heißen!). Ich weiß nicht, ob man es Bug nennen sollte oder logisches Problem - ich halte es eher für eines, das in eher unüblichem Kontext und auch erst nach ca. 60 Testläufen in Folge auftritt. (und das ist, behaupte ich mal, auch ein eher ungewöhnliches Testszenario).

Checkout (als one Step) ohne Benutzerregistrierung…

Das Problem

Es passierte, dass in genanntem Szenario (Shopping ohne Registrierung) mit einem One Screen Checkout - an den ich lange “hindesignt” hatte - hier fließen derzeit meine Erfahrungen in die Virtuemart Serie ein, plötzlich nach einiger Zeit der Basket nicht mehr angezeigt wurde - der ja nun doch irgendwie als letzter Checkup Sinn macht, bevor der Kunde den finalen “Bestellbutton” klickt.

Ich war mir ganz sicher, nichts an einer der beteiligten Schrauben gedreht zu haben und trotzdem - wie von Zauberhand war der Basket weg, es wurden nur noch Rechnungsadresse, Lieferinformationen, Bezahlmodus und Versand angezeigt. Zeit zum Debuggen.

Meine erste Spur: die checkout_index.php in /administrator/componentes/com_virtuemart/html.

if( $auth['user_id'] > 0 ) {
$show_basket = true;
} else {
$show_basket = false;
}

Hier liegt noch nicht die Lösung - aber das Problem. Denn der Debugmodus verrät: die UID, also die User ID, die dem nicht registrierten Benutzer, trotzdem aber registrierten Käufer (der ja auch erfasst werden muss!), zugewiesen wird, ist negativ(und war es vorher nicht).

Durchhangeln hilft… und das heißt, ein Blick in die basket.php und schließlich in die ps_shopper.php in /administrator/componentes/com_virtuemart/classes - dort wird die Registrierung neuer Kunden abgewickelt: Funktion add() ca. Line264 und dort dann irgendwann:

// If no user shall be registered into the global user table, we just add the registration info into the vm_user_info table
// Make sure that "dummy" entries for non-existing Joomla! users won't ever have the same user_id as a future Joomla! user
$db->query( "SELECT MIN(user_id)-1 as uid FROM `#__{vm}_user_info`" );
$db->next_record();
// Don't allow a user id of zero
$uid = ( $db->f('uid') == 0 ) ? -1 : $db->f('uid');

Ein Blick hinter diesen Code:

Zunächst wird die kleinste UID der Benutzertabelle aus der Datenbank und eins abgezogen: die kleinste UID, die bei nur einem registrierten User möglich ist, ist die 62.  Dann wird sichergestellt, dass diese ungleich Null ist - denn Null entspricht dem unbekannten Besucher. Ist diese UID ungleich Null, so wird die für den nicht registrierten Käufer verwendet.

Nun ist vollkommen klar: diese Funktion zählt rückwärts, landet irgendwann bei Null und dann bei minus 1. Und damit werden die UIDs nach ca 60 vorgenommenen Bestellungen durch nicht registrierte User negativ.

Die Lösung

Die Lösung liegt zunächst in der checkout Datei: Man muss nämlich lediglich

if( $auth['user_id'] > 0 ) {
$show_basket = true;
} else {
$show_basket = false;
}

ersetzen durch (Achtung UPDATE am 11.08 abends!)

if( $auth['user_id'] != 0 ) {
$show_basket = true;
} else {
$show_basket = false;
}

oder auch

if( $auth['user_id']) {
$show_basket = true;
} else {
$show_basket = false;
}

(Danke Sören noch für diesen Hinweis, finde ich eleganter - … der Sören weiß mein Coding schon zu nehmen) und schon ist alles “im grünen Bereich” - für immer.

Das Problem ist bekannt und ich überlege mir derzeit, ob das Fixing wirklich ausschließlich in der checkout liegt, oder ob man nicht anderweitig folgendes sicherstellen kann, dass (ich habe den Kommentar absichtlich mitgezogen)
“Make sure that “dummy” entries for non-existing Joomla! users won’t ever have the same user_id as a future Joomla! use”. Denn irgendwas sagt mir, dass man das Gemisch aus positiven und negativen UIDs vielleicht vermeiden sollte…?

Ich bin gespannt, für was man sich hier entscheiden wird. Mein erster Impuls war der Start nicht registrierter Kunden bei 100.000 oder sowas - aber auch das bringt irgendwie Unsicherheit mit. Besser wäre das vielleicht eine Lösung, die für nicht registrierte User gleich im negativen Bereich anfängt?

Inzwischen behelft Euch bitte für den Fall der Fälle mit oben beschriebenem Workaround…

 

4 Antworten zum Beitrag “Virtuemart: Shopping mit nicht-Registrierung”

  1. am 11 Aug 09 um 19:06 meint

    Martin

    Mhh, ich habe zwar nicht viel Ahnung von PHP-Programmierung, aber die beiden Varianten der Lösung scheinen mir nicht äquivalent zu sein. Sollte es unten nicht besser heisen?

    if (!$auth['user_id']) {
    $show_basket = false;
    } else {
    $show_basket = true;
    }

    Die Abfrage mit dem negierenden ! fragt IMHO ab, ob die user_id geich 0 ist, nicht ungleich. Daher habe ich die show_basket-Zuweisungen kurzerhand vertauscht.

    Kürzer ginge es übrigens vermutlich wie folgt?

    $show_basket = $auth['user_id']!=0;

    Zumindest in C könnte man das so formulieren - was eher meine Sprache ist. ;-)

    Grüße,

    Martin

  2. am 11 Aug 09 um 19:11 meint

    Anne-Kathrin

    Danke für den Hinweis Martin - ich habs gleich korrigiert.
    Im Eifer des Gefechts.
    Der Fehler liegt natürlich übrigens bei mir und dem Tippen und nicht bei Sören (der kann das;-))…

  3. am 28 Jan 10 um 17:57 meint

    Christian

    Das Problem habe ich auch, auch wenn es mir bereits vor der Erstellung des 60ten nicht registrierten Kunden aufgefallen ist, als ich in die user_info geschaut habe. Ich vermute im übrigen, dass die negativen user_ids weitere Probleme als das angesprochene mit sich bringen, auch die 0 spielt da glaube ich noch eine Rolle. Allerdings ist mir auch noch keine Lösung eingefallen weil mir die negativen User-Ids ebenfalls widerstreben. Was also tun? Hat jemand noch eine clevere Idee?

  4. am 17 Mrz 10 um 11:56 meint

    Hallo Zusammen,

    ich habe so ein Problem.

    Wenn ich mich einen neuen Kunde sowohl in Virtuemart als auch in Joomla registriere, kommt immer gleich Registrationseite. d.h. wurde nicht registriert.Ich habe überall geguckt aber kein Lösung gefunden.
    in Global Einstellungen:
    Benutzerregistrierung erlauben: JA
    Aktivierung neuer Konten: Nein.

    ich habe auch im Datenbank geguckt, sah alles normal aus.

    könnte jemand mir helfen???

Auch was dazu sagen?