2011-11-18 13 views
9

स्थिति है:उत्पाद परिवर्तन प्राप्त करें

व्यवस्थापक सिस्टम में लॉग इन करता है और वह किसी भी तरह उत्पाद को बदलता है।

उदाहरण के लिए:

सेट मात्रा 10 को जोड़ता है 2 छवियों परिवर्तन वर्णन

वहाँ इन परिवर्तनों को ट्रैक करने के लिए कोई तरीका है? खैर मेरा मतलब है कि वास्तव में क्या और कैसे व्यवस्थापक बदल गया ट्रैक?

मैं Magento सीई 1.6

उत्तर

20

आप एक वस्तु के getOrigData() विधि के माध्यम से अनछुए डेटा प्राप्त कर सकते का उपयोग करें। ऑब्जेक्ट प्राप्त करने के लिए एक अच्छा समय है, इसे सहेजने से पहले, create an observercatalog_product_save_before ईवेंट के लिए। पर्यवेक्षक निम्नलिखित शामिल हो सकता है:

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

ध्यान दें कि $newValues मौजूदा विशेषताओं है कि उनके मूल्य बदल दिया गया है $added के सभी और शामिल होंगे। $oldValues और $unset के लिए डितो।

+0

catalog_product_save_before getOrigData() के साथ जाने का तरीका है। टीवाई;) –

+0

मैं कम से कम दो बार इसे ऊपर उठाना चाहता हूं। –

+0

मुझे लगता है कि array_diff का उपयोग करने के बजाय यह array_diff_assoc –

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...

पुनरावर्ती तुलना के लिए समाधान के रूप में

और इसे सार्वजनिक करने :)

अद्यतन: संख्यात्मक मान के साथ समस्याओं के अनुसार नाव था और दशमलव बेहतर समाधान हो जाएगा:

/** 
* 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 की तुलना करने के लिए फ़ंक्शन में एक बिल्ड है और डेटा बदल दिया गया है या नहीं। विधि को डेटाहैस चेंजफॉर() कहा जाता है और आपको उस संपत्ति को पास करना होगा जिसे आप देखना चाहते हैं। यह इस तरह कुछ दिखता है।

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

यहां विधि डेटा हैसचैंग() डेटा को बदल दिया गया था या नहीं, इसके आधार पर बूलियन मान वापस कर देगा।

संबंधित मुद्दे