Je souhaite obtenir l’image base product dans Magento pour la redimensionner et l’afficher dans la barre latérale du panier.
Malheureusement ceci:
echo $this->helper('catalog/image')->init($_product, 'image')->resize(38, 38);
imprime l'image de marque Magento.
L'image de base est correctement définie pour ce produit. Une petite image et une miniature fonctionnent très bien.
Aucune idée de ce qui se passe.
EDIT: Solution: Obtenez les données complètes du produit de cette façon:
$_product = Mage::getModel('catalog/product')->load($_item->getProduct()->getId());
et ensuite l'utiliser comme vous le souhaitez:
echo $this->helper('catalog/image')->init($_product, 'image')->resize(38, 38);
ÊTRE CONSCIENT!
$this->helper('catalog/image')->init($_product, 'small_image')->resize(38, 38);
is object , not url string it self. Oui, vous pouvez l’utiliser directement avec echo, mais vous ne devriez pas l’affecter à var. Par exemple ceci ne fonctionnera pas :
$images = array();
foreach($products as $_product){
$images[]=$this->helper('catalog/image')->init($_product, 'small_image')
->resize(38, 38);
}
Après chaque opération, vous n’avez sauvegardé qu’une dernière URL d’image. Un moyen simple est d'obtenir une URL réellement ficelée:
$images = array();
foreach($products as $_product){
$images_obj = $this->helper('catalog/image')->init($_product, 'small_image')
->resize(38, 38);
$images[] = (string)$images_obj;
}
Essayer:
$this->helper('catalog/image')->init($_product, 'image')->keepFrame(false)
->constrainOnly(true)->resize(38,38);
Une petite image et une miniature fonctionnent très bien.
Puis essayez small_image au lieu d’image, comme ceci:
echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(38, 38);
<img src='.$this->helper('catalog/image')->init($product, 'small_image')->resize(225, 225).' width=\'225\' height=\'225\'/>
La raison en est que l'attribut image
n'est pas chargé dans la liste de produits. Normalement, vous pouvez modifier cela en modifiant l'attribut, mais vous ne pouvez pas modifier ces paramètres pour cet attribut. Je pense que c'est parce que c'est un attribut de stock.
TLDR;
UPDATE catalog_eav_attribute SET used_in_product_listing = 1 WHERE attribute_id = 106;
** Attention, vous ne devez pas exécuter cette requête ^^^ avant d’être certain que votre image
attribut_id pour l’entité catalog_product
est égal à 106!
Certaines réponses suggèrent cette méthode:
$_product = Mage::getModel('catalog/product')->load($_item->getProduct()->getId());
echo $this->helper('catalog/image')->init($_product, 'image')->resize(38, 38);
Tu ne devrais pas faire ça! C'est parce que vous allez faire un chargement complet du produit! Ce n'est pas efficace, et est très probablement fait dans une boucle qui est encore pire! Désolé de crier!
Je ne tolère généralement pas les modifications directes de la base de données, mais dans ce cas, c'était la solution la plus simple pour moi:
# First make sure we are using all the right IDs, who knows, I have seen some fubar'ed deployments
SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product';
# 10
SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'image' AND entity_type_id = 10;
# 106
# Now that we know the exact attribute_id....
UPDATE catalog_eav_attribute SET used_in_product_listing = 1 WHERE attribute_id = 106;
Maintenant, les données d'attribut image
seront automatiquement chargées sur les pages de liste de produits. Vous pourrez alors y accéder comme suit:
echo $this->helper('catalog/image')->init($_product, 'image');
La meilleure partie est que vous ne chargez pas l'intégralité du produit dans une boucle! NE JAMAIS FAIRE QUE JAMAIS
** De plus, comme je sais que les gens vont prétendre que ce n'est pas la méthode Magento, l'alternative serait de créer un module doté d'un script d'installation SQL exécutant la commande.