Frage

Wir haben einen Homepage -Schieberegler für einen Kunden erweitert, damit diese Produkte in diesem Bereich enthalten können.

Als Teil davon gibt es drei Image -Slots, in denen wir das Hauptbild der Produkte und dann zwei Bilder aus der Mediengalerie erhalten möchten (idealerweise zufällig, aber nicht das Ende der Welt, wenn durch ID).

Um ein besseres Verständnis zu bekommen, sehen Sie sich bitte den Screenshot von dem, was wir bisher haben:-

featprodslider

Wir bauen die Sammlung für dieses Modul mit Folgendem auf:-

$featured_products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->AddAttributeToFilter('featured', array('eq' => 1));

Das Hauptbild des Produkts zu erhalten ist kein Problem, dies funktioniert perfekt mit Folgendem:-

<img class="gallery" src="<?php echo $this->helper('catalog/image')->init($product, 'small_image')->resize(225); ?>" alt="<?php echo $this->stripTags($this->getImageLabel($product, 'small_image'), null, true) ?>" />

Und es ist einfach genug, um alle drei Bildschlitze dieses Hauptbild zu verwenden, wie im obigen Bild gezeigt.

Wenn wir jedoch versuchen, GetGalleryimages anzurufen, kehrt dies immer zurück NULL (Beispiel wie):-

<?php if (count($this->getGalleryImages()) > 0): ?>
<?php foreach ($this->getGalleryImages() as $_image): ?>
<img class="gallery" src="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile())->resize(100); ?>" width="100" height="100" alt="<?php echo $this->htmlEscape($_image->getLabel()) ?>" />
<?php endforeach; ?>
<?php endif; ?>

Bitte könnte jemand von dem besten Ansatz beraten, die Galeriebilder auf der Homepage anzurufen? Gibt es etwas, das wir in die Sammlung aufnehmen können, oder müssten wir einen Beobachter hinzufügen?

Danke im Voraus.

War es hilfreich?

Lösung 3

Wir haben dies am Ende gelöst und wie @Marius betont, mussten wir uns ansehen getMediaGalleryImages.

Der Code, mit dem wir am Ende gegangen sind, ist:-

<div class="images">
    <?php $_images = Mage::getModel('catalog/product')->load($product->getId())->getMediaGalleryImages(); ?>    
    <?php if($_images){?>            
        <?php $i=0; foreach($_images as $_image) if ($i++ < 5) { $i++; ?>
            <img class="gallery" src="<?php echo $this->helper('catalog/image')->init($product, 'thumbnail', $_image->getFile())->resize(255); ?>" alt="<?php echo $this->htmlEscape($_image->getLabel());?>" title="<?php $this->htmlEscape($_image->getLabel());?>" />
        <?php } ?>
    <?php } ?>
</div>

Und hier laden wir die Medienbilder des Produkts und stellen sicher, dass wir nur 3 für die 3 Slots zeigen, die wir im Produktschieberegler erhältlich sind. Interessiert zu wissen, wenn ein besserer Ansatz mit Ihrer Antwort @Marius hätte erreicht werden können.

Andere Tipps

Ich denke, die Hauptfrage hier ist, welcher Typ ist $this in Ihrem Kontext. Es ist ein einfacher Block, es ist irgendwie normal zurückzukehren null Wenn die Methode im Block nicht existiert.
Auf eine andere Ansicht .... Hier ist, wie Sie die Bilder mit einem Produkt unter der Annahme der Variablen erhalten können $_product ist eine Instanz des Produkts selbst:

$gallery = $_product->getMediaGalleryImages();

In Ihrem Fall brauchen Sie also möglicherweise so etwas:

<?php foreach ($featured_products as $_product)  : ?>
     <?php if (count($_product->getGalleryImages()) > 0): ?>
         <?php foreach ($_product->getGalleryImages() as $_image): ?>
             <img class="gallery" src="<?php echo $this->helper('catalog/image')->init($_product, 'thumbnail', $_image->getFile())->resize(100); ?>" width="100" height="100" alt="<?php echo $this->htmlEscape($_image->getLabel()) ?>" />
         <?php endforeach; ?>
     <?php endif; ?>
