カスタムブロックを作成しました。ここでは、カートに表示され、commerce_cart_order_load
関数を使用して、ユーザーが選択した製品を取得します。
カート内の製品数をカウントする他の方法はありますか?
これを達成する方法を教えてください!
ストア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());
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;
これは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の配列に変換する必要があります。