製品の保存時にカスタムオプションを作成する


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()inのままにしておくと、2回目のイベントが発生したときにforeachループでreturnステートメントが呼び出されることを確認したにもかかわらず、2つのカスタムオプションが作成されます。

取り出したら。カスタムオプションは作成されません。

誰かが私が間違っていることを教えてもらえますか?
Magento 1.7を使用しています


こんにちは、catalog_product_save_beforeイベントを使用しているため、イベントが完了した後に製品が保存されるため、-> saveを呼び出す必要はありません。オブザーバーでその保存呼び出しを削除するとどうなりますか?
ProxiBlue

save()の呼び出しを削除すると、カスタムオプションは作成されません。
ジェイソンノイマン

回答:


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();と、オプションが追加されます(まだ2回ですが、追加されます)。問題が見つかった場合は、さらに投稿します。

[編集]
それを見つけました。私は何とか上記の行に正しかった。
先ほど言ったように、問題はcatalog_product_save_beforeカスタムオプションが処理された後にディスパッチされることです。しかし、これが機能しない理由です。
カスタムオプションはMage_Catalog_Model_Product::_afterSave()、次のコードで保存されます。

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

しかし、$this->getOptionInstance()中にオプションが移入された_beforeSaveオプションの配列は、あなたのケースでは空になったとき。したがって...保存するものはありません。
まだ使用したい場合は、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できます。変更が必要な場合は、オプションを更新できます。
ザヒーラバ

0

私はちょうど同じ問題を抱えていた、マリウスからの答えはうまくいきました。ただし、カスタムオプションを更新する方法を見つけるのに時間がかかりました。オプションを保存するために$ 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();

ありがとう

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.