Manera eficiente de obtener URL e imagen del producto

12

Mientras construía una adición a una tienda web Magento, me topé con un par de problemas. En mi búsqueda por crear código lo más rápido posible, me encontré incapaz de resolver dos cosas.

Mi código (relevante) es el siguiente:

$rc = Mage::getResourceSingleton('catalog/product');
$productName = $rc->getAttributeRawValue($productId, 'name', Mage::app()->getStore());
$productPrice = $rc->getAttributeRawValue($productId, 'price', Mage::app()->getStore());
$productImage = $rc->getAttributeRawValue($productId, 'image', Mage::app()->getStore());
$productUrl = $rc->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());

Las dos cosas que no puedo entender son:

1) ¿Cómo recupero la URL del producto? url_keyno siempre proporciona la URL correcta, ya que no todas las tiendas web utilizan URL canónicas o tienen la categoría en la URL.

2) ¿Cómo puedo obtener la imagen del producto con un ancho / alto establecido, en lugar de la imagen completa? La ->resize()función no funciona en este caso Reconozco (ya que devuelve una URL). Además de eso, ¿es posible obtener el Base Image, Small Imagey por Thumbnailseparado?

Mi objetivo principal es mantener el código lo más rápido posible. Solo tengo una identificación de producto, ya que recorro los elementos secundarios de un producto. No deseo usarlo, ->load()ya que lleva mucho más tiempo de carga.

Sander Koedood
fuente

Respuestas:

7

Puedes hacerlo así:

$smallImage = $rc->getAttributeRawValue($productId, 'small_image', Mage::app()->getStore());
$imageModel = Mage::getModel('catalog/product_image');
$imageModel->setDestinationSubdir('small_image');
$imageModel->setBaseFile($smallImage);
var_dump($imageModel->getUrl());

Análogamente, también puede hacerlo para "imagen" y "miniatura".

mpaepper
fuente
Esto parece funcionar para la imagen normal, pero selecciona una carpeta incorrecta para small_image. Parece que todas las imágenes pequeñas se redimensionan, y no selecciona la variante redimensionada. ¿Alguna idea de cómo resolver eso? ¿Y también tiene una solución para la URL del producto?
Sander Koedood
@SanderKoedood Para cambiar el tamaño, agregue $ imageModel-> setWidth (150) -> setHeight (150) -> resize () -> getUrl ();
mpaepper
En lugar de 150, utilice los valores que necesita, por supuesto;)
mpaepper
Mi conocimiento se extiende tan lejos ;-) pero gracias por señalarlo. Sin embargo, eso no cambia el problema del sitio que carga la carpeta incorrecta. Por lo tanto, no se muestra ninguna imagen al usar la imagen pequeña.
Sander Koedood
5
$productId = 'SOME_PRODUCT_ID';
$product = Mage::getModel('catalog/product')->load($productId);
$productMediaConfig = Mage::getModel('catalog/product_media_config');

$baseImageUrl = $productMediaConfig->getMediaUrl($product->getImage());
$smallImageUrl = $productMediaConfig->getMediaUrl($product->getSmallImage());
$thumbnailUrl = $productMediaConfig->getMediaUrl($product->getThumbnail());
mahethekiller
fuente
Si ejecuto el código anterior, el navegador devuelve la página en blanco. mi código: justpaste.it/7hwc9
Gema
3

Pruebe el código mencionado a continuación para obtener la URL de la imagen:

<?php echo Mage::helper('catalog/image')->init($product, 'thumbnail'); ?>
<?php echo Mage::helper('catalog/image')->init($_product, 'small_image') ?>

O

$productId = 1; // get product ID dynamically instead of 1.
$products = Mage::getModel('catalog/product')->load($productId);
$productUrl = $products->getProductUrl();
$baseImage = $products->getImage(); 
$SmallImage = $products->getSmallImage(); 
$thumbnail = $products->getThumbnail(); 

O

To get product URL:
$_products->getProductUrl();
Abhinav Singh
fuente
2

No puede prescindir de $ productos / $ variable de producto:

Para la URL del producto:

$product->getUrlPath();
'mondrian-large-coffee-table-set-multicolour'

