Створення користувацької опції для збереження продукту


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 спеціальних параметрів, хоча я перевіряю, чи вдруге я перевіряю, чи викликає подія виклик return у циклі foreach.

Якщо я вийму його. Не створюються спеціальні параметри.

Може хтось скаже мені, що я роблю неправильно?
Я працюю з Magento 1.7


Привіт, оскільки ви використовуєте каталог_product_save_before подія, вам не потрібно буде викликати -> save, оскільки продукт збереже після завершення події. Що станеться, якщо ви видалите цей збережений дзвінок у свого спостерігача?
ProxiBlue

Якщо я видаляю виклик для збереження (), не створюються спеціальні параметри.
Джейсон Нойман

Відповіді:


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();у згаданому нами методі у верхній частині методу, параметри додаються (ще двічі, але вони додаються). Я опублікую більше, коли / якщо знайду проблему.

[EDIT]
Знайшов це. Я був якось прав у рядках вище.
Як я вже сказав, проблема полягає в тому, що 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();

Спасибі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.