Программно добавленный пакетный продукт не отображается в интерфейсе

Я пытаюсь вставить связанные продукты в базу данных Magento из PHP-скрипта. Данная версия относится к сообществу 1.5.1.0.

Я попробовал метод, описанный в вопросе « Программно добавить Bundle Products в Magento, используя SKU / ID простых элементов ». Вставляемые продукты хорошо отображаются в разделе администрирования – я могу их редактировать, добавлять новые параметры и выборки. Однако они не отображаются вообще в интерфейсе Magento независимо от того, что я пытаюсь, например, для восстановления индексов или повторного сохранения их из задней части. Добавление пакетов через интерфейс администрирования отлично работает.

После некоторого копания в базе данных я заметил, что при использовании моего сценария в таблицах catalog_product_index_price и catalog_product_index_price_bundle_idx нет необходимых записей, а при добавлении пакета через внутренние обновления индексы обычно. Повторная индексация просто игнорирует добавленный продукт пакета, насколько это касается таблиц.

Я вырыл исходные файлы Magento и не могу найти никаких намеков на то, что я делаю неправильно. Все кеши отключены, выбор на складе, и я попытался включить все данные, которые я выкопал, изучая POST-запрос Magento, отправляя при вставке продукта в конец.

Вот полный сценарий, который я использую для тестирования, а также некоторые отчаянные попытки, прокомментированные внизу:

 $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(); */ ?> 

Попробуйте использовать следующий код и посмотрите, что получится: –

 <?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::ADMIN_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(); ?> 

Надеюсь, поможет.

Я попытался использовать ваш код, но он не работал в Magento 1.7.0.2. По-видимому, продукт не может быть сохранен.

Что я сделал, были добавлены следующие строки:

  Mage::register('product', $product); Mage::register('current_product', $product); $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(); 

Казалось, что проблема заключается в том, что вы не можете сохранить файл.