2011-11-18 11 views
9

Sytuacja:Pobierz zmiany produktu

Administrator loguje się do systemu i jakoś zmienia produkt.

Na przykład:

Zestawy st do 10 Dodaje 2 zdjęcia description Zmiany

Czy istnieje jakiś sposób, aby śledzić te zmiany? Cóż, mam na myśli dokładnie śledzić zmiany WHAT i HOW?

Używam Magento CE 1.6

Odpowiedz

20

można znaleźć dane niezmienioną przez getOrigData() metody obiektu. Dobrym czasem na zdobycie obiektu jest jego zdarzenie save_before, czyli create an observer dla zdarzenia . Obserwator może zawierać następujące elementy:

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

Zauważ, że $newValues obejmie wszystkie $added i istniejących atrybutów, które miały ich wartość zmienić. Ditto dla $oldValues i $unset.

+0

catalog_product_save_bef getOrigData() są do zrobienia. TY;) –

+0

Chciałbym upublicznić to co najmniej dwa razy. –

+0

Myślę, że zamiast używać array_diff powinno być array_diff_assoc –

1

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

Tak można znaleźć dane niezmienioną przez getOrigData() jak wskazano obecnie przez clockworkgeek, ale Magento ma wbudowaną funkcję porównywania i sprawdzania, czy dane zostały zmienione. Metoda nazywa się dataHasChangedFor() i musisz przekazać właściwość, którą chcesz sprawdzić. Wyglądałoby coś takiego.

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

tutaj metoda dataHasChanged() zwróci wartość logiczną na podstawie tego, czy dane zostały zmienione.

Powiązane problemy