情况是:
管理员登录系统,他会以某种方式更改产品。
例如:
将数量设置为10 添加2张图片 更改说明
有没有办法跟踪这些变化?嗯,我的意思是完全跟踪什么,管理员如何改变?
我使用的是Magento CE 1.6
答案 0 :(得分:22)
您可以通过对象的getOrigData()
方法找到未更改的数据。获取对象的好时机是通过它的save_before事件,因此create an observer为catalog_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;
}