2012-12-13 105 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

相关问题