Я работаю над созданием настраиваемой опции для моих продуктов автоматически при каждом создании продукта. Пока у меня есть наблюдатель, который запускает 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 настраиваемые опции, хотя я проверяю, чтобы убедиться, что во 2-й раз, когда событие срабатывает, оператор return вызывается в цикле foreach.
Если я возьму это. Пользовательские параметры не создаются.
Может кто-нибудь сказать мне, что я делаю не так?
Я работаю с Magento 1.7
magento-1.7
admin
ce-1.7.0.2
event-observer
custom-options
Джейсон Нейман
источник
источник
Ответы:
Пока я не найду точную проблему, вот решение. Вместо этого
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()
заполняется с опциями,_beforeSave
когда массив опций пуст в вашем случае. Отсюда ... нечего спасать.Если вы все еще хотите использовать
catalog_product_save_before
вот код, который должен работать.источник
catalog_product_prepare_save
вместоcatalog_product_save_before
и как я могу обновить опцию, если какие-либо изменения требуются.У меня просто была такая же проблема, ответ от Мариус работал отлично. Мне потребовалось некоторое время, чтобы понять, как обновить пользовательский параметр. Зная, что $ product-> getOptionInstance () -> addOption () работает для сохранения параметра, а установка «is_delete» в 1 удаляет параметр сохранения, я пришел к следующему коду:
После удаления вы можете добавить обновленную пользовательскую опцию с этим кодом:
источник
Чтобы создать пользовательский параметр в magento при сохранении продукта, это очень простые шаги.
Если уже создана пользовательская опция, вы можете удалить ее, используя следующий код
Благодарность
источник