Gibt es eine Möglichkeit, das Caching für ein einzelnes Feld für anonyme Benutzer zu deaktivieren?

7

Ich bin auf ein interessantes, aber wahrscheinlich häufiges Problem gestoßen. Wenn das Caching aktiviert ist, wird der Bestand für anonyme Benutzer nicht sofort aktualisiert (was sinnvoll ist, da dies der Punkt des Caching ist). Dies führt jedoch zu einem kleinen UXWTF. Wenn ein Produkt nicht vorrätig ist, wird den Benutzern weiterhin angezeigt, dass "1" noch verfügbar ist. Erst wenn sie versuchen, es in den Warenkorb zu legen, wird ihnen ein Hinweis angezeigt

Die maximale Menge an 'Produktname', die gekauft werden kann, beträgt 0.

Ich möchte den Cache immer noch für alles andere behalten, aber gibt es eine Möglichkeit, das Caching der verfügbaren Bestandsanzahl zu deaktivieren?

Nigel Waters
quelle
3
Können Sie den Aktienwert in einen Block ziehen? Wenn ja, könnten Sie es als Block anzeigen und Ajax-Blöcke verwenden: drupal.org/project/ajaxblocks
keva
Leider würde dieser Ansatz wirklich nur mit einer einzelnen Produktanzeige / einzelnen Produkteinheit funktionieren (oder selbst wenn es zwei oder drei Produktvarianten gäbe). Dieser Ansatz kann unhandlich werden, wenn für jede Produktanzeige mehr als ein paar Produktvarianten vorhanden sind.
Nigel Waters
AJAX und / oder ESI / SSI ist eine Antwort drupal.org/project/esi . Cache-Ungültigmachung ist die andere Antwort drupal.org/project/cache_actions . Beide sind halbkomplex und somit kein Tropfen Lösung.
Mikeytown2
Ich bin gerade auf dieses Problem gestoßen , drupal.org/node/1785158, und der Autor des Moduls zitiert "Commerce-Websites funktionieren nicht gut mit Caching, und Drupal-Handel ist keine Ausnahme."
Junedkazi
Ich kann jetzt keine würdige Antwort schreiben, aber werfen Sie einen Blick auf Drupal 7 - Aktualisieren von Knotenfeldern über Ajax / Frontpage - aktualisieren Sie nur dieses eine Feld mit AJAX und Timer. Auf diese Weise werden auch Änderungen der Menge nach dem Öffnen der Seite durch den Benutzer angezeigt.
Mołot

Antworten:

1

Nur eine Idee - in diesem Fall könnte eine Problemumgehung darin bestehen, eine Funktion zu verknüpfen, nachdem eine Bestellung aufgegeben wurde, und dann den Cache programmgesteuert zu bereinigen.

Sie können die hook_commerce_checkout_complete()und dort die cache_clear_all()Funktion aufrufen .

Aram Boyajyan
quelle
cache_clear_all () wird kein großer Leistungseinbruch sein, da der gesamte Site-Cache geleert wird. Auch wenn die Site voll ist, kann es sein, dass sie erstickt.
Junedkazi
Wahr; Ich habe darüber nachgedacht und die Lösung wäre, nur den Cache aus dem Commerce-Modul zu bereinigen. Ich bin mir nicht sicher, was genau aufgerufen werden soll oder ob es dafür eine Funktion gibt.
Aram Boyajyan
2
@junedkazi cache_clear_all ist eigentlich etwas schlecht benannt. Es akzeptiert einen Parameter, in dem Sie einzelne Seiten / zwischengespeicherte Objekte angeben können, die gelöscht werden sollen.
Jmking
0

Der Caching-Mechanismus in Drupal ist sehr flexibel. Sie können einen benutzerdefinierten Cache für die Teile einer Seite verwenden, die unter bestimmten Bedingungen "nicht zwischengespeichert" werden sollen. Wenn die Bedingung erfüllt ist (Auschecken), setzen Sie einfach den Cache für diese bestimmte $ cid im Formular "Auschecken" der Kasse zurück .

In diesem Beitrag finden Sie einen guten Überblick über die Caching-API.

stefgosselin
quelle