Warenkorb-Teilen und Warenkorb-Import, Artikelbeschränkung dort, 150 Artikel Bestell-Klick Laufzeit

Thema wurde von iloki, 25. August 2017 erstellt.

  1. iloki

    iloki Erfahrener Benutzer

    Registriert seit:
    15. August 2017
    Beiträge:
    54
    Danke erhalten:
    3
    Danke vergeben:
    3
    Hallo zusammen,

    für einen neuen Shop entwickeln wir derzeit die Möglichkeit, Bestelldaten welche parallel mit Barcodescannern erfasst werden einzulesen.
    Das Modul steht auch soweit als API-Erweiterung und greif hier auf die Systemfunktionen zu.

    Die Kaufmöglichkeit soll dem Kunden neben dem normalen Kaufen im Shop geboten werden.

    Wir nutzen derzeit dazu die folgende Funktion, welche uns die Möglichkeit gibt einen Link an den Kunden zu senden über welchen er per Klick die Artikel endgültig in seinen Warenkorb übernehmen kann.

    /**
    * Quelldatei: GXMainComponents/Services/Core/ShoppingCart/SharedShoppingCartService.inc.php
    * Stores the cart and returns the hash
    */
    public function storeShoppingCart(array $shoppingCartContent, IdType $userId = null)

    1.) Frage - die Standard-Warenkörbe werden doch ebenfalls in der DB gespeichert? Es sollte doch auch Möglich sein den Umweg zum umgehen und die Artikel direkt in den Warenkorb einzufügen, oder?

    Nun haben wir außerdem festegestellt, das über diese Funktion offentlichlich ein Limit von 49 verschiedenen Artkel nur eingefügt werden kann. Da wir gewerbliche Kunden haben, kann es vorkommen das Bestellungen auch schon mal 150 oder mehr umfassen. Es werden dann 3 Mails scheinbar a 50 Artikel generiert (im Detail läuft die Analyse gerade daher drücke ich mich etwas vorsichtig aus). Normalerweise nutzt man diese Funktion glaube für Angebote oder Empfehlungen und dergleichen.

    2.) Frage - falls dieses 49 Artikel-einfüge-Limit existiert (Warenkorb teilen) gibt es eine Möglichkeit es zu einzustellen oder umgehen?



    Fügt man nun die Artikel endgültig in seinen Warenkorb ein (im obigen Beispiel 150 Stck aus 3 Mails) und möchte diese nun bestellen scheint faktisch der Bestellbutton nicht zu funktionieren.
    Ich hatte bei 50 schon mal testweise geklickt - dauerte auch ein paar Minuten.
    Bei 150 läuft gefühlt der Browser endlos (Analyse läuft ebenfalls derzeit).

    3.) Hat dieses Problem mit dem einfügen von Artikelmengen mit 150 über einen "geteilten Warenkorb" schon mal wer gehabt? Gibt es einen Tipp wie man es beheben könnte oder woran es liegt? Vielleicht ein Bug?


    Vielen Dank für jegliche Infos
    Viele Grüße
     
  2. iloki

    iloki Erfahrener Benutzer

    Registriert seit:
    15. August 2017
    Beiträge:
    54
    Danke erhalten:
    3
    Danke vergeben:
    3
    Hallo zusammen,

    für einen neuen Shop entwickeln wir derzeit die Möglichkeit, Bestelldaten welche parallel mit Barcodescannern erfasst werden einzulesen.
    Das Modul steht auch soweit als API-Erweiterung und greif hier auf die Systemfunktionen zu.

    Die Kaufmöglichkeit soll dem Kunden neben dem normalen Kaufen im Shop geboten werden.

    Wir nutzen derzeit dazu die folgende Funktion, welche uns die Möglichkeit gibt einen Link an den Kunden zu senden über welchen er per Klick die Artikel endgültig in seinen Warenkorb übernehmen kann.

    /**
    * Quelldatei: GXMainComponents/Services/Core/ShoppingCart/SharedShoppingCartService.inc.php
    * Stores the cart and returns the hash
    */
    public function storeShoppingCart(array $shoppingCartContent, IdType $userId = null)

    1.) Frage - die Standard-Warenkörbe werden doch ebenfalls in der DB gespeichert? Es sollte doch auch Möglich sein den Umweg zum umgehen und die Artikel direkt in den Warenkorb einzufügen, oder?

    Nun haben wir außerdem festegestellt, das über diese Funktion offentlichlich ein Limit von 49 verschiedenen Artkel nur eingefügt werden kann. Da wir gewerbliche Kunden haben, kann es vorkommen das Bestellungen auch schon mal 150 oder mehr umfassen. Es werden dann 3 Mails scheinbar a 50 Artikel generiert (im Detail läuft die Analyse gerade daher drücke ich mich etwas vorsichtig aus). Normalerweise nutzt man diese Funktion glaube für Angebote oder Empfehlungen und dergleichen.

    2.) Frage - falls dieses 49 Artikel-einfüge-Limit existiert (Warenkorb teilen) gibt es eine Möglichkeit es zu einzustellen oder umgehen?



    Fügt man nun die Artikel endgültig in seinen Warenkorb ein (im obigen Beispiel 150 Stck aus 3 Mails) und möchte diese nun bestellen scheint faktisch der Bestellbutton nicht zu funktionieren.
    Ich hatte bei 50 schon mal testweise geklickt - dauerte auch ein paar Minuten.
    Bei 150 läuft gefühlt der Browser endlos (Analyse läuft ebenfalls derzeit).

    3.) Hat dieses Problem mit dem einfügen von Artikelmengen mit 150 über einen "geteilten Warenkorb" schon mal wer gehabt? Gibt es einen Tipp wie man es beheben könnte oder woran es liegt? Vielleicht ein Bug?

    Gambio 3.6.0.0 ist derzeit aktiv.


    Vielen Dank für jegliche Infos
    Viele Grüße
     
  3. iloki

    iloki Erfahrener Benutzer

    Registriert seit:
    15. August 2017
    Beiträge:
    54
    Danke erhalten:
    3
    Danke vergeben:
    3
    Leider hat mir bisher noch keiner weiterhelfen können - ich will einfach schon mal selbst meine Erkenntnisse für evtl. andere suchende als Antworten kund tun:

    zu. 1) Natürlich geht das, über die shopping_cart.php - Funktionen, in der Produkt-Einleseschleife:

    Code:
    $cartController          = MainFactory::create_object( 'shoppingCart' );
    $cartController->restore_contents();        // load the customer-basket content from database
    if ( !$cartController->in_cart($productId) )
       $cartController->add_cart( $productId, $quantity)
    else
       $cartController->update_quantity( $productId, $cartController->get_quantity( $productId ) +
    $quantity;
    
    2 Nachteile die wir bisher nicht lösen können:
    1.) Der Nutzer muss sich zum aktualisieren seines Warenkorbs aus- und wieder einloggen. Könnte man vielleicht mittels eines Overloads irgendwo hinbekommen, müssen wir noch schauen
    2.) Importiert ein Kunde per MDE 2x und enthalten die Importe vielleicht auch noch die gleichen Artikel, so erkennt die "in_cart" Abfrage im obigen Beispiel nicht die bereits vorhandenen korrekt. Ich vermute es liegt an der Session. Im Warenkorb (Tabelle customers_basket) finden sich dann übrigens 2 Einträge mit gleicher products_id, verwendet wird aber nur einer davon.

    zu 2.) Haben wir nicht weiter verfolgt, da dies nun direkt über den Warenkorb klappt.

    zu 3.) Haben wir ebenfalls nicht weiter verfolgt.
     
  4. Sergej (Gambio)

    Sergej (Gambio) Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    1. August 2016
    Beiträge:
    336
    Danke erhalten:
    205
    Danke vergeben:
    69
    Ich verstehe irgendwie nicht ganz, wohin deine Reise gehen soll und über welche Steine du stolpern möchtest..., aber

    Nein muss er nicht.

    Nein liegt es nicht.


    Zu 1.) Der Warenkorb wird in der Datenbank hinterlegt.
    Meldet sich der Kunde ab und wieder an, wird der Warenkorb im Prinzip aus der Datenbank wieder befüllt.
    Verliert der Kunde seine Session weil dieser evtl. den Browser Cache geleert hat, geschieht das gleiche, als ob der Kunde sich ab-, und wieder anmelden würde.


    Zu 2.) Der Warenkorb prüft ob eine Eindeutige-Artikel-ID bereits vorhanden ist.
    Trifft dies zu, wird die Menge erhöht.
    Trifft dies nicht zu, wird der Artikel hinzugefügt.
    Dabei musst dir erst bewusst werden, das die Artikel-ID nicht die ID ist, die man als erstes vermuten würde (z.B. 123 Anhand der products_id aus der products-Tabelle).
    Vielmehr kann es eine Zusammensetzung aus weiteren Bestandteilen sein, wie z.B. 123{1}{345}#xyzHauMichTot.

    Ich weiß jetzt natürlich nicht, wie deine Artikel aussehen, ob diese Attribute und/oder Eigenschaften haben, etc.

    Vielleicht kann dir besser geholfen werden, wenn du dein Vorhaben step-by-step nochmal erläuterst :)
     
  5. iloki

    iloki Erfahrener Benutzer

    Registriert seit:
    15. August 2017
    Beiträge:
    54
    Danke erhalten:
    3
    Danke vergeben:
    3
    Meine Reise führt dahin dem Kunden zu ermöglichen, neben manuellem Artikelerfassen im Shop diese auch per (bereits im Einsatz befindlichern) MDE-Barcodescanner zu ermöglichen. Die Daten werden uns von den Geräten zum Import übermittelt - was soweit auch gut klappt.

    Zu Beginn hatten wir die Artikel in einen Warenkorb eingefügt, welchen wir über die Warenkorb-Teilen Funktion an den Kunden gemailt haben. Nach Bestätigung des Links aus der E-Mail landeten diese im Warenkorb.
    Dort galten scheinbar die obig beschriebenen Einschränkungen: maximal 50 Artikel je geteiltem Warenkorb etc.


    Da wir uns den Klick noch sparen und direkt die Artikel im Warenkorb vorfinden wollten haben wir dies nochmals umgestellt auf die entsprechenden "shopping-cart" Funktionen.

    Definitiv muss er dies, zumindest wenn wir über den obigen Weg die Artikel einem bereits angemeldeten User in den Warenkorb legen.
    Es scheint so als würde die Warenkorb-Artikel nur mit dem Login aus der DB geladen.

    Danke, das ist größtenteils bekannt. Du sprichst vermutlich vom products_modell (Artikelnummer) vs products_id (Datensatzkennung). Dies haben wir natürlich berücksichtigt - der Warenkorb arbeitet mit IDs (die o.g. Variable $productsId trägt nicht grundlos ihren Namen).
    Beim Import wird der Zugriff bzw. die Session des "Import-Benutzers" verwendet, die Artikel landen trotzdem korrekt im Nutzer-Warenkorb. Allerdings erst sichtbar nach Login/Logout (erneuerung der Nutzersession).
    Der Warenkorb wird scheinbar aus der DB in die Session geladen mit dem Login und später erst wieder abgespeichert (vermutlich mit jeder Veränderung).
    Es gibt eine Funktion zum erneuten befüllen (wiederherstellen) des Warenkorbs, welche wir auch bei jedem Import-Durchlauf nutzen - dennoch finden sich hier dann keine Nutzerartikel aus vorherigen Durchläufen im gleichen Atemzug. Folglich legt add_cart diese nicht direkt in der DB ab oder sie können nicht sofort wieder geladen werden.

    Die Folge davon aus, das wir 2x denselben Artikel als einzelne Position im Warenkorb finden - womit der Shop nichts anfangen kann und nur einen (vermutlich den welchen er zuerst findet) verwendet.

    Es müßte so eine Art "flush_cart" gehen, wo wir erzwingen könnten das die Daten abgespeichert werden in der DB und direkt in der nächsten Runde erneut hierauf wieder zugreifen können.
    Ich werde nochmal weiter debuggen und schauen, zu welchem Zeitpunkt die Artikel in den DB wandern - vielleicht läuft auch unser Programm einfach zu schnell ab.

    Dennoch vielen Dank für Deine Hinweise!
     
  6. Dennis (MotivMonster.de)

    Dennis (MotivMonster.de) G-WARD 2013/14/15/16

    Registriert seit:
    22. September 2011
    Beiträge:
    30.947
    Danke erhalten:
    6.089
    Danke vergeben:
    1.078
    Beruf:
    Mann für alles :)
    Ort:
    Weilburg
    Wäre es nicht sinnvoller für den import ne schnitstelle zu bauen die dann die Bestellung über die interne API ins System schreibt? Statt das es irgendwie über das Shopforntend funktionieren soll?
     
  7. iloki

    iloki Erfahrener Benutzer

    Registriert seit:
    15. August 2017
    Beiträge:
    54
    Danke erhalten:
    3
    Danke vergeben:
    3
    Genau das haben wir gemacht, quasi als REST-API v2-Erweiterung und nutzen möglichst viele Standard-Funktionen.
     
  8. Dennis (MotivMonster.de)

    Dennis (MotivMonster.de) G-WARD 2013/14/15/16

    Registriert seit:
    22. September 2011
    Beiträge:
    30.947
    Danke erhalten:
    6.089
    Danke vergeben:
    1.078
    Beruf:
    Mann für alles :)
    Ort:
    Weilburg
    Aber befüllt nur den WK oder warum geht ihr über die Shopping-Card? Bestellungen müsste man doch direkt schreiben können.
     
  9. iloki

    iloki Erfahrener Benutzer

    Registriert seit:
    15. August 2017
    Beiträge:
    54
    Danke erhalten:
    3
    Danke vergeben:
    3
    Mittlerweile füllen wir direkt den Shopping-Cart was insg. besser läuft.
    Einziger Nachteil - der Nutzer sieht die "befüllung" erst nachdem er sich nochmals ab- und wieder angemeldet hat im Fall dessen, das er während des Imports online war.

    Mit wäre allerdings für andere Funktionen schon dran gelegen gewesen, wenn man auch größere Warenkörbe >50 Artikel in Einem hätte teilen können.