2011-07-16 16 views
8

में अपनी मूल इकाई को सहेजे बिना एक विशेषता मान सहेजें, मैं अपनी मूल इकाई को सहेजे बिना किसी विशेषता के मान को सहेजने में सक्षम होना चाहता हूं। मैंने अपने मॉड्यूल की एसक्यूएल/सेटअप फ़ाइल (ref) के माध्यम से एक नया ग्राहक विशेषता बनाई है, और अब मैं मौजूदा ग्राहकों में से प्रत्येक के लिए उस विशेषता को पॉप्युलेट करना चाहता हूं। मैंने उस विशेषता के लिए बैकएंड मॉडल बनाया है जो इकाई लोड (बाद के लोड) के दौरान शून्य मानों का पता लगाता है और सामग्री उत्पन्न करता है, लेकिन प्रक्रिया में उस बिंदु पर इकाई को सहेजने में मुझे संकोच नहीं है।Magento

class Aligent_Referral_Model_Customer_Attribute_Backend_Referralcode extends Mage_Eav_Model_Entity_Attribute_Backend_Abstract 
{ 
public function afterLoad($oCustomer) 
{ 
    $vAttrCode = $this->getAttribute()->getAttributeCode(); 
    $vValue = $oCustomer->getData($vAttrCode); 
    if (empty($vValue)){ 
     $oCustomer->setData($vAttrCode, Mage::helper('referral')->generateRafCode($oCustomer)); 
    } 
    return $this; 
} 
} 

आदर्श रूप में, मुझे लगता है कि afterLoad विधि में $this->getAttribute()->setValue('blah')->save() की तरह कुछ कॉल करने के लिए इतना है कि यह उपयोगकर्ता क्लिक बचाने पर निर्भर नहीं करता चाहते हैं।

मैं एक स्क्रिप्ट है कि सभी ग्राहकों का एक संग्रह को लोड करता है और उन्हें चलता मान सेट करने लिख सकता है, लेकिन वहाँ 50,000 से अधिक ग्राहकों है और मैं एक उत्पादन सर्वर पर चल रहा है कि प्रदर्शन प्रभाव के बारे में चिंतित हूँ ...

किसी भी विचार की सराहना की।
जेडी

उत्तर

2

तो एक विकल्प जो इसे सीधे डेटाबेस पर लिखने के लिए काम करता है। यह विशेष रूप से सुरुचिपूर्ण नहीं है लेकिन मौजूदा ग्राहकों (या अन्य संस्थाओं) के लिए एक नई विशेषता को पॉप्युलेट करने के लिए "आलसी लोड" दृष्टिकोण को प्राप्त करने में काफी प्रभावी है।

$vAttrValue = 'some string'; 
$oCustomer->setData($vAttrCode, $vAttrValue); 
$iAttrId = $this->getAttribute()->getAttributeId(); 
$data = array(
      'entity_type_id' => $oCustomer->getEntityTypeId(), 
      'attribute_id' => $iAttrId, 
      'entity_id' => $oCustomer->getId(), 
      'value' => $vAttrValue, 
     ); 
$vTableName = $this->getAttribute()->getBackend()->getTable(); 
Mage::getResourceModel('table/alias')->getWriteAdapter()->insert($vTableName, $data); 

यह MySQL4 मॉडल पर एडाप्टर लिखें पाने के लिए एक सार्वजनिक विधि उजागर करने की आवश्यकता है, लेकिन कोई बड़ी बात नहीं: यहाँ मैं क्या सवाल में तैनात करने के लिए Attribute_Backend_Referralcode में अतिरिक्त कोड है।

फिर भी अगर कोई एक दृष्टिकोण EAV मॉडल परत बेहतर उपयोग करता है पता करने के लिए दिलचस्पी ...

19

EAV संसाधन मॉडल इकाई सहेजे बिना ही विशेषताओं को बचाने के लिए की क्षमता प्रदान करता है।

$value = Mage::helper('referral')->generateRafCode($oCustomer); 
$oCustomer->setData($vAttrCode, $value)->getResource()->saveAttribute($oCustomer, $vAttrCode); 
+0

पूरी तरह से सुरुचिपूर्ण और प्रदर्शनकारी। धन्यवाद @vinai –

+0

अच्छा !! मुझे वह पसंद है, इसे अब मेरे नोट्स में डाल दिया। –

+0

@ dan.codes आप नोट्स रखते हैं? मैंने सोचा था कि स्टैक ओवरफ्लो का पूरा बिंदु था ... आप देखेंगे कि इस सवाल पर मैं वापस आ गया हूं क्योंकि मुझे इसे फिर से उपयोग करने की आवश्यकता है और नोट्स नहीं हैं! :) –

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