Программно изменить атрибут продукта на уровне магазина
Извините, если этот вопрос тривиален, но я изо всех сил пытался найти то, что я делаю неправильно. Я пытаюсь изменить значение атрибута на уровне представления магазина, но значение по умолчанию также изменено, а оно не должно быть. Конечно, этот атрибут настроен как "store-view-scoped". Чтобы это было просто, я пробовал с именем продукта. Нет успеха.
Ниже приведены неудачные тесты, которые я пробовал...
Вы видите, что я делаю неправильно здесь?
Большое спасибо.
Мои попытки:
$product = Mage::getModel('catalog/product')->load(PRODUCT_ID);
$product->setStoreId(STORE_ID)->setName('new_name')->save();
$product = Mage::getModel('catalog/product')->load(PRODUCT_ID);
$product->setStoreId(STORE_ID)->setStore(STORE_CODE)->setName('new_name')->save();
$product = Mage::getModel('catalog/product')->load(PRODUCT_ID);
$product->setStoreId(STORE_CODE)->setName('new_name')->save();
$product = Mage::getModel('catalog/product')->setStoreId(STORE_ID)->load(PRODUCT_ID);
$product->setName('new_name')->save();
$product = Mage::getModel('catalog/product')->setStoreId(STORE_ID)->load(PRODUCT_ID);
$product->setStoreId(STORE_ID)->setName('new_name')->save();
Я попытался добавить строку ниже перед загрузкой модели продукта...
Mage::app()->setCurrentStore(STORE_ID);
Ответы
Ответ 1
Итак, вот полный фрагмент, чтобы изменить значение атрибута для определенного атрибута продукта в определенном хранилище. Пример с названием продукта:
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$product = Mage::getModel('catalog/product')->load(PRODUCT_ID);
$product->setStoreId(STORE_ID)->setName('my_new_product_name')->save();
И в качестве дополнительного ответа можно было бы заинтересовать изменение значения атрибута по умолчанию. В этом случае аргумент "false" должен быть передан в setAttribute:
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$product = Mage::getModel('catalog/product')->load(PRODUCT_ID);
$product->setStoreId(STORE_ID)->setName(false)->save();
Ответ 2
Вам нужно установить текущее хранилище администратору в верхней части блока кода:
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
Ответ 3
Обратите внимание, что при загрузке продукта с данными для некоторого вида хранилища также загружаются значения по умолчанию. сохранение такого продукта приведет к сохранению значений по умолчанию в качестве значений хранилища (таким образом, они не будут использоваться "Использовать значение по умолчанию" для полей)
я закончил с следующей функцией для того чтобы очистить данные продукта от значений по умолчанию
public static function _removeDefaults($item) {
static $attributeCodes = null;
if($attributeCodes == null) {
$attributes = Mage::getSingleton('eav/config')
->getEntityType(Mage_Catalog_Model_Product::ENTITY)->getAttributeCollection();
$attributeCodes = array();
foreach($attributes as $attribute) {
$ac = $attribute->getAttributeCode();
if(in_array($ac, array('sku','has_options','required_options','created_at','updated_at','category_ids'))) {
continue;
}
$attributeCodes[] = $ac;
}
}
foreach($attributeCodes as $ac) {
if(false == $item->getExistsStoreValueFlag($ac)) {
$item->unsetData($ac);
}
}
}
не забудьте отправить только продукт, загруженный для некоторого вида магазина