Domanda

Abbiamo esteso un cursore homepage per un cliente in modo che possano caratterizzare i prodotti in questo spazio.

Come parte di questo, ci sono tre slot di immagini dove si desidera ottenere un'immagine principale dei prodotti e poi due immagini dalla galleria multimediale (idealmente in modo casuale, ma non è la fine del mondo se per ID).

Per ottenere una migliore comprensione, si prega di vedere screenshot di ciò che abbiamo finora: -

featprodslider

Stiamo costruendo la collezione per questo modulo utilizzando la seguente: -

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

Come immagine principale del prodotto non è un problema, questo è perfettamente funzionante con la seguente: -

<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) ?>" />

Ed è abbastanza semplice da fare tutti i tre slot di immagine utilizzare questa immagine principale, come mostrato nell'immagine qui sopra.

Quando proviamo a chiamare getGalleryImages tuttavia, questo restituisce sempre NULL (ad esempio come ad esempio): -

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

Si prega di qualcuno potrebbe consigliare di l'approccio migliore per richiamare le immagini della galleria sulla homepage. C'è qualcosa che può comprendere per la costruzione di raccolta o avremmo bisogno di aggiungere un osservatore.

Grazie in anticipo.

È stato utile?

Soluzione 3

Abbiamo risolto questo, alla fine, e come sottolinea @Marius, doveva essere guardando getMediaGalleryImages.

Il codice siamo andati con alla fine è: -

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

E qui caricare le immagini dei media del prodotto e garantire mostriamo solo il 3 per i 3 slot che abbiamo a disposizione nel cursore del prodotto. Interessato a sapere se se un approccio migliore si sarebbe potuto ottenere con la vostra risposta @Marius.

Altri suggerimenti

Credo che la questione principale qui è che tipo è $this nel vostro contesto. E 'proprio un semplice blocco è una specie di normale per tornare null se il metodo non esiste nel blocco.
Su un altro punto di vista .... ecco come è possibile ottenere le immagini associate ad un prodotto supponendo che il $_product variabile è un'istanza del prodotto stesso:

$gallery = $_product->getMediaGalleryImages();

Quindi nel tuo caso potrebbe essere necessario qualcosa di simile:

<?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 Recentemente sono venuto a una situazione in cui ho bisogno di ottenere tutte le immagini della galleria di media da collezione prodotto senza modello del prodotto carico di nuovo in quanto aumenterà il tempo di esecuzione e di utilizzare memoria aggiuntiva. Così ho fatto di ricerca e sviluppo e ha trovato l'uso soluzione sotto la linea prima che getMediaGalleryImages sui prodotti è stata caricata nella collezione.

$product->load('media_gallery');

frammenti di verificare il codice qui sotto:

$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 chiesto un approccio migliore del suo codice di lavoro

Eccolo: non c'è bisogno di caricare completa del prodotto

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

vecchia questione, ma problema comune ... Quindi forse questo aiuta altri utenti

Ancora meglio, scrivere il proprio metodo per ottenere media_gallery valori, ne facciano richiesta elaborerà gentilmente più veloce. Qualcosa di simile a questo ...

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

Quindi, dopo aver aggiunto che il codice nel tuo blocco, codice del modello sarebbe

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top