Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止Magento在以编程方式更新产品时覆盖其他网站/商店的属性值_Php_Magento_Magento 1.8 - Fatal编程技术网

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

Php 如何防止Magento在以编程方式更新产品时覆盖其他网站/商店的属性值,php,magento,magento-1.8,Php,Magento,Magento 1.8,我已经实现了定制的Magento模块,该模块通过外部服务的数据循环,并在Magento多语言、多商店网站中更新价格、重量、名称和其他一些产品属性 我的解决方案非常简单(在Cron每天调用的模型中),如下所示: /* THIS IS CODE SNIPPET INSIDE FOREACH LOOP */ $storeId = (string)$jobConfig->store; //cron for each store Mage::app()->setCurrentStore(Mag

我已经实现了定制的Magento模块,该模块通过外部服务的数据循环,并在Magento多语言、多商店网站中更新价格、重量、名称和其他一些产品属性

我的解决方案非常简单(在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
。这意味着对于所有受影响的产品,我所有的英文产品描述都将变成德语(例如)

我不知道这是怎么发生的,因为每次我调试它时,它都正常工作,只更改当前范围内的价格(我显式设置了该范围),但保留所有其他产品属性不变。它似乎从Store X加载所有产品数据,设置价格,然后将我在保存产品之前通过调用
$extistingProduct->setStoreId($storeId)
设置的所有值存储到Store

在这种情况下,所有属性都会从同一存储区被覆盖(例如,所有英文文本都会变成德语,但在其他情况下,所有属性都会变成西班牙语-它们都来自one随机存储区)


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

我也遇到了类似的问题,我无法找到一种使用Magento本机功能的正确方法。我最终使用(更具体地说是Magmi)来正确创建/更新我的产品


p.S.我知道这不是“Magento的方式”,但这是我花了大量时间研究后发现的唯一方式。因此,我将此作为一种替代解决方案发布。

我每天都做与您相同的行为,并且我使用magmi实现了一个cron,正如L.Palaiokostas提到的那样。它工作得很好,我每天同步20万个这样的产品。 我所做的是创建一个临时表,在其中收集所有外部数据,并使用magmi执行我的请求,将magento的数据与我的临时表进行比较。这给了我一个增量,由magmi自动更新或创建

一开始我对此持怀疑态度,为此花了数周时间,但一年来它一直运行良好,没有任何问题

希望这会有所帮助。

是的,整个“逻辑”在Magento是相当糟糕的。以下是您需要了解的内容:

加载产品时,加载当前设置为作用域的内容,在您的情况下,加载默认的管理作用域。因此,您要做的是从管理范围加载并将其保存到商店前台。因此,如果发生“随机”语言更改,请检查该产品的默认值,您可能会感到惊讶

我的忠告是:

  • 确保将每个产品加载到要存储它的相同范围内,因此在加载之前设置范围
  • 请记住,每次存储产品时,网站/全局属性都会被覆盖
  • 尽量避免使用内置的load/save方法,而是使用其他直接且仅针对所需范围写入属性的方法

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

    您可以使用此更新属性函数,如$attributesData=array(“price”=>$data['price'],“特价”=>$data['special\u price'],“特价from\u date”=>$data['special\u from date'],“特价to\u date”=>$data['special\u todate']);存储明智的图像::getSingleton('catalog/product\u action')->更新属性(数组($productId),$attributesData,$storeId);我认为这只是我正在做的同一件事的不同表示法?我不知道这如何解决我的问题。您的代码太复杂了,我们无法像现在这样解决您的问题。问题可能来自很多因素,如您定义
    $extistingProduct
    。如果需要帮助,请粘贴完整的foreach loop,至少会有帮助。我也在考虑Magmi,但我有一个相当复杂的更新系统,已经编码了许多关于可配置和捆绑产品的细节。但由于我的解决方案也越来越慢,我将尝试Magmi。这可能是“痛苦的”“将您的实现转换为一个新的实现,与magmi兼容,但在性能方面完全值得。Magmi在创建/更新产品方面比原生的Magento方式要快得多。我只有3k个产品,每个商店用这种方式更新大约需要30-40分钟。通过使用Magento REST/SOAP API更新过程,速度会慢得多,而且对于可配置的产品甚至不完全支持。看来Magmi是个不错的选择,我会试试看。仅供参考,如果我记得清楚的话,我花了16个小时上传了一份分为7家商店的10万种新产品的目录。就在今晚,我每天的delta导入花费了14分钟来重新同步从外部目录更改的所有价格和产品,因此根据远程数据的数量,它相当快。一开始我用的是普通的magento,它每晚都会崩溃,太可怕了!事实上,玛格米是我项目中的救星:)