4

Magento でプログラムによってバンドルされた製品をカートに追加するときに、製品オプション配列の「bundle_option」フィールドのドキュメントがどこにも見つからないようです。したがって、これを正しく行う方法がわかりません。

しかし、これは私の試みです:

$json_obj = json_decode($json_string, true);

//define cart
$cart = Mage::getSingleton('checkout/cart');
$bundle = array();
$bundle_qty = array();

for ($i=0; $i<count($json_obj['basket']['products']); $i++) {
  $product_id = int($json_obj['basket']['products'][$i]['id']);

  #add individual products to cart
  #$product = new Mage_Catalog_Model_Product();
  #$product->load($product_id);
  #$params = array('product'=>$product_id,'qty'=>1);
  #if ($product->getName()) $cart->addProduct($product, $params);

  #add products to bundle
  $bundle[$i] = $product_id;
  if (isset($bundle_qty[$product_id])) $bundle_qty[$product_id] += (int)1;
  else $bundle_qty[$product_id] = (int)1;

}

#add to bundled product to cart
$product = new Mage_Catalog_Model_Product();
$product->load(833); #833 = test bundle
$cart->addProduct($product, array('product'=>833,
                                  'qty'=>min(1,int($json_obj['basket']['quantity'])),
                                  'bundle_option'=>$bundle,
                                  'bundle_option_qty'=>$bundle_qty));
$cart->save();
Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
$message = $this->__('Notice: %s item(s) were successfully added to your shopping cart.', $i);
Mage::getSingleton('checkout/session')->addSuccess($message);

}

したがって、コメントアウトされたコードは、正しく機能する製品を個別に追加しています。現在、代わりに「テスト バンドル」製品に製品を追加しようとしています。

ループ内で現在行っていることは、「bundle_option」フィールドと「bundle_option_qty」フィールドの配列をコンパイルすることです。ループが終了したら、バンドル商品 (ID:833) を、バンドルされたアイテムの options 配列と共にカートに追加します。

その結果、カートには何も追加されません。また、コードを少しいじってみましたが、成功しませんでした。

どこが間違っているのか、または bundle_option 配列 (インデックスとは何か、値とは何か) の詳細を説明する製品オプション パラメーターのドキュメント/チュートリアルを教えていただけないでしょうか?

4

1 に答える 1

3

これを理解するには、フロントエンドからカート URL に送信された POST 変数を確認する必要がありました。

これらは、1 つのバンドルに対して投稿された変数です。

bundle_option[1][]  17
bundle_option[1][]  19
bundle_option_qty[1][17]    1
bundle_option_qty[1][19]    1
product 833
qty 2
related_product

そこから、バンドル内のオプション 1bundle_option[1]を参照していることがわかりました。また、インデックスの値と- 17 と 19 が参照していることもわかりました。bundle_option[1][0]=17bundle_option[1][1]=19selection_id

フロントエンドでフォームを分析すると、selection_id のリストが明らかになりました。バンドルが [管理] > [製品の管理] で変更されるとセレクション ID が変更されると考えたので、セレクション ID をハードコーディングするのではなく、参照を使用してセレクション ID を取得しました。

私が最終的に得たコードはこれでした:

$json_string = isset($_POST["json"])? $_POST["json"] : null;
if (!is_null($json_string)) {

  $json_obj = json_decode($json_string, true);

  #define cart
  $cart = Mage::getSingleton('checkout/cart');

  #look-up bundle selection ids
  $bundled_product = new Mage_Catalog_Model_Product();
  $bundled_product->load(833); #833 = test bundle
  $selectionCollection = $bundled_product->getTypeInstance(true)->getSelectionsCollection(
      $bundled_product->getTypeInstance(true)->getOptionsIds($bundled_product), $bundled_product
  );
  $bundled_items = array();
  foreach ($selectionCollection as $option) {
    $bundled_items[$option->product_id] = $option->selection_id;
  }

  #get bundle items, quantities
  $bundle = array();
  $bundle_qty = array();
  for ($i=0; $i<count($json_obj['basket']['products']); $i++) {
    $product_id = (int)$json_obj['basket']['products'][$i]['id'];
    $selection_id = $bundled_items[$product_id];
    if(!in_array($selection_id,$bundle)) array_push($bundle,$selection_id);
    if (isset($bundle_qty[$selection_id])) $bundle_qty[$selection_id] += (int)1;
    else $bundle_qty[$selection_id] = (int)1;
  }

  #add to bundled product to cart
  $options = array('product'=>833,
                   'related_product'=>null,
                   'bundle_option'=>array(1=>$bundle),
                   'bundle_option_qty'=>array(1=>$bundle_qty),
                   'qty'=>(int)$json_obj['basket']['quantity']
                  );
  $cart->addProduct($bundled_product, $options);
  $cart->save();
  Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
  $message = $this->__('Notice: %s item(s) were successfully added to your shopping cart.', $i);
  Mage::getSingleton('checkout/session')->addSuccess($message);
}

これで誰かが多くの時間を節約できることを願っています!

編集

数量が設定されていない理由bundle_option_qtyをまだ解決しようとしています (すべてのアイテムは数量:1 バンドル製品に追加されます)。

編集 2

ビルトインのフロントエンド バンドルのカートへの追加機能でも、複数の数量のアイテムをカートに追加できないことが判明しました。問題を調べると、bundle-quantity 機能は Kabel BundlePlus と呼ばれる拡張機能であることがわかりました。おそらく以前の開発者によって正しくインストールされていなかったので、再度ダウンロードしてプラグインを再インストールしたところthe bundle_option_qty、フロントエンドとプラグインの両方で動作しています。 !

于 2012-09-23T01:12:48.413 に答える