2011-11-18 34 views
9

Tình huống là:Lấy các thay đổi sản phẩm

Quản trị nhật ký hệ thống và thay đổi sản phẩm bằng cách nào đó.

Ví dụ:

Sets qty đến 10 Thêm 2 hình ảnh Thay đổi mô tả

Có cách nào để theo dõi những thay đổi này? Vâng, tôi có nghĩa là chính xác theo dõi WHAT và quản trị viên như thế nào thay đổi?

tôi sử dụng Magento CE 1.6

Trả lời

20

Bạn có thể tìm thấy những dữ liệu không thay đổi gì thông qua phương pháp getOrigData() của một đối tượng. Một thời điểm tốt để có được đối tượng là thông qua sự kiện save_before của nó, vì vậy create an observer cho sự kiện catalog_product_save_before. Người quan sát có thể chứa những điều sau đây:

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

Lưu ý rằng $newValues sẽ bao gồm tất cả các $added và các thuộc tính hiện có mà đã có giá trị của họ thay đổi. Ditto cho $oldValues$unset.

+0

catalog_product_save_before getOrigData() là cách đi cùng. TY;) –

+0

Tôi muốn upvote điều này ít nhất hai lần. –

+0

Tôi nghĩ rằng thay vì sử dụng array_diff nó sẽ được array_diff_assoc –

1

chỉ trong trường hợp một số người vẫn mọc lên với trang này: @ câu trả lời clockworkgeek là không đúng, ngay sau khi bạn bật chế độ nhà phát triển và hiển thị lỗi (php> = 5.4), bạn sẽ nhận được ngoại lệ và cảnh báo:

Array to string conversion in...

như giải pháp để so sánh đệ quy:

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

Hy vọng rằng sẽ giúp Cá nhân tôi muốn giới thiệu để đưa chức năng đó vào một lớp helper và làm cho nó công cộng :)

CẬP NHẬT: theo vấn đề với các giá trị số là float và số thập phân là giải pháp tốt hơn sẽ là:

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

Có bạn có thể tìm thấy dữ liệu không thay đổi gì qua getOrigData() như nhọn ra bởi clockworkgeek nhưng Magento có một xây dựng trong chức năng để so sánh và kiểm tra xem dữ liệu đã được thay đổi. Phương thức này được gọi là dataHasChangedFor() và bạn phải chuyển thuộc tính mà bạn muốn kiểm tra. Nó sẽ trông giống như thế này.

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

tại đây dữ liệu phương thứcHasChanged() sẽ trả về giá trị boolean dựa trên việc dữ liệu có bị thay đổi hay không.

Các vấn đề liên quan