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, но я понятия не имею, на что он указывает.

Author: ptyskju, 2017-12-29

1 answers

Вызов $product->save() подразумевает, что все данные о продукте будут сохранены, и поскольку вы загрузили весь продукт для определенного магазина:

if ($store) {
        $product->setStoreFilter($store);
        $product->setStoreId($store->getId());
 }
$product->load($productId);

Затем все данные сохраняются для этого конкретного хранилища (это означает, что значения по умолчанию больше не используются: поэтому флажок снят).

Если вы хотите сохранить только определенные данные вашего продукта, вам следует использовать метод saveAttribute:

$product->getResource()->saveAttribute ( это также лучше для производительности). Или, я думаю, это будет больше работы для вас, вы не должны загружать весь продукт ($product может быть элементом коллекции с выбранными только нужными атрибутами).

 0
Author: Julien Loizelet, 2018-01-02 14:46:56