सिर्फ मामले में कुछ लोगों को अभी भी इस एक के लिए आ रहा है: @ 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;
}
आशा में मदद करता है कि निजी तौर पर मैं एक सहायक वर्ग में है कि समारोह डाल करने के लिए सिफारिश करेंगे:
Array to string conversion in...
पुनरावर्ती तुलना के लिए समाधान के रूप में
और इसे सार्वजनिक करने :)
अद्यतन: संख्यात्मक मान के साथ समस्याओं के अनुसार नाव था और दशमलव बेहतर समाधान हो जाएगा:
/**
* 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;
}
स्रोत
2015-09-22 17:59:56
catalog_product_save_before getOrigData() के साथ जाने का तरीका है। टीवाई;) –
मैं कम से कम दो बार इसे ऊपर उठाना चाहता हूं। –
मुझे लगता है कि array_diff का उपयोग करने के बजाय यह array_diff_assoc –