在产品保存上创建自定义选项


18

每当创建产品时,我都在为我的产品自动创建自定义选项。到目前为止,我所得到的是一个在catalog_product_save_before事件上触发并运行以下代码的观察者:

    //check that we haven't made the option already
    $options = $product->getProductOptions();
    foreach ($options as $option) {
        if ($option['title'] == 'Auto Date & Time' && $option['type'] == 'date_time' && !$option['is_delete']) {
            //we've already added the option
            return;
        }
    }
    $options[] = array(
        'title' => $product->getDateLabel(),
        'type' => 'date_time',
        'is_require' => 1,
        'sort_order' => 0,
        'is_delete' => '',
        'previous_type' => '',
        'previous_group' => '',
        'price' => '0.00',
        'price_type' => 'fixed',
        'sku' => ''
    );
    $product->setProductOptions($options);
    $product->setCanSaveCustomOptions(true);
    //this line doesnt make sense here, but it works ... kinda
    $product->save();

如果我不$product->save()进行操作,那么即使创建了2个自定义选项,我仍会结束,尽管我已经检查过第二次触发该事件,然后在foreach循环中调用return语句。

如果我把它拿出来。没有创建自定义选项。

有人可以告诉我我在做什么错吗?
我正在使用Magento 1.7


嗨,因为您使用的是catalog_product_save_before事件,所以您无需调用-> save,因为产品将在事件完成后保存。如果您在观察者中删除该保存呼叫,会发生什么?
ProxiBlue

如果我删除对save()的调用,则不会创建任何自定义选项。
杰森·诺伊曼

Answers:


12

在找到确切的问题之前,这里是解决方案。而是catalog_product_save_before使用事件catalog_product_prepare_save。这样做的缺点prepare_save是仅在通过管理界面或API保存产品时才调度事件。因此,如果您从自定义代码保存,则除非您手动触发它,否则不会触发它。

我直觉这个问题与Mage_Catalog_Model_Product::_beforeSave()方法有关。其中有一些自定义选项的处理。
但是catalog_product_save_before在此处理发生后调度,因此在处理自定义选项时Mage_Catalog_Model_Product::_beforeSave()它们实际上为空,因为事件尚未触发,因此未添加它们。
如果您parent::_beforeSave();在我在方法顶部提到的方法中移动该行,则会添加选项(仍然两次,但已添加)。如果发现问题,我会发布更多信息。

[编辑]
找到了。我在以上几行中是正确的。
就像我说的那样,问题是catalog_product_save_before在处理自定义选项之后分派了。但这就是为什么它不起作用的原因。
定制选项Mage_Catalog_Model_Product::_afterSave()通过以下代码保存在其中:

$this->getOptionInstance()->setProduct($this)
            ->saveOptions();

但是在您的情况下$this->getOptionInstance()_beforeSave如果options数组为空,则使用options进行填充。因此...无济于事。
如果您仍然想使用,则catalog_product_save_before此处是应该起作用的代码。

//check that we haven't made the option already
$options = $product->getOptions();
if ($options){
    foreach ($options as $option) {
        if ($option['title'] == 'Auto Date & Time' && $option['type'] == 'date_time' && !$option['is_delete']) {
            //we've already added the option
            return;
        }
    }
}
$option = array(
    'title' => 'Auto Date & Time',
    'type' => 'date_time',
    'is_require' => 1,
    'sort_order' => 0,
    'is_delete' => '',
    'previous_type' => '',
    'previous_group' => '',
    'price' => '0.00',
    'price_type' => 'fixed',
    'sku' => ''
);
//don't use it like this because it has no effect
//$product->setProductOptions($options);
$product->setCanSaveCustomOptions(true);
//use it this way. Populate `$product->getOptionInstance()` directly
$product->getOptionInstance()->addOption($option);
//don't forget to state that the product has custom options
$product->setHasOptions(true);

您好@Marius我可以catalog_product_prepare_save代替使用,catalog_product_save_before如果需要任何更改,如何更新选项。
Zaheerabbas

0

我只是遇到了同样的问题,marius的回答非常有效。我花了一些时间弄清楚如何更新自定义选项。知道$ product-> getOptionInstance()-> addOption()可用于保存选项,并将“ is_delete”设置为1会删除保存选项,我想到了以下代码:

$oldOptions = $product->getOptionInstance()->getOptions();
foreach ($oldOptions as $key => $option){
    if($option['title'] == "Custom Option Title") {
        $oldOptions[$key]['is_delete'] = 1;                 
        $product->getOptionInstance()->addOption($oldOptions[$key]);
    }
}

删除后,您可以使用以下代码添加更新的自定义选项:

$newOption = array(
    'title' => "Custom Option Title",
    'type' => 'radio',
    'is_require' => 1,
    'sort_order' => 20,
    'values' => array(
        array(
            'title' => "Value 1 Title",
            'price' => 42.00,
            'price_type' => 'fixed',
            'sku' => "",
            'sort_order' => '1'
        ),
        array(
            'title' => "Value 2 Title",
            'price' => 50,
            'price_type' => 'percent',
            'sku' => "",
            'sort_order' => '2'
        )
    )
);
$product->getOptionInstance()->addOption($newOption);

0

要在保存产品的同时在magento中创建自定义选项,这些步骤非常简单。

   $product = Mage::getModel("catalog/product")->load($productid);

    $options[] = array(
            'title' => 'Pet',
            'type' => 'field',
            'is_require' => 0,
            'sort_order' => 0,
        );
    $options[] = array(
            'title' => 'Date',
            'type' => 'field',
            'is_require' => 1,
            'sort_order' => 2,
        );

    $product->setProductOptions(($options));
    $product->setCanSaveCustomOptions(true);
    $product->save();`

如果已经创建了自定义选项,则可以通过以下代码将其删除

$product = Mage::getModel("catalog/product")->load($productid);

    $customOptions = $product->getOptions();

    foreach ($customOptions as $option) {
        $option->delete();
    }

    $product->setHasOptions(0);
    $product->save();

谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.