问题描述
我正在尝试通过 PHP 脚本将捆绑产品插入 Magento 数据库.有问题的版本是 Community 1.5.1.0.
I am trying to insert bundled products to the Magento database from a PHP script. The version in question is Community 1.5.1.0.
我尝试了问题使用简单商品的 SKU/ID 以编程方式在 Magento 中添加捆绑商品".插入的产品在管理部分很好地显示 - 我可以编辑它们,添加新选项和选择等.但是,无论我尝试什么,它们都没有出现在 Magento 前端 - 例如重建索引或从后端重新保存它们.通过管理界面添加包工作正常.
I tried the method described in the question "Programmatically add Bundle Products in Magento, using the SKU / ID of Simple Items". The inserted products show up nicely in the *****istration section -- I can edit them, add new options and selections etc. However, they are not showing up at all in the Magento frontend no matter what I try - e.g. rebuilding indexes or re-saving them from the back-end. Adding bundles through the *****istration interface works fine.
在对数据库进行一些挖掘后,我注意到在使用我的脚本时 catalog_product_index_price 和 catalog_product_index_price_bundle_idx 表中没有必要的条目,同时通过后台添加包 -end 正常更新索引.就这些表而言,重新索引只会忽略添加的捆绑产品.
After some digging through the database, I noticed there are no necessary entries in the catalog_product_index_price and catalog_product_index_price_bundle_idx tables when using my script, while adding the bundle through the back-end updates the indexes normally. Re-indexing simply ignores the added bundle product as far as those tables are concerned.
我翻遍了 Magento 源文件,但找不到任何关于我做错了什么的提示.所有缓存都被禁用,选择有库存,我试图包括我在研究 Magento 在后端插入产品时发送的 POST 请求时挖掘出的所有数据.
I dug through the Magento source files and can't find any hints on what I'm doing wrong. All caches are disabled, selections are in stock, and I tried to include all data I dug up while studying the POST request Magento sends while inserting the product in the back-end.
这是我用于测试的完整脚本,以及底部注释掉的一些绝望的尝试:
Here's the complete script I use for testing, along with some desperate attempts commented out at the bottom:
$magentoPath = '/home/nikola/bin/magento-1.5/'; require_once($magentoPath . 'includes/config.php'); require_once($magentoPath . 'app/Mage.php'); $storeID = 1; $websiteIDs = array(1); $mageObj = Mage::app()->setCurrentStore($storeID); $product = Mage::getModel('catalog/product'); $cats = array("210"); $p = array( 'sku_type' => 0, 'sku' => 687, 'name' => "BarProduct", 'description' => 'Foo', 'short_description' => 'Bar', 'type_id' => 'bundle', 'attribute_set_id' => 4, '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 ); $product->setData($p); $product->setCanSaveBundleSelections(true); $product->setCanSaveCustomOptions(true); Mage::register('product', $product); Mage::register('current_product', $product); $optionRawData = array(); $selectionRawData = array(); $optionRawData[0] = array( 'required' => 1, 'option_id' => '', 'position' => 0, 'type' => 'select', 'title' => 'FooOption', 'default_title' => 'FooOption', 'delete' => '' ); $selectionRawData[0] = array(); $selectionRawData[0][] = array( 'product_id' => 1810, 'position' => 0, 'is_default' => true, 'selection_id' => '', 'option_id' => '', 'selection_price_type' => 0, 'selection_price_value' => 0.0, 'selection_qty' => 1, 'selection_can_change_qty' => 1, 'delete' => '' ); $product->setBundleOptionsData($optionRawData); $product->setBundleSelectionsData($selectionRawData); $product->save(); /* $stockItem = Mage::getModel('cataloginventory/stock_item'); $stockItem->loadByProduct($product->getId()); if (!$stockItem->getId()) { $stockItem->setProductId($product->getId())->setStockId(1); } $stockItem->setData('is_in_stock', 1); $stockItem->save(); $pi = Mage::getSingleton('bundle/price_index'); $pi->addPriceIndexToProduct($product); $pi->save(); */ ?>
推荐答案
请尝试使用以下代码 &看看会发生什么:-
Please try using the following code & see what happens:-
<?php $magentoPath = '/home/nikola/bin/magento-1.5/'; require_once($magentoPath . 'includes/config.php'); require_once($magentoPath . 'app/Mage.php'); $storeID = 1; $websiteIDs = array(1); $cats = array("210"); Mage::app()->setCurrentStore(Mage_Core_Model_App::*****_STORE_ID); $product = Mage::getModel('catalog/product'); $p = array( 'sku_type' => 0, 'sku' => '687', 'name' => "BarProduct", 'description' => 'Foo', 'short_description' => 'Bar', 'type_id' => 'bundle', 'attribute_set_id' => 4, '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 ); $product->setData($p); Mage::register('product', $product); Mage::register('current_product', $product); /** * Section of Bundle Options * * Required Properties of Bundle Options are:- * 1. title * 2. option_id * 3. delete * 4. type * 5. required * 6. position * 7. default_title */ $optionRawData = array(); $optionRawData[0] = array( 'required' => 1, 'option_id' => '', 'position' => 0, 'type' => 'select', 'title' => 'FooOption', 'default_title' => 'FooOption', 'delete' => '', ); /** * Section of Bundle Selections * * Required Properties of Bundle Selections * 1. selection_id * 2. option_id * 3. product_id * 4. delete * 5. selection_price_value * 6. selection_price_type * 7. selection_qty * 8. selection_can_change_qty * 9. position * 10. is_default */ $selectionRawData = array(); $selectionRawData[0] = array(); $selectionRawData[0][] = array( 'product_id' => 1810, 'selection_qty' => 1, 'selection_can_change_qty' => 1, 'position' => 0, 'is_default' => 1, 'selection_id' => '', 'selection_price_type' => 0, 'selection_price_value' => 0.0, 'option_id' => '', 'delete' => '' ); $product->setCanSaveConfigurableAttributes(false); $product->setCanSaveCustomOptions(true); // Set the Bundle Options & Selection Data $product->setBundleOptionsData($optionRawData); $product->setBundleSelectionsData($selectionRawData); $product->setCanSaveBundleSelections(true); $product->setAffectBundleProductSelections(true); $product->save(); ?>
希望有帮助.