Pregunta

Hemos extendido un control deslizante de la página de inicio para un cliente para que puedan presentar productos en este espacio.

Como parte de esto, hay tres ranuras de imagen en las que deseamos obtener la imagen principal de los productos y luego dos imágenes de la galería de medios (idealmente al azar pero no el fin del mundo si por ID).

Para comprender mejor, consulte la captura de pantalla de lo que tenemos hasta ahora:-

featprodslider

Estamos construyendo la colección para este módulo utilizando lo siguiente:-

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

Obtener la imagen principal del producto no es un problema, esto funciona perfectamente con lo siguiente:-

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

Y es lo suficientemente simple como para hacer que las tres ranuras de imagen usen esta imagen principal como se muestra en la imagen de arriba.

Sin embargo, cuando intentamos llamar a getGalleryImages, esto siempre regresa NULL (ejemplo como):-

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

Por favor, ¿alguien podría informar sobre el mejor enfoque para llamar a las imágenes de la galería en la página de inicio? ¿Hay algo que podamos incluir en la compilación de la colección o necesitaríamos agregar un observador?

Gracias por adelantado.

¿Fue útil?

Solución 3

Resolvimos esto al final y como señala @marius, necesitaba estar mirando getMediaGalleryImages.

El código con el que fuimos al final es:-

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

Y aquí cargamos las imágenes de los medios del producto y nos aseguramos de mostrar 3 para las 3 espacios que tenemos disponibles en el control deslizante del producto. Sin embargo, está interesado en saber si se podría haber logrado un mejor enfoque con su respuesta @Marius.

Otros consejos

Creo que la pregunta principal aquí es qué tipo es $this en tu contexto. Es un bloque simple, es algo normal regresar null Si el método no existe en el bloque.
En otra vista ... aquí es cómo puede obtener las imágenes asociadas a un producto suponiendo la variable $_product es una instancia del producto en sí:

$gallery = $_product->getMediaGalleryImages();

Entonces, en su caso, es posible que necesite algo como esto:

<?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 Recientemente he llegado a una situación en la que necesito obtener todas las imágenes de la galería de medios de la colección de productos sin cargar el modelo de producto nuevamente, ya que aumentará el tiempo de ejecución y usará la memoria adicional. Así que hice I + D y encontré el uso de la solución debajo de la línea antes de getMediaGalleryImages en los productos que cargó en la colección.

$product->load('media_gallery');

Verifique los fragmentos de código a continuación:

$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 pidió un mejor enfoque de su código de trabajo

Aquí está: no es necesario cargar producto completo

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

PREGUNTA VITA, pero un problema común ... Entonces, tal vez esto ayuda a otros usuarios

Aún mejor, escriba su propio método para obtener valores Media_Gallery, por lo que la solicitud procesará amablemente más rápido. Algo como esto...

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

Entonces, después de agregar ese código en su bloque, el código de plantilla sería

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top