2011-06-26 8 views
7

कुछ अवसर हैं जहां मुझे केवल कुछ डेटा वाले मॉडल को सौंप दिया गया है, उदाहरण के लिए catalog/product उदाहरण जिनमें कुछ विशेषताओं का उपयोग करने की आवश्यकता हो सकती है, ऐसे में आकार, विजेट संख्या, या कमर माप के रूप में।पहले से लोड किए गए Magento मॉडल से अतिरिक्त डेटा पुनर्प्राप्त करना

इस कम करने के लिए, मेरे वर्तमान विकल्प हैं:

  • एक नए ब्लॉक बनाएँ, और मैन्युअल रूप से addAttributeToSelect($name) का उपयोग कर आवश्यक विशेषताओं लोड।
  • उदाहरण के लिए, Mage::getModel('catalog/product')->getId($product->getId()) के साथ वर्तमान, अपर्याप्त आबादी वाले मॉडल से आईडी का उपयोग करके टेम्पलेट में संपूर्ण मॉडल लोड हो रहा है।

मेरे प्रश्न के लिए: क्या कोई तरीका है कि मैं ->load() के बाद अपने मॉडल संग्रह में लोड करने के लिए अतिरिक्त विशेषताओं को चुन सकता हूं? इसके अलावा, क्या अलग-अलग मॉडल पर ऐसा करने का कोई तरीका है?

+0

आप प्रतिबिंब की तकनीक की कोशिश की है के रूप में इवान इस सवाल में सुझाव है? http://stackoverflow.com/questions/5673093/sort-magento-collection-after-load या शायद Varien_Data_Collection की setDataToAll विधि? – OSdave

+2

जब मुझे लापता डेटा के साथ उत्पाद मिलता है तो यह आमतौर पर एक श्रेणी पृष्ठ पर होता है जहां कुछ विशेषताओं को जानबूझकर बाहर रखा जाता है। उस से बचने के लिए व्यवस्थापक से विशेषता संपादित करें और इसे "उत्पाद प्रविष्टि में प्रयुक्त" में "हां" में बदलें। – clockworkgeek

+0

@clockworkgeek: क्या यह एक सामान्य उद्देश्य समाधान है, जैसा कि "उत्पाद प्रविष्टि में प्रयुक्त" विशेषता विकल्प गलत है, और "हां" को चिह्नित करने से इसे संग्रह की डिफ़ॉल्ट विशेषता सूची में जोड़ दिया जाएगा? – Nick

उत्तर

5

सही और सबसे सुरक्षित दृष्टिकोण (लेकिन सबसे अच्छा नहीं - नीचे देखें) प्रश्न में वर्णित है - यह एक बार फिर उत्पाद लोड करना है।

कोई पहले से ही तरीकों को और अधिक विशेषताओं को जोड़ने के लिए, विकसित कर रहे हैं कई कारणों से के बाद उत्पाद भरी हुई है:

1) मॉडल जीवन एक बहुत अपने मूल्यों की गणना की और मॉडल के अंदर कैश की गई हो जाते हैं। इस प्रकार अधिक विशेषताओं को जोड़ना (उदाहरण के लिए मूल्य) मॉडल के राज्य को बदल देगा, लेकिन कई विधियों के परिणामों को प्रभावित नहीं करेगा, जो इन विशेषताओं मान (जैसे getPrice()) को वापस करने के लिए डिज़ाइन किए गए हैं, लेकिन आंतरिक रूप से कुछ अतिरिक्त प्रीप्रोकैसिंग करते हैं और पहले की गणना पर निर्भर करते हैं डेटा।

2) मॉडल का राज्य असंगत होगा, क्योंकि कुछ विधियां कैश किए गए हैं और वर्तमान में गैर-वैध मान, पिछले खाली विशेषता पर गणना की गई हैं, जबकि कुछ अन्य विधियां गैर-कैश किए गए मान लौटाएंगी। तो ऐसे मॉडल का उपयोग असुरक्षित होगा और इसकी संपत्ति अप्रत्याशित होगी।

3) ऐसे रीलोडिंग का समर्थन करने के लिए कोड की जटिलता काफी बड़ी है।

समाधान

1) पहला अच्छा समाधान (हालांकि भारी एक है) एक बार फिर से उत्पाद लोड करने के लिए है, हर बार अपने ब्लॉक/मॉडल/सहायक उस में गुण की विस्तारित सेट की जरूरत है।

