2012-12-13 104 views
1

首先:我正在使用Magento 1.7.0.2。 我已經編程了一個功能,它可以隨時創建捆綁產品並將其添加到購物車。該產品正確顯示在後端,但在前端我錯過了選項,當我想從購物車編輯此項目時。以編程方式添加的捆綁產品Magento在前端無法正確顯示

我也遇到了一個問題,我不能正確地將這些生成的項目添加到購物車。這顯示了我的錯誤:

Some of the products below do not have all the required options. Please edit them and configure all the required options. 

如果我在後臺打開生成的產品,並將其保存在那裏,它顯示在門前正確的每一個選項,但其他錯誤仍然出現。

這是到目前爲止我的代碼:

 $storeID = 1; 
     $websiteIDs = array(1); 
     $cats = array($this->categoryPresent); 
     $productCounter = 0; 

     $presentParams['additional'] = 171; //Product ID 
     $presentParams['box'] = 167; //Product ID 
     $presentParams['count'] = 3; //amount of ordered presents 

     //Create base bundle with all required attributes 
     $product = Mage::getModel('catalog/product'); 
     $p = array(
      'sku_type' => 0, 
      'sku' => 'present - ' . strtotime('now'), 
      'name' => "Present", 
      'description' => 'Present', 
      'short_description' => 'Present', 
      'type_id' => 'bundle', 
      'attribute_set_id' => 9, 
      'weight_type' => 0, 
      'visibility' => 4, 
      'price_type' => 0, 
      'price_view' => 0, 
      'status' => 1, 
      'created_at' => strtotime('now'), 
      'category_ids' => $cats, 
      'store_id' => $storeID, 
      'website_ids' => $websiteIDs, 
      'base_price_amount' => '', 
      'base_price_base_amount' => 1, 
      'base_price_base_unit' => 'St', 
      'options_container' => 'container1' 
     ); 
     $product->setData($p); 
     $product->setStockData(array(
      'is_in_stock' => 1, 
      'qty' => 99999 
     )); 

     $optionRawData = array(); 
     $selectionRawData = array(); 

     //Insert Box 
     $productCounter++; 
     $optionRawData[] = array(
       'required' => 1, 
       'option_id' => '', 
       'position' => $productCounter, 
       'type' => 'select', 
       'title' => 'Box', 
       'default_title' => 'Box', 
       'delete' => '', 
      ); 
     $selectionRawData[$productCounter-1] = array(); 
     $selectionRawData[$productCounter-1][] = array(
       'product_id' => $presentParams['box'], 
       'selection_qty' => 1, 
       'selection_can_change_qty' => 0, 
       'position' => $productCounter, 
       'is_default' => 1, 
       'selection_id' => '', 
       'selection_price_type' => 0, 
       'selection_price_value' => 0.0, 
       'option_id' => '', 
       'delete' => '' 
     ); 

     //Insert Additional 
     $productCounter++; 
     $optionRawData[] = array(
       'required' => 1, 
       'option_id' => '', 
       'position' => $productCounter, 
       'type' => 'select', 
       'title' => 'Zubehör', 
       'default_title' => 'Zubehör', 
       'delete' => '', 
      ); 
     $selectionRawData[$productCounter-1] = array(); 
     $selectionRawData[$productCounter-1][] = array(
       'product_id' => $presentParams['additional'], 
       'selection_qty' => 1, 
       'selection_can_change_qty' => 0, 
       'position' => $productCounter, 
       'is_default' => 1, 
       'selection_id' => '', 
       'selection_price_type' => 0, 
       'selection_price_value' => 0.0, 
       'option_id' => '', 
       'delete' => '' 
     ); 


     // Set the Bundle Options & Selection Data ; Save the present 
     Mage::register('product', $product); 
     Mage::register('current_product', $product); 
     $product->setCanSaveConfigurableAttributes(false); 
     $product->setCanSaveCustomOptions(true); 
     $product->setCanSaveBundleSelections(true); 
     $product->setAffectBundleProductSelections(true); 
     $product->setBundleOptionsData($optionRawData); 
     $product->setBundleSelectionsData($selectionRawData); 
     $product->save(); 

     //Add Product to cart 
     $cart = Mage::getSingleton('checkout/cart'); 

