wszelki wypadek niektórzy ludzie nadal zbliża się do tego: @ odpowiedź clockworkgeek nie jest poprawna, tak szybko, jak włączyć tryb programisty i wyświetlanie błędów (PHP> = 5.4) dostaniesz wyjątków i ostrzeżenia:
Array to string conversion in...
jako rozwiązanie dla rekurencyjnego porównania:
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;
}
nadzieję, że pomoże Osobiście polecam umieścić tę funkcję do klasy pomocnika i ich upublicznienie :)
UPDATE: według problemy z wartościami liczbowymi był pływak i dziesiętny lepszym rozwiązaniem byłoby:
/**
* 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;
}
catalog_product_save_bef getOrigData() są do zrobienia. TY;) –
Chciałbym upublicznić to co najmniej dwa razy. –
Myślę, że zamiast używać array_diff powinno być array_diff_assoc –