Un moyen plus rapide de charger des images multimédias dans une collection de produits


23

TL; DR : Comment charger les images / galerie du produit sans charger le produit entier?

Je veux charger les images sur un produit. Ce que je fais dans le .phtml

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

Ce que je fais dans la classe 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;
}

Cela fonctionne Mais je charge tout: $_popularCollection->addAttributeToSelect(*);

J'ai essayé $_popularCollection->addAttributeToSelect('media_gallery'); Mais ça ne semble pas marcher.

Réponses:


22

addAttributeToSelect('media_gallery') ne fonctionne pas car media_gallery proviendra d'une logique compliquée.

Vous pouvez obtenir des media_gallerydonnées faciles à l' intérieur à la boucle en chargeant le modèle de produit complet Mais cela prendra beaucoup de mémoire dans ce cas.

Utiliser le modèle backend de l' media_galleryattribut et afterloaddu modèle de produit

Pour obtenir la media_galleryvaleur d'attribut sans charge complète du produit (Mage :: getModel ('catalogue / produit') -> charge ($ ProductID)) .

Vous pouvez utiliser afterLoad(), en utilisant cet appel backend modelde fonction, le media_gallery eav attributechargement de l'image multimédia. C'est beaucoup plus rapide que le modèle completload(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
Oui, cela a fonctionné
janvier 2015

agréable! cela a fonctionné
Jitendra Mandloi

15

La réponse acceptée fonctionne, mais implique de charger tous les attributs du produit dans la mémoire lorsqu'ils sont peut-être inutiles.

Pour adopter une approche légèrement plus chirurgicale (testée en 1.9.2.2 CE),

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

De cette façon, vous ne chargez que l'attribut media_gallery lui-même.


C'est une bien meilleure solution qu'une réponse acceptée
SeStro

5

Je sais que la question est ancienne et qu'elle a déjà une bonne réponse, mais ce n'est pas mal de recommander une autre méthode qui peut être utile à la communauté: Avant $_product->getMediaGalleryImages()

Tu peux essayer:

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

Tiré de: /programming/7890616/get-product-media-gallery-images-from-a-product-collection-in-magento#23804663


1
Belle trouvaille! Cependant, je dois souligner que la solution décrite par + amit-bera ci-dessus est beaucoup plus rapide et utilise moins de mémoire et de base de données. [Edit: L'approche de + aaron-bonner est en fait encore plus rapide.]
Tyler V.

Non, c'est une mauvaise réponse. Vous ne pouvez pas charger des données spécifiques sur un produit de cette façon, il appelle simplement beforeLoad () et afterLoad () sur le produit, et ne modifie pas les données déjà existantes sur le modèle car l'appel de base de données ne renverra rien de cette fonction . Regardez la définition de la fonction load () sur Mage_Core_Model_Abstract et Mage_Core_Model_Resource_Db_Abstract. Ce que vous faites ici est juste presque une charge complète du produit.
OddBrew
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.