Magento 1.9 отключить значение по умолчанию для сохранения продукта в cron
У меня есть Magento версии 1.9.3.0. У меня 2 магазина, каждый для разных стран.
Каждый день мой магазин синхронизирует цены с ERP-системой с помощью cron. Если цена на один продукт была изменена в ERP, то cron устанавливает новую цену для этого продукта.
Я заметил, что каждый раз после синхронизации Значение по умолчанию флажок снят для измененного продукта в разделе Общие. Очень раздражает проверять все флажки, даже после того, как я установил их все днем раньше. Я понятия не имею, почему это происходит.
Существует основная функция cron, которая обновляет продукт:
public function prepare($store, $ids, $productId) {
$updateProduct = false;
$product = Mage::getModel('catalog/product');
$minPrice = null;
if ($store) {
$product->setStoreFilter($store);
$product->setStoreId($store->getId());
}
$product->load($productId);
$collection = $this->getSimpleProductsByIds($ids, $store);
foreach ($collection as $simple) {
$price = $simple->getPrice();
if ($price > 0 && (is_null($minPrice) || $price < $minPrice)) {
$minPrice = $price;
}
}
if ($product->getPrice() != $minPrice && !is_null($minPrice)) {
$updateProduct = true;
$product->setPrice($minPrice);
}
$configurableArray = $product->getTypeInstance()->getConfigurableAttributesAsArray();
foreach ($collection as $simple) {
$price = $simple->getPrice();
$valueIndex = $simple->getData('size_simple');
if ($configurableArray && isset($configurableArray[0]) && isset($configurableArray[0]['values']) && $configurableArray[0]['attribute_code'] == 'size_simple') {
foreach ($configurableArray[0]['values'] as $key => $value) {
if ($value['value_index'] == $valueIndex) {
$diff = (float) ($price - $product->getPrice());
if ($diff != 0 || $diff != $value['pricing_value']) {
$updateProduct = true;
$configurableArray[0]['values'][$key]['pricing_value'] = $diff;
$configurableArray[0]['values'][$key]['use_default_value'] = 0;
$configurableArray[0]['values'][$key]['is_percent'] = 0;
}
}
}
}
}
if ($updateProduct) {
$product->setCanSaveConfigurableAttributes(true);
$product->setConfigurableAttributesData($configurableArray);
$product->setData('update_price', 0);
$product->setData('bold_catalog_update', 1);
try {
$product->save(); // there is something wrong
} catch (Exception $e) {
return false;
}
} else if ($product->getData('update_price') == 1) {
try {
$product->setData('update_price', 0);
$product->getResource()->saveAttribute($product, 'update_price');
} catch (Exception $e) {
return false;
}
}
return true;
}
$ Настраиваемый массив выглядит так:
array(1) {
[0]=>
array(9) {
["id"]=>
string(4) "2353"
["label"]=>
string(11) "Size Simple"
["use_default"]=>
string(1) "0"
["position"]=>
string(1) "0"
["values"]=>
array(2) {
[0]=>
array(9) {
["product_super_attribute_id"]=>
string(4) "2353"
["value_index"]=>
string(1) "3"
["label"]=>
string(5) "S/M/L"
["default_label"]=>
string(5) "S/M/L"
["store_label"]=>
string(5) "S/M/L"
["is_percent"]=>
int(0)
["pricing_value"]=>
NULL
["use_default_value"]=>
bool(true)
["order"]=>
int(6)
}
[1]=>
array(9) {
["product_super_attribute_id"]=>
string(4) "2353"
["value_index"]=>
string(1) "6"
["label"]=>
string(6) "XL/XXL"
["default_label"]=>
string(6) "XL/XXL"
["store_label"]=>
string(6) "XL/XXL"
["is_percent"]=>
int(0)
["pricing_value"]=>
NULL
["use_default_value"]=>
bool(true)
["order"]=>
int(11)
}
}
["attribute_id"]=>
string(3) "133"
["attribute_code"]=>
string(11) "size_simple"
["frontend_label"]=>
string(11) "Size Simple"
["store_label"]=>
string(7) "Rozmiar"
}
}
Есть ключ: use_default_value, но я понятия не имею, на что он указывает.
1 answers
Вызов $product->save()
подразумевает, что все данные о продукте будут сохранены, и поскольку вы загрузили весь продукт для определенного магазина:
if ($store) {
$product->setStoreFilter($store);
$product->setStoreId($store->getId());
}
$product->load($productId);
Затем все данные сохраняются для этого конкретного хранилища (это означает, что значения по умолчанию больше не используются: поэтому флажок снят).
Если вы хотите сохранить только определенные данные вашего продукта, вам следует использовать метод saveAttribute:
$product->getResource()->saveAttribute
( это также лучше для производительности).
Или, я думаю, это будет больше работы для вас, вы не должны загружать весь продукт ($product
может быть элементом коллекции с выбранными только нужными атрибутами).