Maneira eficiente de obter imagem e URL do produto

12

Ao criar uma adição a uma loja virtual Magento, me deparei com alguns problemas. Na minha busca por criar um código o mais rápido possível, me vi incapaz de descobrir duas coisas.

Meu código (relevante) é o seguinte:

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

As duas coisas que não consigo entender são:

1) Como recupero o URL do produto? url_keynem sempre fornece o URL correto, pois nem todos os webshops usam URLs canônicos ou a categoria no URL.

2) Como posso obter a imagem do produto com uma largura / altura definidas, em vez da imagem completa? A ->resize()função não funciona neste caso, eu recon (porque retorna uma URL). Adicionado a isso, é possível obter o Base Image, Small Imagee Thumbnailseparadamente?

Meu principal objetivo é manter o código o mais rápido possível. Eu só tenho uma identificação de produto, já que percorro os filhos de um produto. Não desejo usar, ->load()pois isso leva muito mais tempo para carregar.

Sander Koedood
fonte

Respostas:

7

Você pode fazer assim:

$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, você também pode fazer isso para "imagem" e "miniatura".

mpaepper
fonte
Isso parece funcionar para a imagem normal, mas seleciona uma pasta errada para o arquivo small_image. Parece que todas as imagens pequenas são redimensionadas e não seleciona a variante redimensionada. Alguma idéia de como resolver isso? E você também tem uma solução para o URL do produto?
Sander Koedood
@SanderKoedood Para redimensionar, adicione $ imageModel-> setWidth (150) -> setHeight (150) -> resize () -> getUrl ();
mpaepper
Em vez de 150, use os valores que você precisa, é claro;)
mpaepper
Meu conhecimento se espalha tão longe ;-) mas obrigado por apontar. No entanto, isso não altera o problema do site carregar a pasta errada. Portanto, nenhuma imagem é exibida ao usar a imagem pequena.
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
fonte
Se eu executar o código acima, o navegador retornará a página em branco. meu código: justpaste.it/7hwc9
Gem
3

Experimente o código mencionado abaixo para obter o URL da imagem:

<?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
fonte
2

Você não pode prescindir da variável $ products / $ product:

Para o URL do produto:

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

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

// você não pode parar esse método de adicionar ___store ao URL, mesmo configurando _store_to_url como false

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

** // você não pode parar esse método de adicionar ___store à URL, mesmo configurando _store_to_url como false // observação - consulte a seção "using _ignore_category" abaixo para obter um bug discutível ao usar esse 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 imagem do produto:

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

Se você deseja que o URL da imagem seja usado na 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
fonte
Eu já tenho o resultado $product->getUrlPath();, obtendo o url_key. Então isso é possível sem a $productvariável Isso me faz acreditar que também é possível obter a imagem do produto e redimensioná-la, sem carregar o produto inteiro. (de modo a não utilização de Mage::getModel('catalog/product')->load($productId);)
Sander Koedood
2

Quero adicionar 1 linha de código ao comentário do mpaepper, que eu acho que é uma ótima solução em cenários específicos. Usei-o em um loop em uma página onde não tinha um objeto de produto para carregar a imagem através do modelo de produto.

Quando você não deseja carregar uma imagem com um objeto de produto, pode usar a abordagem mpaepper exlpains. Não se esqueça de salvar a imagem criada manualmente ao usar esta solução. Quando você salva o objeto de imagem, ele cria um arquivo de cache, como as imagens normais do Magento também.

Portanto, o código completo deve 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
fonte
1

A imagem do produto pode ser acessada da seguinte maneira:

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

Para redimensionar a imagem, você pode adicionar este:

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

Para obter o URL do produto:

$_products->getProductUrl();

Aqui $ _products é o próprio produto e não o ID do produto;

Rojan Shrestha
fonte
2
Não tenho acesso à $_productsvariável, pois isso exigiria que eu carregasse o produto na sua totalidade. E carregar todos os produtos pelos quais estou circulando criaria tempos de carregamento de segundos, o que é demais.
Sander Koedood
por que você não deseja obter os dados do produto sem carregá-lo? Você pode adicionar a função attributeToSelect para selecionar apenas os atributos necessários, em vez de carregar todos os atributos.
Rojan Shrestha
1
Você poderia me mostrar como obteria o URL e a imagem do produto? Meu principal objetivo para não obter uma coleção era a suposição de que isso seria muito lento.
Sander Koedood
Normalmente, carrego o produto e nunca pareceu lento de forma alguma. Eu faço $ _products = Mage :: getModel ('catalog / product') -> loadByAttribute ('sku', 'productsku');
Rojan Shrestha
depois disso, siga a minha resposta acima
Rojan Shrestha