Magento捆绑产品 - selection_id不能为空?

时间:2013-11-08 16:58:28

标签: sql magento bundle

我正在尝试以编程方式创建捆绑产品,并通过以下方式设置选项:

            $new_options[$count] = array(
                'required' => 0,
                'position' => 1,
                'parent_id' => $parentProduct->getId(),
                'type' => 'select',
                'title' => $product->getName(),
                'default_title' => $product->getName()
            );
            $new_selections[$count] = array(array(
                'product_id' => $product->getEntityId(),
                'selection_qty' => $child['qty'],
                'selection_can_change_qty' => 0,
                'position' => 0,
                'is_default' => 1,
                'selection_price_type' => 0,
                'selection_price_value' => 0.0
            ));
      ...
    $parentProduct->setBundleOptionsData($new_options);
    $parentProduct->setBundleSelectionsData($new_selections);

看起来是正确的(如https://stackoverflow.com/a/4415800/494643中所述)。但是,它不起作用 - 我得到一个SQL异常抱怨Column 'selection_id' cannot be null'。我该如何解决这个问题?选择id是一个auto_increment列,所以在创建它之前我无法获取它,但看起来它无法创建?

1 个答案:

答案 0 :(得分:0)

解决方案在于Mage_Bundle_Model_Selection模型的_beforeSave函数。

这会导致它尝试将selection_id写入catalog_product_bundle_selection_price表,保存选择对象之前 - 因此在生成selection_id之前。因此答案是强制它在保存之前生成一个id,所以再看一下_beforeSave函数,我们可以看到它只在存储不为0时才能保存价格。

具体来说,这部分:

$storeId = Mage::registry('product')->getStoreId();
if (!Mage::helper('catalog')->isPriceGlobal() && $storeId) {

这意味着如果我们首先将注册表产品的商店ID设置为0,我们可以使其保存选择,而不保存价格。然后我们需要将商店重置为之前的值,并再次保存以记录价格 - 尽管只有在重新加载对象以获得新生成的选择ID之后。