Magento 获取产品更改

Magento 获取产品更改,magento,Magento,情况是: 管理员登录到系统,并以某种方式更改产品 例如: 将数量设置为10 添加2个图像 更改说明 有没有办法跟踪这些变化?嗯,我的意思是准确地跟踪管理员改变了什么以及如何改变 我使用Magento CE 1.6,您可以通过对象的方法找到未更改的数据。获取对象的最佳时机是通过它的save_before事件,因此对于catalog_product_save_before事件。观察员可能包含以下内容: onCatalogProductSaveBefore($observer)的公共函数 { $pro

情况是:

管理员登录到系统,并以某种方式更改产品

例如:

将数量设置为10 添加2个图像 更改说明

有没有办法跟踪这些变化?嗯,我的意思是准确地跟踪管理员改变了什么以及如何改变


我使用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。这是否适用于组价格删除?还是删除分层价格?