获取产品变更

时间:2011-11-18 11:55:26

标签: magento

情况是:

管理员登录系统,他会以某种方式更改产品。

例如:

将数量设置为10 添加2张图片 更改说明

有没有办法跟踪这些变化?嗯,我的意思是完全跟踪什么,管理员如何改变?

我使用的是Magento CE 1.6

3 个答案:

答案 0 :(得分:22)

您可以通过对象的getOrigData()方法找到未更改的数据。获取对象的好时机是通过它的save_before事件,因此create an observercatalog_product_save_before事件。观察者可能包含以下内容:

public function onCatalogProductSaveBefore($observer)
{
  $product = $observer->getProduct();
  if ($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将包含已更改其值的所有$added和现有属性。同样适用于$oldValues$unset

答案 1 :(得分:4)

是的,您可以通过clockworkgeek指出的getOrigData()找到未更改的数据,但Magento有一个内置函数来比较和检查数据是否已更改。该方法称为dataHasChangedFor(),您必须传递要检查的属性。 它看起来像这样。

$isChanged = $productData->dataHasChangedFor('description'); 
if ($isChanged) { 
// do somthing 
}

此处方法dataHasChanged()将根据数据是否被更改返回布尔值。

答案 2 :(得分:1)

以防有些人还在接受这个: @ clockworkgeek的答案不正确,只要你打开开发者模式并显示错误(php> = 5.4),你就会得到例外和警告:

Array to string conversion in...

作为递归比较的解决方案:

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;
}

希望有所帮助 就个人而言,我建议将该函数放入一个帮助类并使其公开:)

<强>更新: 根据数值的问题是float和decimal,更好的解决方案是:

/**
 * 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;
}