Magento 获取产品更改
情况是: 管理员登录到系统,并以某种方式更改产品 例如: 将数量设置为10 添加2个图像 更改说明 有没有办法跟踪这些变化?嗯,我的意思是准确地跟踪管理员改变了什么以及如何改变Magento 获取产品更改,magento,Magento,情况是: 管理员登录到系统,并以某种方式更改产品 例如: 将数量设置为10 添加2个图像 更改说明 有没有办法跟踪这些变化?嗯,我的意思是准确地跟踪管理员改变了什么以及如何改变 我使用Magento CE 1.6,您可以通过对象的方法找到未更改的数据。获取对象的最佳时机是通过它的save_before事件,因此对于catalog_product_save_before事件。观察员可能包含以下内容: onCatalogProductSaveBefore($observer)的公共函数 { $pro
我使用Magento CE 1.6,您可以通过对象的方法找到未更改的数据。获取对象的最佳时机是通过它的save_before事件,因此对于
catalog_product_save_before
事件。观察员可能包含以下内容:
onCatalogProductSaveBefore($observer)的公共函数
{
$product=$observer->getProduct();
如果($product->hasDataChanges()){
$newValues=array_diff_assoc($product->getData(),$product->getOrigData());
$oldValues=array_diff_assoc($product->getOrigData(),$product->getData());
$added=array_diff_key($product->getData(),$product->getOrigData());
$unset=array_diff_key($product->getOrigData(),$product->getData());
}
}
请注意,
$newValues
将包括所有已添加的$newValues
和已更改其值的现有属性。同样适用于$oldValues
和$unset
以防仍有人来此:
@clockworkgeek的答案是不正确的,一旦您打开开发人员模式并显示错误(php>=5.4),您将收到异常和警告:
数组到字符串的转换…
作为递归比较的解决方案:
public function onCatalogProductSaveBefore($observer)
{
$product = $observer->getProduct();
if ($product->hasDataChanges()) {
$newValues = $this->_compareArrayAssocRecursive($product->getData(), $product->getOrigData());
$oldValues = $this->_compareArrayAssocRecursive($product->getOrigData(), $product->getData());
}
}
protected function _compareArrayAssocRecursive($array1, $array2)
{
$diff = array();
foreach ($array1 as $key => $value) {
if (is_array($value)) {
if (!isset($array2[$key]) || !is_array($array2[$key])) {
$diff[$key] = $value;
} else {
$newDiff = $this->_compareArrayAssocRecursive($value, $array2[$key]);
if (!empty($newDiff)) {
$diff[$key] = $newDiff;
}
}
} elseif (!array_key_exists($key,$array2) || $array2[$key] !== $value) {
$diff[$key] = $value;
}
}
return $diff;
}
希望有帮助
就我个人而言,我建议将该函数放入helper类并将其公开:)
更新:
根据数值的问题是浮点和十进制,更好的解决方案是:
/**
* return diff according to product changes
*
* @param Mage_Catalog_Model_Product $product
* @return array
*/
protected function _compareArrayAssocRecursive($product)
{
$diff = array();
$attributes = $product->getTypeInstance(true)->getEditableAttributes($product);
foreach ($attributes as $key => $value) {
if ($product->dataHasChangedFor($key)) {
$diff[$key] = $product->getData($key);
}
}
return $diff;
}
是的,正如clockworkgeek所指出的,您可以通过getOrigData()找到未更改的数据,但Magento有一个内置函数来比较和检查数据是否已更改。该方法称为dataHasChangedFor(),您必须传递要检查的属性。 看起来会像这样
$isChanged = $productData->dataHasChangedFor('description');
if ($isChanged) {
// do somthing
}
这里,dataHasChanged()方法将根据数据是否被更改而返回布尔值。catalog\u product\u save\u getOrigData()之前的方法。TY;)我认为应该使用array\u diff\u assocI而不是array\u diff\u,我认为你可能是对的。不过,在某些情况下,使用
array\u diff
可能会起作用。这为我抛出了一个异常“array-to-string-conversion”。这是因为getData()数组包含一个对象“stock_item”。这会导致array_diff_assoc/array_diff函数出错,因为这些函数的参数应为array。这是否适用于组价格删除?还是删除分层价格?