web-dev-qa-db-ja.com

プログラムでカート内の商品数をカウントするにはどうすればよいですか?

カスタムブロックを作成しました。ここでは、カートに表示され、commerce_cart_order_load関数を使用して、ユーザーが選択した製品を取得します。

カート内の製品数をカウントする他の方法はありますか?

これを達成する方法を教えてください!

3
Panda

ストアIDと注文タイプがわかっている場合は、次のコードを使用して、現在のユーザーのカートにある商品の数をカウントできます。

    $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

Drupal 8では、カートはユーザーに関連する特別な注文です(通常の注文のように)。カスタムモジュールでは、ログインしたユーザーの注文をフェッチし、便利なブールフィールドでフィルターできます。 「cart」、作成日順に並べ替えて、このユーザーの最後のカートを取得します。次に、このカート注文のアイテム数を取得できます。

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

これには、最適でないか醜いコードが含まれている可能性があります。これは単なる開始点です(ただし、すぐにテストされていますが、機能しているようです)。また、これはまれなケースのシナリオまたは奇妙な状況(たとえば、匿名ユーザーが関与する)でテストする必要があります。私の戦略(最後に作成されたカート注文を取得する)も間違っている可能性があります...これについて専門家のフィードバックをいただければ幸いです。

[〜#〜]編集[〜#〜]

私はこれにより多くの時間を費やし、いくつかのことをデバッグする必要がありました、ここにいくつかの改善があります(more Drupal Commerce 2 way):

/* @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

これはDrupal 8ではなく、Drupal 7ではありませんか?この関数は、Drupal 7バージョンのcommerce_cartからのものです。モジュールの場合、「ショッピングカート(#アイテム)」コードのタイトルコールバックでコードが実行することで、カート内のアイテムの数をカウントできます。

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

パフォーマンスを向上させるために、ラッパーの使用を回避する(Commerce 1.14に含まれる)開発バージョンにcart_line_items_quantity_by_id()関数を追加しました。ただし、最初に$ order-> commerce_line_itemsフィールドの値をラインアイテムIDの配列に変換する必要があります。

0
Ryan Szrama