Подтвердить что ты не робот

Программно изменить атрибут продукта на уровне магазина

Извините, если этот вопрос тривиален, но я изо всех сил пытался найти то, что я делаю неправильно. Я пытаюсь изменить значение атрибута на уровне представления магазина, но значение по умолчанию также изменено, а оно не должно быть. Конечно, этот атрибут настроен как "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);
4b9b3361

Ответ 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);
        }
    }
}

не забудьте отправить только продукт, загруженный для некоторого вида магазина