如何防止Magento以编程方式更新产品时覆盖其他网站/商店中的属性值

时间:2016-03-21 15:21:48

标签: php magento magento-1.8

我已经实现了自定义Magento模块,该模块循环来自外部服务的数据,并在Magento多语言,多商店网站中更新价格,重量,名称和其他一些产品属性。<​​/ p>

我的解决方案非常直接(在我的模型中每天由Cron调用),如下所示:

/* THIS IS CODE SNIPPET INSIDE FOREACH LOOP */
$storeId = (string)$jobConfig->store; //cron for each store
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$extistingProduct = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);
$extistingProduct->setPrice($newPrice); //update price
//some code here dealing with Associated products of Configurable product probably not relevant
//...
$extistingProduct->setCanSaveConfigurableAttributes(true);
$extistingProduct->setCanSaveCustomOptions(true);

$extistingProduct->setConfigurableAttributesData($configurableAttributesData);
// This tells Magento to associate the given simple products to this configurable product..
$extistingProduct->setConfigurableProductsData($configurableProductsData);

$extistingProduct->setStoreId($storeId);

$extistingProduct->save();

我每天都在cron中运行,每个商店分别运行。它通常可以正常工作,只改变每个商店的每个产品的价格,但有时会发生奇怪的事情(比如每2个月一次) - 除了价格之外的所有其他属性都会从商店X覆盖到当前商店$storeId。这意味着我所有受影响的产品的所有英文产品描述都变为德语(例如)。

我不知道怎么会发生这种情况,因为每次我调试它都正常工作,只改变我明确设置的当前范围的价格,但保留所有其他产品属性。它似乎从商店X加载所有产品数据,设定价格,然后通过调用$extistingProduct->setStoreId($storeId)将所有这些值存储到我在保存产品之前设置的商店。

在发生这种情况的情况下,所有属性都会被同一商店覆盖(例如,所有英文文本都会成为德语,但在其他情况下,所有文本都将成为西班牙语 - 它们全部来自一个随机商店)。

有没有人知道这怎么可能发生?我做错了什么?

3 个答案:

答案 0 :(得分:0)

我的行为与你日常相同,我实施了一个带有magmi的cron,如L. Palaiokostas所提到的那样。它工作得很好,我每天同步200k产品。 我做的是制作一个临时表,我收集所有外部数据,并使用magmi我做我的请求,将magento的数据与我的临时表进行比较。这给了我一个由magmi自动更新或创建的delta。

我在开始时怀疑并花了几个星期的时间,但它已经有效了一年没有麻烦!

希望这会有所帮助。

答案 1 :(得分:0)

是的,在Magento中,整个“逻辑”都是令人讨厌的。这是您需要知道的:

在加载产品时,加载的是当前设置为作用域的内容,在本例中为默认的admin-scope。因此,您要做的是从admin范围加载并将其保存到店面。因此,如果发生“随机”语言更改,请检查该产品的默认值是什么,您可能会感到惊讶。

我的建议:

  1. 确保在要存储的相同范围中加载每个产品,因此在加载之前将范围设置为
  2. 记住,每次存储产品时,都会覆盖网站/全局属性
  3. 请尽量避免使用内置的加载/保存方法,而应使用其他仅直接在所需范围内写入属性的方法

我们拥有广泛的自定义产品导入/更新机制,为了使所有内容都能加载/保存,我们首先更改并保存全局值,然后为每个店面更改/更改店面特定值加载/保存。

答案 2 :(得分:-1)

I had a similar problem and i couldn't find a way to get it right using Magento's native functionality. I end up using Magmi (Magmi's API to be more specific) to properly create/update my products.

P.S. I know this is not the "Magento's Way", but this was the only way i found after spending a lot of time researching. So i am posting this as an alternative solution.