<?php endforeach;?>

@Zigojacko @Marius Vor kurzem bin ich zu einer Situation gekommen, in der ich alle Mediengalerie -Bilder aus der Produktsammlung erhalten muss, ohne das Produktmodell erneut zu laden, da es die Ausführungszeit erhöht und zusätzlichen Speicher verwendet. Also habe ich Forschungs- und Entwicklungslösungen unter GetMediagalleryimages für die Produkte, die Sie in der Sammlung geladen haben, verwendet.

$product->load('media_gallery');

Überprüfen Sie die Code -Ausschnitte unten:

$products = Mage::getModel("catalog/product")->getCollection();
$galleryImagesLink = [];
$product->load('media_gallery');
$_images = $product->getMediaGalleryImages();
foreach ($_images as $image) {
    $galleryImagesLink[] = Mage::getModel('catalog/product_media_config')->getMediaUrl($image->getFile());
}

Zigojacko gefragt nach einem besseren Ansatz seines Arbeitscode

Hier ist es: Sie müssen kein volles Produkt laden

<div class="images">
    <?php $_images = $product->load('media_gallery')->getMediaGalleryImages(); ?>    
    <?php if($_images){?>            
        <?php $i=0; foreach($_images as $_image) if ($i++ < 5) { $i++; ?>
            <img class="gallery" src="<?php echo $this->helper('catalog/image')->init($product, 'thumbnail', $_image->getFile())->resize(255); ?>" alt="<?php echo $this->htmlEscape($_image->getLabel());?>" title="<?php $this->htmlEscape($_image->getLabel());?>" />
        <?php } ?>
    <?php } ?>
</div>

Alte Frage, aber häufiges Problem ... vielleicht hilft dies anderen Benutzern

Schreiben Sie noch besser Ihre eigene Methode, um Media_Gallery -Werte zu erhalten, sodass die Anfrage freundlich schneller verarbeitet. Etwas wie das...

protected $_resource = null;

public function getResource()
{
    if (is_null($this->_resource)) {
        $this->_resource = Mage::getSingleton('core/resource');
    }
    return $this->_resource;
}

protected function _getMediaPosition($valueId)
{
    $data = array();
    $readConnection = $this->getResource()->getConnection('core_read');
    $query = $readConnection->select()
        ->from($this->getResource()->getTableName('catalog_product_entity_media_gallery_value'))
        ->where('value_id = ?', $valueId);
    $results = $readConnection->fetchAll($query);
    if (! empty($results)) {
        $data = $results[0];
    }

    return $data;
}

public function getMediaGalleryImages($productId)
{
    $data = array();
    $gallery = array();

    $readConnection = $this->getResource()->getConnection('core_read');
    $query = $readConnection->select()
        ->from($this->getResource()->getTableName('catalog_product_entity_media_gallery'))
        ->where('entity_id = ?', $productId);
    $results = $readConnection->fetchAll($query);

    if (! empty($results)) {
        foreach ($results as $mediaGalleryRow) {
            $gallery[] = array_merge($mediaGalleryRow, $this->_getMediaPosition($mediaGalleryRow['value_id']));
        }
    }

    foreach ($gallery as $i => $element) {
        if ($element['disabled'] == 1) {
            continue;
        }

        $obj = new Varien_Object();
        $obj->setFile($element['value']);
        $data[$element['position'] . '_' . $i] = $obj;
    }

    ksort($data);
    return $data;
}

Nach dem Hinzufügen dieses Codes in Ihrem Block wäre der Vorlagencode also

<div class="images">
    <?php $_images = $this->getMediaGalleryImages($product->getId()); ?>    
    <?php if($_images){?>            
        <?php $i=0; foreach($_images as $_image) if ($i++ < 5) { $i++; ?>
            <img class="gallery" src="<?php echo $this->helper('catalog/image')->init($product, 'thumbnail', $_image->getFile())->resize(255); ?>" alt="<?php echo $this->htmlEscape($_image->getLabel());?>" title="<?php $this->htmlEscape($_image->getLabel());?>" />
        <?php } ?>
    <?php } ?>
</div>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top