Wie zähle ich programmgesteuert die Anzahl der Produkte im Warenkorb?
On Januar 1, 2021 by adminIch habe den benutzerdefinierten Block erstellt. Hier möchte ich die Anzahl der Produkte zählen, die im Warenkorb angezeigt und mit Funktion, um die vom Benutzer ausgewählten Produkte abzurufen.
Gibt es andere Methoden, um die Anzahl der Produkte im Warenkorb zu zählen?
Bitte helfen Sie mir, wie dies erreicht werden kann!
Antwort
Wenn Sie die Geschäfts-ID und den Auftragstyp kennen, können Sie die Anzahl der Produkte in den aktuellen Benutzern zählen Wagen mit dem folgenden Code.
$store_id = 1; $order_type = "default"; $cart_manager = \Drupal::service("commerce_cart.cart_manager"); $cart_provider = \Drupal::service("commerce_cart.cart_provider"); $entity_manager = \Drupal::entityManager(); $store = $entity_manager->getStorage("commerce_store")->load($store_id); $cart = $cart_provider->getCart($order_type, $store); $total_items = count($cart-> getItems());
Antwort
In Drupal 8 werden Wagen verwendet sind Sonderaufträge, die sich auf einen Benutzer beziehen (wie reguläre Aufträge). In einem benutzerdefinierten Modul können Sie die angemeldeten Benutzeraufträge abrufen, nach einem praktischen booleschen Feld namens „Warenkorb“ filtern und nach Erstellungsdatum sortieren, um den letzten Warenkorb zu erhalten für diesen Benutzer. Dann können Sie die Anzahl der Artikel für diese Warenkorbbestellung abrufen:
in mymodule.module : use Drupal\commerce_order\Entity\Order; function mymodule_preprocess_[page|block|something_else](&$variables) { // get orders... $query = \Drupal::entityQuery("commerce_order") // ...for logged in user, could be anonymous (uid = 0) ->condition("uid",\Drupal::currentUser()->id()) // ...which are carts ->condition("cart", 1) // ...last created first ->sort("created", "DESC") // ...get only one ->range(0,1); // execute this : you get an array of a unique order ids (last cart) $cartsOrders = $query->execute(); // I found one : this user has a cart if(count($cartsOrders) > 0) { // load the order which is the last cart for logged in user /* @var Order $lastCart */ $lastCart = current(Order::loadMultiple($cartsOrders)); // send this order items count to the template // ({{ cartItemsCount }} in your twig) $variables["cartItemsCount"] = count($lastCart->getItems()); } }
Dies kann nicht optimale oder u enthalten Gly-Code, dies ist nur ein Ausgangspunkt (aber schnell getestet, scheint zu funktionieren). Auch dies muss in seltenen Fällen oder in seltsamen Situationen (z. B. bei anonymen Benutzern) getestet werden. Meine Strategie (die zuletzt erstellte Warenkorbbestellung abrufen) ist möglicherweise auch falsch … Ich würde mich über ein spezielles Feedback dazu freuen.
BEARBEITEN
Ich habe mehr Zeit damit verbracht und musste einige Dinge debuggen. Hier sind einige Verbesserungen (mehr Drupal Commerce 2-Wege):
/* @var CurrentStoreInterface $cs */ $cs = \Drupal::service("commerce_store.current_store"); /* @var CartProviderInterface $cpi */ $cpi = \Drupal::service("commerce_cart.cart_provider"); $cart = $cpi->getCart("default", $cs->getStore()); $nbItemsInCart = $cart ? count($cart->getItems()) : 0;
Antwort
Sind Sie sicher, dass dies Drupal 8 und nicht Drupal 7 ist? Diese Funktion stammt aus der Drupal 7-Version von trade_cart.module. Wenn dies der Fall ist, können Sie das tun, was der Code im Titelrückruf für den Code „Warenkorb (# Artikel)“ tut, um die Anzahl der Artikel im Warenkorb zu zählen:
// Count the number of product line items on the order. $wrapper = entity_metadata_wrapper("commerce_order", $order); $quantity = commerce_line_items_quantity($wrapper->commerce_line_items, commerce_product_line_item_types());
Um die Leistung zu verbessern, haben wir in der Entwicklungsversion (in Commerce 1.14 enthalten) eine Funktion cart_line_items_quantity_by_id () hinzugefügt, die die Verwendung des Wrappers vermeidet. Sie müssen jedoch zuerst den Feldwert $ order-> Commerce_line_items selbst in ein Array von Werbebuchungs-IDs konvertieren.
Kommentare
- Ja Ich frage nach Drupal 8. Funktioniert Ihre Antwort in Drupal 8?
- Ich versuche, die Anzahl der Produkte in einem Block anzuzeigen. Ich habe den obigen Code verwendet, der wie ein schwerwiegender PHP-Fehler angezeigt wird: Call to undefinierte Funktion Drupal \\ custom_hgsi_common \\ Plugin \\ Block \\ Commerce_cart_order_load (). Ich weiß nicht, was ich sonst tun soll. Bitte führe mich
- Ja, diese Funktion funktioniert nicht ' existiert nicht, es schien, als hätten Sie aufgrund Ihrer Erwähnung der Drupal 7-Funktion über Drupal 7 gesprochen. Der gleiche Code funktioniert nicht für Drupal 8.
Schreibe einen Kommentar