제품 컬렉션에 미디어 이미지를 빠르게로드하는 방법


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 ( 'catalog / product')-> load ($ ProductID)) .

afterLoad()이 기능 호출 backend modelmedia_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
그렇습니다
1

좋은! 그것은 작동
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 () 만 호출하고 데이터베이스 호출은이 함수에서 아무것도 반환하지 않으므로 모델의 기존 데이터를 변경하지 않습니다 . Mage_Core_Model_Abstract 및 Mage_Core_Model_Resource_Db_Abstract에서 load () 함수 정의를보십시오. 여기서하는 일은 거의 제품의 전체로드입니다.
OddBrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.