2) बेहतर समाधान - सभी अतिरिक्त विशेषताओं वाले सभी उत्पादों के साथ नए संग्रह को लोड करना है, जब भी आप देखते हैं कि इन विशेषताओं की आवश्यकता होगी और मूल संग्रह में उन्हें नहीं होगा।

3) सबसे अच्छा समाधान - सभी आवश्यक विशेषताओं के साथ मूल उत्पाद संग्रह लोड करना है। कभी-कभी संग्रह संभव गुणों के सबसेट के साथ उत्पाद लोड करते हैं - मुख्य रूप से यह ईएवी अनुकूलन के लिए एक विरासत कोड है (अब डिफ़ॉल्ट तालिकाएं डिफ़ॉल्ट रूप से 'चालू' होती हैं और यह अनुकूलन आवश्यक नहीं है) या संभवतः जब संग्रह इंजन द्वारा संग्रह लोड किया जाता है (उदाहरण के लिए सौर Magento ईई में) जो, डिफ़ॉल्ट रूप से, अपने रिकॉर्ड में सभी विशेषताओं को स्टोर नहीं करता है।

3.1) आप जगह है, जहां यह instantiated है पर मूल संग्रह के लिए आवश्यक गुण जोड़ सकते हैं - के माध्यम से सवाल addAttributeToSelect($attributeNames) विधि

3.2 में वर्णित) आप, विशेषताओं की सूची के लिए अपने गुण जोड़ सकते हैं स्वचालित रूप से बसा संग्रह।गुण सूची मॉड्यूल से मॉड्यूल में भिन्न होती है, और वे विभिन्न स्थानों पर संग्रहीत होती हैं। कुछ कॉन्फ़िगरेशन में हैं, अन्य - डेटाबेस में। कंक्रीट प्लेस (कॉन्फ़िगर या डीबी टेबल), जहां ऑटो-आबादी के लिए विशेषताओं को जोड़ना है, आपके ठोस मामले पर निर्भर करता है।

4) कभी-कभी, जब आपको केवल गुण मान की आवश्यकता होती है, तो संसाधन मॉडल लिखने के लिए यह बहुत आसान और तेज़ हो सकता है, जो सीधे उन्हें डीबी से productIds और वर्तमान storeId स्कोप से लोड कर देगा। फिर आप उन्हें किसी संग्रह में उत्पाद के गुणों के रूप में सेट कर सकते हैं या उन्हें myAdditionalAttribuesValuesArray संपत्ति के रूप में सुरक्षित रूप से उत्पाद पर सेट कर सकते हैं या उत्पाद आईडी में मैप किए गए स्वतंत्र सरणी के रूप में उपयोग कर सकते हैं।

-1

"कोड/कोर/मैज/कैटलॉग/ब्लॉक/उत्पाद/View.php" पर Magento कोर फ़ाइल को संपादित करके, शायद सबसे अच्छा समाधान नहीं है, एक और तरीका है। लेकिन इस तरह आपको अपने उत्पाद दृश्य पृष्ठ में अतिरिक्त विशेषताओं तक पहुंच होगी। अपने टेम्पलेट सूची/उत्पाद/View.phtml में

public function getAdditionalData(array $excludeAttr = array()) 
{ 
    $data = array(); 
    $product = $this->getProduct(); 
    $attributes = $product->getAttributes(); 
    foreach ($attributes as $attribute) { 

     if ($attribute->getIsVisibleOnFront() && !in_array($attribute->getAttributeCode(), $excludeAttr)) { 
      $value = $attribute->getFrontend()->getValue($product); 

      if (!$product->hasData($attribute->getAttributeCode())) { 
       $value = Mage::helper('catalog')->__('N/A'); 
      } elseif ((string)$value == '') { 
       $value = Mage::helper('catalog')->__('No'); 
      } elseif ($attribute->getFrontendInput() == 'price' && is_string($value)) { 
       $value = Mage::app()->getStore()->convertPrice($value, true); 
      } 

      if (is_string($value) && strlen($value)) { 
       $data[$attribute->getAttributeCode()] = array(
        'label' => $attribute->getStoreLabel(), 
        'value' => $value, 
        'code' => $attribute->getAttributeCode() 
       ); 
      } 
     } 
    } 
    return $data; 
} 

तब:

निम्नलिखित कोड में जोड़े

<?php if($_additional = $this->getAdditionalData()): ?> 
    <?php foreach ($_additional as $_data): ?> 
     <tr> 
      <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th> 
      <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td> 
     </tr> 
    <?php endforeach; ?> 
<?php endif; ?> 
+1

संपादन कोर कभी समाधान नहीं होना चाहिए। – bluefear

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