Cách nhanh hơn để tải hình ảnh phương tiện trong bộ sưu tập sản phẩm


23

TL; DR : Làm cách nào để tải hình ảnh / bộ sưu tập sản phẩm mà không tải toàn bộ sản phẩm?

Tôi muốn tải hình ảnh trên một sản phẩm. Những gì tôi làm trong .phtml

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

Những gì tôi làm trong lớp 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;
}

Điều này hoạt động Nhưng tôi tải tất cả mọi thứ: $_popularCollection->addAttributeToSelect(*);

Tôi đã thử $_popularCollection->addAttributeToSelect('media_gallery'); Nhưng nó dường như không hoạt động.

Câu trả lời:


22

addAttributeToSelect('media_gallery') không hoạt động vì media_gallery sẽ đến từ logic phức tạp.

Bạn có thể nhận được media_gallerydữ liệu dễ dàng bên trong vòng lặp bằng cách tải mô hình sản phẩm đầy đủ Nhưng sẽ mất rất nhiều bộ nhớ trong trường hợp này.

Sử dụng mô hình cuối cùng của media_gallerythuộc tính & afterloadcủa mô hình sản phẩm

Để nhận media_gallerygiá trị thuộc tính mà không tải đầy đủ sản phẩm (Mage :: getModel ('danh mục / sản phẩm') -> tải ($ ProductID)) .

Bạn có thể sử dụng afterLoad(), sử dụng chức năng này backend modelđể media_gallery eav attributetải hình ảnh phương tiện. Đây là nhanh hơn nhiều so với mô hình đầy đủ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
Có mà làm việc
janw

tốt đẹp! nó đã hoạt động
Jitendra Mandloi

15

Câu trả lời được chấp nhận hoạt động, nhưng liên quan đến việc tải tất cả các thuộc tính sản phẩm vào bộ nhớ khi có lẽ chúng không cần thiết.

Để có một phương pháp phẫu thuật hơn một chút (thử nghiệm trong 1.9.2.2 CE) làm

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

Bằng cách này, bạn chỉ tải thuộc tính media_gallery.


Đó là giải pháp tốt hơn nhiều so với câu trả lời được chấp nhận
SeStro

5

Tôi biết câu hỏi đã cũ và nó đã có câu trả lời đúng, nhưng không tệ khi đề xuất một phương pháp khác có thể hữu ích cho cộng đồng: Trước đây $_product->getMediaGalleryImages()

Bạn co thể thử:

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

Lấy từ: /programming/7890616/get-product-media-gallery-images-from-a-product-collection-in-magento#23804663


1
Đẹp tìm thấy! Tuy nhiên, tôi phải chỉ ra rằng giải pháp được mô tả bởi + amit-bera ở trên nhanh hơn đáng kể và ít bộ nhớ và cơ sở dữ liệu hơn. [Chỉnh sửa: Cách tiếp cận của + aaron-bonner thậm chí còn nhanh hơn.]
Tyler V.

Không. Đây là một câu trả lời tồi. Bạn không thể tải dữ liệu cụ thể trên một sản phẩm theo cách này, nó chỉ gọi beforeLoad () và afterLoad () trên sản phẩm và không thay đổi dữ liệu đã có trên mô hình vì cuộc gọi cơ sở dữ liệu sẽ không trả về bất cứ điều gì từ chức năng này . Nhìn vào định nghĩa hàm load () trên Mage_Core_Model_Abauge và Mage_Core_Model_Resource_Db_Abauge. Những gì bạn đang làm ở đây chỉ là một tải đầy đủ của sản phẩm.
OddBrew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.