$product->getUrlPath($category);
'tables/mondrian-large-coffee-table-set-multicolour'

// no puede detener este método agregando ___store a la URL, incluso estableciendo _store_to_url en false

$product->getUrlInStore();
'http://made.local/tables/mondrian-large-coffee-table-set-multicolour?___store=default'

** // no puede detener este método agregando ___store a la URL, incluso estableciendo _store_to_url en false // nota - vea la sección "using _ignore_category" a continuación para ver un error discutible con el uso de este parámetro **

$product->getUrlInStore(array('_ignore_category' => true));
'http://made.local/mondrian-large-coffee-table-set-multicolour?___store=default'

$product->getProductUrl();
'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'

$product->getProductUrl(true);
'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'

Para la imagen del producto:

$productId = 1; 
$products = Mage::getModel('catalog/product')->load($productId);
$products->getImage(); $products->getSmallImage(); 
$products->getThumbnail(); 

Si desea que la URL de la imagen se use en la etiqueta,

Mage::helper('catalog/image')->init($products, 'small_image')->resize(163,100); // resize function is used to resize image 
Mage::helper('catalog/image')->init($products, 'image')->resize(400,400); 
Mage::helper('catalog/image')->init($products, 'thumbnail')->resize(60,60); 
TBI Infotech
fuente
Ya obtuve el resultado $product->getUrlPath();, obteniendo el url_key. Entonces eso es posible sin la $productvariable. Eso me hace creer que obtener la imagen del producto y cambiar su tamaño también debería ser posible, sin cargar el producto completo. (así que no uso Mage::getModel('catalog/product')->load($productId);)
Sander Koedood
2

Quiero agregar 1 línea de código al comentario de mpaepper, que creo que es una gran solución en escenarios específicos. Lo usé en un bucle en una página donde no tenía un objeto de producto para cargar la imagen a través del modelo de producto.

Cuando no desee cargar una imagen con un objeto de producto, puede usar el enfoque mpaepper exlpains. No olvide guardar la imagen creada manualmente cuando use esta solución. Cuando guarde el objeto de imagen, creará un archivo de caché como también lo hacen las imágenes normales de Magento.

Entonces el código completo debería ser:

$rc = Mage::getResourceModel('catalog/product'); //empty product model which you only have to load it once. (for the people who want to use this in a loop, put this Resource Model outside the loop.

$smallImage = $rc->getAttributeRawValue($productId, 'small_image', Mage::app()->getStore());
$imageModel = Mage::getModel('catalog/product_image');
$imageModel->setDestinationSubdir('small_image');
$imageModel->setBaseFile($smallImage);
$imageModel->saveFile(); //important line to create an cache file of the image
var_dump($imageModel->getUrl());
IJsbrand van Prattenburg
fuente
1

Se puede acceder a la imagen del producto de la siguiente manera:

$this->helper('catalog/image')->init($_products, 'small_image');

Para cambiar el tamaño de la imagen, puede agregar esto:

$this->helper('catalog/image')->init($_products, 'small_image')->resize(150,150);

Para obtener la URL del producto:

$_products->getProductUrl();

Aquí $ _products es el producto en sí y no la identificación del producto;

Rojan Shrestha
fuente
2
No tengo acceso a la $_productsvariable, ya que eso me obligaría a cargar el producto en su totalidad. Y cargar todos los productos que estoy recorriendo crearía tiempos de carga de segundos, que es demasiado.
Sander Koedood
¿Por qué no querría obtener los datos del producto sin cargar el producto? Puede agregar la función attributeToSelect para seleccionar solo los atributos que necesita en lugar de cargar todos los atributos.
Rojan Shrestha
1
¿Podrías mostrarme cómo conseguirías obtener la URL y la imagen del producto? Mi principal objetivo para no obtener una colección fue la suposición de que esto sería demasiado lento.
Sander Koedood
Por lo general, cargo el producto y nunca se ha sentido lento de ninguna manera. Hago $ _products = Mage :: getModel ('catálogo / producto') -> loadByAttribute ('sku', 'productsku');
Rojan Shrestha
después de eso sigue mi respuesta anterior
Rojan Shrestha