วิธีโหลดรูปภาพสื่อในคอลเลกชันผลิตภัณฑ์ได้เร็วขึ้น


23

TL; DR : ฉันจะโหลดรูปภาพ / แกลเลอรี่ผลิตภัณฑ์โดยไม่ต้องโหลดผลิตภัณฑ์ทั้งหมดได้อย่างไร

ฉันต้องการโหลดภาพบนผลิตภัณฑ์ ฉันทำอะไรใน. phtml

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

สิ่งที่ฉันทำในคลาส Block:

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

ดี! มันใช้ได้
Jitendra Mandloi

15

คำตอบที่ยอมรับใช้งานได้ แต่เกี่ยวข้องกับการโหลดคุณลักษณะของผลิตภัณฑ์ทั้งหมดลงในหน่วยความจำเมื่อไม่จำเป็น

หากต้องการใช้วิธีการผ่าตัดเพิ่มเติมเล็กน้อย (ทดสอบใน 1.9.2.2 CE)

$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
ยินดีที่ได้พบ! อย่างไรก็ตามฉันต้องชี้ให้เห็นว่าวิธีการแก้ปัญหาที่อธิบายโดย + amit-bera ข้างต้นนั้นเร็วกว่าและมีหน่วยความจำและฐานข้อมูลน้อยลงอย่างมาก [แก้ไข: วิธีการโดย + aaron-bonner เร็วกว่าจริง ๆ ]
Tyler V.

ไม่นี่เป็นคำตอบที่ไม่ดี คุณไม่สามารถโหลดข้อมูลที่เฉพาะเจาะจงในผลิตภัณฑ์ด้วยวิธีนี้เพียงแค่เรียก beforeLoad () และ afterLoad () บนผลิตภัณฑ์และไม่เปลี่ยนข้อมูลที่มีอยู่แล้วในรุ่นเพราะการเรียกฐานข้อมูลจะไม่ส่งคืนสิ่งใดจากฟังก์ชันนี้ . ดูข้อกำหนดของฟังก์ชัน load () บน Mage_Core_Model_Abstract และ Mage_Core_Model_Resource_Db_Abstract สิ่งที่คุณทำอยู่ที่นี่เป็นผลิตภัณฑ์ที่เกือบเต็มแล้ว
OddBrew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.