2011-11-18 19 views
9

状況:製品の変更を取得

管理者はシステムにログインして何らかの形で製品を変更します。例えば

:10 へ

設定し数量は 変更点の説明

は、これらの変更を追跡するためにどのような方法があります2枚の画像を追加しますか?まあ、私は正確に何を管理し、管理者が変更されたことを意味しますか?

私は、あなたがオブジェクトのgetOrigData()メソッドを介して変更されていないデータを見つけることができますMagentoのCE 1.6

答えて

20

を使用しています。オブジェクトを取得するには、save_beforeイベントが必要です。catalog_product_save_beforeイベントの場合はcreate an observerです。観察者は、次が含まれる場合があります。$newValues$addedの全てとそれらの値が変更されました既存の属性が含まれることを

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

注意を。同義語は$oldValues$unsetです。

+0

get_rigData()の前にcatalog_product_save_beforeがあります。 TY;) –

+0

私はこれを少なくとも2回upvoteしたいと思います。 –

+0

array_diffの代わりにarray_diff_assocを使うべきだと思います。 –

1

ほんの一部の人々はまだこの1に来る場合:あなたは例外と警告を取得します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...

それが公開する:)

UPDATE: を数値で問題に応じてフロートだったと小数よりよい解決策は次のようになります。

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

はいあなたはgetOrigData(を通じて変更されていないデータを見つけることができます)尖ったとしてclockworkgeekによると、Magentoには、データが変更されたかどうかを比較して確認する機能が組み込まれています。このメソッドはdataHasChangedFor()と呼ばれ、チェックするプロパティを渡す必要があります。 このように見えるでしょう。

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

ここで、メソッドdataHasChanged()は、データが変更されたかどうかに基づいてブール値を返します。

関連する問題