उत्पाद संग्रह में मीडिया छवियों को लोड करने का तेज़ तरीका


23

TL; DR : मैं पूरे उत्पाद को लोड किए बिना उत्पाद छवियों / गैलरी को कैसे लोड करूं?

मैं एक उत्पाद पर छवियों को लोड करना चाहता हूं। मैं .phtml में क्या करता हूँ

$_popularCollection = $this->getPopularCollection();
foreach ($_popularCollection as $_product):
    // the rest
    $mediaGallery = $_product->getMediaGalleryImages();
endforeach;
//the rest

मैं ब्लॉक वर्ग में क्या करता हूं:

public function getPopularCollection() {
    // http://magento.stackexchange.com/q/5838/3089

    // no category
    if ( is_null( $this->getCategoryId() ) )
        return false;

    /** @var Mage_Catalog_Model_Category $category */
    $category = Mage::getModel('catalog/category')->load( (int)$this->getCategoryId() );

    /** @var Mage_Catalog_Model_Resource_Product_Collection $_popularCollection */
    $_popularCollection = Mage::getModel('catalog/product')->getResourceCollection();
    $_popularCollection->addAttributeToSelect('*');
    $_popularCollection->setStoreId(Mage::app()->getStore()->getId());
    $_popularCollection->addCategoryFilter($category);

    return $_popularCollection;
}

यह काम करता है लेकिन मैं सब कुछ लोड करता हूं: $_popularCollection->addAttributeToSelect(*);

मैंने कोशिश की, $_popularCollection->addAttributeToSelect('media_gallery'); लेकिन यह काम नहीं कर रहा है।

जवाबों:


22

addAttributeToSelect('media_gallery') काम नहीं कर रहा है क्योंकि media_gallery जटिल तर्क से आएगा।

आप पूर्ण उत्पाद मॉडल को लोड करके लूप के अंदर आसानी से media_galleryडेटा प्राप्त कर सकते हैं लेकिन इस मामले में बहुत अधिक मेमोरी होगी।

media_galleryविशेषता और afterloadउत्पाद मॉडल के बैकेंड मॉडल का उपयोग करें

पूर्ण उत्पाद भार के बिनाmedia_gallery विशेषता मान प्राप्त करने के लिए (Mage :: getModel ('कैटलॉग / उत्पाद') -> लोड ($ ProductID))

आप मीडिया इमेज को लोड afterLoad()करने के इस फ़ंक्शन कॉल backend modelका उपयोग कर सकते हैं media_gallery eav attribute। यह फुल मॉडल की तुलना में बहुत तेज हैload(Mage::getModel('ctalog/product')->load($ProductID))

foreach($his->getPopularCollection() as $product){
    $attributes = $product->getTypeInstance(true)->getSetAttributes($product);
    $media_gallery = $attributes['media_gallery'];
    $backend = $media_gallery->getBackend();
    $backend->afterLoad($product); 
    $mediaGallery = $product->getMediaGalleryImages();
        /* get Image one by  using loop*/
        foreach ($product->getMediaGalleryImages() as $image) {
        echo ($image->getUrl());
        }     

echo "<br/>..........................................<br/>";


}

1
हाँ जो काम किया
Janw

अच्छा! यह काम किया
जितेन्द्र मंडलोई

15

स्वीकृत उत्तर काम करता है, लेकिन जब वे अनावश्यक होते हैं तो सभी उत्पाद विशेषताओं को मेमोरी में लोड करना शामिल होता है।

थोड़ा और सर्जिकल दृष्टिकोण (1.9.2.2 सीई में परीक्षण किया गया) लेने के लिए

$attributeCode = 'media_gallery';
$attribute = $product->getResource()->getAttribute($attributeCode);
$backend = $attribute->getBackend();
$backend->afterLoad($product);

इस तरह आप केवल media_gallery विशेषता को ही लोड करते हैं।


स्वीकार किए गए उत्तर की तुलना में यह बहुत बेहतर समाधान है
SeStro

5

मुझे पता है कि प्रश्न पुराना है और इसका पहले से ही एक सही उत्तर है, लेकिन किसी अन्य विधि की सिफारिश करना बुरा नहीं है जो समुदाय के लिए उपयोगी हो सकती है: इससे पहले कि: $_product->getMediaGalleryImages()

तुम कोशिश कर सकते हो:

$_product->load('media_gallery');//load media gallery attributes
$mediaGallery = $_product->getMediaGalleryImages();

से लिया गया: /programming/7890616/get-product-media-gallery-images-from-a-product-collection-in-magento#23804663


1
अच्छा लगा! हालाँकि, मुझे यह बताना चाहिए कि ऊपर वर्णित + अमित-बेरा द्वारा वर्णित समाधान काफी तेज और कम मेमोरी और डेटाबेस गहन है। [संपादित करें: + aaron-bonner द्वारा दृष्टिकोण वास्तव में और भी तेज है।]
टायलर वी।

नहीं, यह एक बुरा जवाब है। आप इस तरह से किसी उत्पाद पर विशिष्ट डेटा लोड नहीं कर सकते हैं, यह सिर्फ उत्पाद पर पहले () और बाद में () के बाद कॉल करता है, और मॉडल पर पहले से मौजूद डेटा को नहीं बदलता है क्योंकि डेटाबेस कॉल इस फ़ंक्शन से कुछ भी वापस नहीं करेगा। । Mage_Core_Model_Abstract और Mage_Core_Model_Resource_Db_Abstract पर लोड () फ़ंक्शन परिभाषा देखें। आप यहाँ क्या कर रहे हैं उत्पाद का लगभग पूरा भार है।
OddBrew
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.