web-dev-qa-db-fra.com

Comment compter le nombre de produits dans le panier par programme?

J'ai créé le bloc personnalisé, ici je veux compter le nombre de produits qui sont présentés dans le panier et essayés avec commerce_cart_order_load fonction pour obtenir les produits sélectionnés par l'utilisateur.

Existe-t-il d'autres méthodes pour compter le nombre de produits dans le panier?

Veuillez m'aider à y parvenir!

3
Panda

Si vous connaissez l'ID du magasin et le type de commande, vous pouvez compter le nombre de produits dans le panier de l'utilisateur actuel avec le code suivant.

    $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());
3
Sidhees

Dans Drupal 8, les chariots sont des commandes spéciales, liées à un utilisateur (comme les commandes régulières). Dans un module personnalisé, vous pouvez récupérer les commandes des utilisateurs connectés, les filtrer par un champ booléen pratique appelé 'panier', triez-les par date de création pour obtenir le dernier panier pour cet utilisateur. Ensuite, vous pouvez obtenir le nombre d'articles pour cette commande de panier:

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());
  }
}

Cela peut contenir du code non optimal ou laid, ce n'est qu'un point de départ (mais rapidement testé cependant, semble fonctionner). Cela doit également être testé dans des cas rares ou des situations étranges (impliquant des utilisateurs anonymes par exemple). Ma stratégie (saisir la dernière commande de panier créée) peut également être erronée ... Je serais heureux d'avoir un commentaire spécialisé à ce sujet.

MODIFIER

J'ai passé plus de temps là-dessus et j'ai dû déboguer quelques choses, voici quelques améliorations (plus Drupal façon Commerce 2):

/* @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;
4
Flo

Êtes-vous sûr qu'il s'agit de Drupal 8 et non Drupal 7? Cette fonction provient de la version Drupal 7 de commerce_cart. Si c'est le cas, vous pouvez faire ce que le code fait dans le rappel de titre pour le code "Panier (# articles)" pour compter le nombre d'articles dans le panier:

// 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());

Pour le rendre plus performant, nous avons ajouté une fonction cart_line_items_quantity_by_id () dans la version de développement (à inclure dans Commerce 1.14) qui évite d'utiliser le wrapper. Cependant, vous devez d'abord convertir vous-même la valeur du champ $ order-> commerce_line_items en un tableau d'ID d'élément de campagne.

0
Ryan Szrama