//Try an other way of setting the bundled_option    
/*$option_ids = $product->getTypeInstance(true)->getOptionsIds($product); 
     $selectionCollection = $product->getTypeInstance(true)->getSelectionsCollection($option_ids, $product); 
     $bundled_items = array(); 
     foreach($selectionCollection as $key => $option){ 
      //$bundled_items[$key] = $option->product_id; 
      $bundled_items[$key] = 1; 
     } 

     $params = array(
      'product' => $product->getId(), 
      'related_product' => null, 
      'bundle_option' => $bundled_items, 
      'qty' => $presentParams['count'], 
     );*/ 

     $cart->addProduct($product, $presentParams['count']); 
     $cart->save(); 
     Mage::getSingleton('checkout/session')->setCartWasUpdated(true); 

我認爲,存在的僅僅是一小段代碼,這是失蹤。我希望有人能幫助解決這個問題。

UPDATE

捆綁產品在前端生成的。因此,我發現要做的一件事是爲新產品編制索引。 這裏是額外的代碼:

//Index new item 
     $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId()); 
     $stockItem->setForceReindexRequired(true); 
     Mage::getSingleton('index/indexer')->processEntityAction(
      $stockItem, 
      Mage_CatalogInventory_Model_Stock_Item::ENTITY, 
      Mage_Index_Model_Event::TYPE_SAVE 
     ); 

     $product->setForceReindexRequired(true)->setIsChangedCategories(true); 
     Mage::getSingleton('index/indexer')->processEntityAction($product, Mage_Catalog_Model_Product::ENTITY, Mage_Index_Model_Event::TYPE_SAVE); 

利用該所生成的產品在響應類別的列表視圖正確列出。但捆綁的內容仍然缺失。

+0

增加了額外的信息。 – Raphael

回答

0

我只是想與您分享我用來創建產品的代碼。
讓我們來比較一下你的和搜索錯誤。

   $product = Mage::getModel('catalog/product'); 

       $product->setSku($sku); 
       $product->setName($product_data['name']); 
       $product->setDescription($product_data['description']); 
       $product->setShortDescription($product_data['name']); 
       $product->setPrice($product_data['price'] * $price_multiplier); 
       $product->setTypeId('simple'); 
       $product->setAttributeSetId(9); // need to look this up 
       $product->setCategoryIds(implode(',', $local_categories)); // need to look these up 
       $product->setWeight(1.0); 
       $product->setTaxClassId(0); // taxable goods 
       $product->setVisibility(4); // catalog, search 
       $product->setStatus(1); // enabled 

       // assign product to the default website 
       $product->setWebsiteIds(array(1)); 

       $product->setMediaGallery(array('images' => array(), 'values'=>array())); 

       $first = true; 
       foreach ($local_images as $local_image_fname) { 
        $ma = array(); 
        if ($first) { 
         $first = false; 
         $ma = array('image', 'small_image', 'thumbnail'); 
        } 
        $product->addImageToMediaGallery($local_image_fname, $ma, false, false); 
       } 

       $stockData  = $product->getStockData(); 
       $stockData['qty'] = 1; 
       $stockData['is_in_stock'] = 1; 
       $stockData['manage_stock'] = 1; 
       $stockData['use_config_manage_stock'] = 0; 
       $product->setStockData($stockData); 

       $product->save(); 
       $product_id = $product->getId(); 

我明白了,你至少不設置TaxClassId。 和重量。

編輯

一個建議。 您正在將一捆產品添加到購物車。 你爲什麼不設置包選項? 您只設置計數。 參見很好的例子如何捆綁產品放入購物車編程:

http://inchoo.net/ecommerce/magento/programatically-add-bundle-product-to-cart-n-magento/

$params = array(
    'product' => 164, 
    'related_product' => null, 
    'bundle_option' => array(
     21 => 58, 
     20 => 55, 
     11 => 28, 
     12 => array(
      0 => 31, 
     ), 
     13 => array(
      0 => 32, 
      1 => 35, 
     ), 
    ), 
    'options' => array(
     3 => 'olaaaaaaaa', 
    ), 
    'qty' => 2, 
); 
$cart = Mage::getSingleton('checkout/cart'); 
$product = new Mage_Catalog_Model_Product(); 
$product->load(164); 
$cart->addProduct($product, $params); 
$cart->save(); 
Mage::getSingleton('checkout/session')->setCartWasUpdated(true); 
$message = $this->__('Custom message: %s was successfully added to your shopping cart.', $product->getName()); 
Mage::getSingleton('checkout/session')->addSuccess($message); 
+0

我已經找到了你發佈的這個例子。問題是 - 我如何確定選項?或者 - bundle_option和options之間有什麼區別? 添加的產品都是簡單的產品。他們沒有自己的選擇。或者我錯過了一點? 捆綁產品的重量也是動態的。設置它可能會停用此功能。 – Raphael

相關問題