Modo efficiente per ottenere l'URL e l'immagine del prodotto


12

Mentre costruivo un'aggiunta a un webshop Magento, mi sono imbattuto in un paio di problemi. Nel mio tentativo di creare codice il più velocemente possibile, mi sono trovato incapace di capire due cose.

Il mio codice (rilevante) è il seguente:

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

Le due cose che non riesco a capire sono:

1) Come posso recuperare l'URL del prodotto? url_keynon sempre fornisce l'URL giusto, dal momento che non tutti i negozi web utilizzano URL canonici o hanno la categoria nell'URL.

2) Come posso ottenere l'immagine del prodotto con una larghezza / altezza impostata, anziché l'immagine completa? La ->resize()funzione non funziona in questo caso che ricono (poiché restituisce un URL). Aggiunto a questo, è possibile ottenere il Base Image, Small Imagee Thumbnailseparatamente?

Il mio obiettivo principale è mantenere il codice il più velocemente possibile. Ho solo un ID prodotto, poiché cerco i figli di un prodotto. Non desidero utilizzarlo ->load()poiché richiede molto più tempo di caricamento.

Risposte:


7

Puoi farlo in questo modo:

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

Analogamente, puoi anche farlo per "immagine" e "anteprima".


Questo sembra funzionare per l'immagine normale, ma seleziona una cartella errata per small_image. Sembra che tutte le piccole immagini vengano ridimensionate e non seleziona la variante ridimensionata. Qualche idea su come risolverlo? E hai anche una soluzione per l'URL del prodotto?
Sander Koedood,

@SanderKoedood Per il ridimensionamento, aggiungi $ imageModel-> setWidth (150) -> setHeight (150) -> resize () -> getUrl ();
mpaepper,

Invece di 150, usa i valori di cui hai bisogno, ovviamente;)
mpaepper,

La mia conoscenza si è diffusa così lontano ;-) ma grazie per averlo sottolineato. Tuttavia, ciò non cambia il problema del sito che carica la cartella sbagliata. Quindi nessuna immagine mostra quando si usa l'immagine piccola.
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());

Se corro sopra il codice, il browser restituisce una pagina vuota. il mio codice: justpaste.it/7hwc9
Gemma

3

Prova il codice sotto indicato per ottenere l'URL dell'immagine:

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

2

Non puoi fare a meno di $ prodotti / $ variabile prodotto:

Per l'URL del prodotto:

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

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

// non puoi interrompere questo metodo aggiungendo ___store all'URL, anche impostando _store_to_url su false

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

** // non è possibile interrompere questo metodo aggiungendo ___store all'URL, anche impostando _store_to_url su false // note - consultare la sezione "utilizzo di _ignore_category" di seguito per un bug discutibile con l'utilizzo di questo parametro **

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

Per l'immagine del prodotto:

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

Se desideri che l'URL immagine venga utilizzato nel 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); 

Ho già ottenuto il risultato $product->getUrlPath();ottenendo il url_key. In modo che sia possibile senza la $productvariabile. Questo mi fa credere che anche ottenere l'immagine del prodotto e ridimensionarla dovrebbe essere possibile, senza caricare l'intero prodotto. (quindi niente da fare Mage::getModel('catalog/product')->load($productId);)
Sander Koedood,

2

Voglio aggiungere 1 riga di codice al commento di mpaepper, che a mio avviso è un'ottima soluzione in scenari specifici. L'ho usato in un ciclo in una pagina in cui non avevo un oggetto prodotto per caricare l'immagine attraverso il modello del prodotto.

Quando non si desidera caricare un'immagine con un oggetto prodotto, è possibile utilizzare l'approccio mpaepper exlpains. Non dimenticare di salvare l'immagine creata manualmente quando si utilizza questa soluzione. Quando si salva l'oggetto immagine, verrà creato un file cache come fanno anche le normali immagini Magento.

Quindi il codice completo dovrebbe essere:

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

1

È possibile accedere all'immagine del prodotto nel modo seguente:

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

Per ridimensionare l'immagine puoi aggiungere questo:

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

Per ottenere l'URL del prodotto:

$_products->getProductUrl();

Qui $ _products è il prodotto stesso e non l'ID prodotto;


2
Non ho accesso alla $_productsvariabile, poiché ciò richiederebbe di caricare il prodotto nella sua interezza. E caricare tutti i prodotti in cui eseguo il loop creerebbe tempi di caricamento di secondi, il che è troppo.
Sander Koedood,

perché non vorresti ottenere i dati del prodotto senza caricare il prodotto? È possibile aggiungere la funzione attributoToSelect per selezionare solo gli attributi richiesti anziché caricare tutti gli attributi.
Rojan Shrestha,

1
Potresti mostrarmi come andresti a ottenere l'URL e l'immagine del prodotto allora? Il mio scopo principale per non ottenere una collezione era il presupposto che questo sarebbe troppo lento.
Sander Koedood,

Di solito carico il prodotto e non mi è mai sembrato lento in alcun modo. Faccio $ _products = Mage :: getModel ('catalogue / product') -> loadByAttribute ('sku', 'productsku');
Rojan Shrestha,

successivamente segui la mia risposta sopra
Rojan Shrestha,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.