Un moyen efficace pour obtenir l'URL et l'image du produit

12

Lors de la création d'un ajout à une boutique en ligne Magento, je suis tombé sur quelques problèmes. Dans ma quête pour créer un code aussi rapide que possible, je me suis retrouvé incapable de comprendre deux choses.

Mon code (pertinent) est le suivant:

$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());

Les deux choses que je ne peux pas comprendre sont:

1) Comment récupérer l'URL du produit? url_keyne donne pas toujours la bonne URL, car tous les webshops n'utilisent pas d'URL canoniques, ou n'ont pas la catégorie dans l'URL.

2) Comment puis-je obtenir l'image du produit avec une largeur / hauteur définie, au lieu de l'image complète? La ->resize()fonction ne fonctionne pas dans ce cas je recon (car elle retourne une URL). De plus, est-il possible d'obtenir le Base Image, Small Imageet Thumbnailséparément?

Mon objectif principal est de garder le code aussi vite que possible. Je n'ai qu'un identifiant de produit, car je parcourt les enfants d'un produit. Je ne souhaite pas l'utiliser ->load()car cela prend beaucoup plus de temps de chargement.

Sander Koedood
la source

Réponses:

7

Vous pouvez le faire comme ceci:

$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());

De façon analogue, vous pouvez également le faire pour "image" et "miniature".

mpaepper
la source
Cela semble fonctionner pour l'image ordinaire, mais il sélectionne un mauvais dossier pour le small_image. Il semble que les petites images soient toutes redimensionnées et ne sélectionne pas la variante redimensionnée. Une idée de comment résoudre ça? Et avez-vous également une solution pour l'URL du produit?
Sander Koedood
@SanderKoedood Pour le redimensionnement, ajoutez $ imageModel-> setWidth (150) -> setHeight (150) -> resize () -> getUrl ();
mpaepper
Au lieu de 150, utilisez bien sûr les valeurs dont vous avez besoin;)
mpaepper
Mes connaissances se propagent jusque-là ;-) mais merci de l'avoir signalé. Cependant, cela ne change pas le problème du site chargeant le mauvais dossier. Donc, aucune image ne s'affiche lors de l'utilisation de la petite image.
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
la source
Si je lance le code ci-dessus, le navigateur renvoie une page vierge. mon code: justpaste.it/7hwc9
Gem
3

Essayez le code mentionné ci-dessous pour obtenir l'URL de l'image:

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

OU

$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(); 

OU

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

Vous ne pouvez pas vous passer de la variable $ products / $ product:

Pour l'URL du produit:

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

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

// vous ne pouvez pas empêcher cette méthode d'ajouter ___store à l'URL, même en définissant _store_to_url sur false

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

** // vous ne pouvez pas arrêter cette méthode en ajoutant ___store à l'URL, même en définissant _store_to_url sur false // note - voir la section "using _ignore_category" ci-dessous pour un bogue discutable avec l'utilisation de ce paramètre **

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

Pour l'image du produit:

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

Si vous souhaitez utiliser l'URL de l'image dans le tag,

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
la source
J'ai déjà le résultat de $product->getUrlPath();, en obtenant le url_key. C'est donc possible sans la $productvariable. Cela me fait croire qu'obtenir l'image du produit et la redimensionner devrait également être possible sans charger le produit entier. (donc pas d'utilisation de Mage::getModel('catalog/product')->load($productId);)
Sander Koedood
2

Je veux ajouter 1 ligne de code au commentaire de mpaepper, qui, je pense, est une excellente solution dans des scénarios spécifiques. Je l'ai utilisé en boucle sur une page où je n'avais pas d'objet produit pour charger l'image via le modèle de produit.

Lorsque vous ne souhaitez pas charger une image avec un objet produit, vous pouvez utiliser l'approche mpaepper exlpains. N'oubliez pas d'enregistrer l'image créée manuellement lorsque vous utilisez cette solution. Lorsque vous enregistrez l'objet image, il crée un fichier cache comme le font également les images Magento normales.

Le code complet devrait donc être:

$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
la source
1

L'image du produit est accessible de la manière suivante:

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

Pour redimensionner l'image, vous pouvez ajouter ceci:

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

Pour obtenir l'URL du produit:

$_products->getProductUrl();

Ici, $ _products est le produit lui-même et non l'ID produit;

Rojan Shrestha
la source
2
Je n'ai pas accès à la $_productsvariable, car cela m'obligerait à charger le produit dans son intégralité. Et charger tous les produits que je parcourt créerait des temps de chargement de quelques secondes, ce qui est trop.
Sander Koedood
pourquoi ne voudriez-vous pas obtenir les données du produit sans charger le produit? Vous pouvez ajouter la fonction attributeToSelect pour sélectionner uniquement les attributs dont vous avez besoin plutôt que de charger tous les attributs.
Rojan Shrestha
1
Pourriez-vous me montrer comment procéder pour obtenir l'URL et l'image du produit? Mon objectif principal pour ne pas obtenir de collection était l'hypothèse que ce serait trop lent.
Sander Koedood
Je charge habituellement le produit et il ne s'est jamais senti lent. Je fais $ _products = Mage :: getModel ('catalogue / produit') -> loadByAttribute ('sku', 'productsku');
Rojan Shrestha
après cela, suivez ma réponse ci
Rojan Shrestha