Schnellere Möglichkeit zum Laden von Medienbildern in eine Produktsammlung

23

TL; DR : Wie lade ich die Produktbilder / Galerie, ohne das gesamte Produkt zu laden?

Ich möchte die Bilder auf ein Produkt laden. Was mache ich in der .phtml

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

Was ich in der Blockklasse mache:

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;
}

Das funktioniert aber ich lade alles: $_popularCollection->addAttributeToSelect(*);

Ich habe es versucht, $_popularCollection->addAttributeToSelect('media_gallery'); aber es scheint nicht zu funktionieren.

janw
quelle

Antworten:

22

addAttributeToSelect('media_gallery') funktioniert nicht, da media_gallery von einer komplizierten Logik herrührt.

Sie können einfache media_galleryDaten in der Schleife abrufen, indem Sie das vollständige Produktmodell laden. In diesem Fall wird jedoch viel Speicher benötigt.

Verwenden Sie das Backend-Modell des media_galleryAttributs & afterloaddes Produktmodells

Zum Abrufen desmedia_gallery Attributwerts ohne vollständige Produktladung (Mage :: getModel ('catalog / product') -> load ($ ProductID)) .

Sie können verwendet werden afterLoad(), mit dieser Funktion Aufruf backend modelder media_gallery eav attributeLast des Medienbild. Dies ist viel schneller als das Vollmodellload(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/>";


}
Amit Bera
quelle
1
Ja, das hat funktioniert
Rechtsanwalt
nett! es hat funktioniert
Jitendra Mandloi
15

Die akzeptierte Antwort funktioniert, beinhaltet jedoch das Laden aller Produktattribute in den Speicher, wenn sie möglicherweise nicht erforderlich sind.

Etwas chirurgischer vorgehen (getestet in 1.9.2.2 CE)

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

Auf diese Weise laden Sie nur das Attribut media_gallery selbst.

Aaron Bonner
quelle
Es ist viel bessere Lösung als akzeptierte Antwort
SeStro
5

Ich weiß, dass die Frage alt ist und bereits eine richtige Antwort hat, aber es ist nicht schlecht, eine andere Methode zu empfehlen, die für die Community nützlich sein kann: Vorher $_product->getMediaGalleryImages()

Du kannst es versuchen:

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

Entnommen aus: /programming/7890616/get-product-media-gallery-images-from-a-product-collection-in-magento#23804663

Andres Rojas Orozco
quelle
1
Nizza zu finden! Ich muss jedoch darauf hinweisen, dass die von + amit-bera oben beschriebene Lösung erheblich schneller und weniger speicher- und datenbankintensiv ist. [Bearbeiten: Die Annäherung von + Aaron-Bonner ist tatsächlich noch schneller.]
Tyler V.
Nein, das ist eine schlechte Antwort. Sie können auf diese Weise keine bestimmten Daten in ein Produkt laden, sondern rufen nur beforeLoad () und afterLoad () für das Produkt auf und ändern die bereits vorhandenen Daten im Modell nicht, da der Datenbankaufruf nichts von dieser Funktion zurückgibt . Sehen Sie sich die load () - Funktionsdefinition für Mage_Core_Model_Abstract und Mage_Core_Model_Resource_Db_Abstract an. Was Sie hier tun, ist fast eine volle Ladung des Produkts.
OddBrew