获取产品URL和图像的有效方法


12

在为Magento网上商店添加产品时,我偶然发现了几个问题。在追求创建尽可能快的代码的过程中,我发现自己无法弄清两件事。

我的(相关)代码如下:

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

我不知道的两件事是:

1)如何检索产品网址?url_key并非总是提供正确的URL,因为并非所有的网店都使用规范的URL或URL中包含类别。

2)如何获得具有固定宽度/高度的产品图像,而不是完整图像?该->resize()功能不会在这种情况下,我的侦察功能(因为它返回一个URL)。加说,是有可能得到的Base ImageSmall ImageThumbnail分别?

我的主要目标是保持代码尽可能快。我只有一个产品ID,因为我会遍历产品的子级。我不希望使用,->load()因为这会花费更多的加载时间。

Answers:


7

您可以这样做:

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

类似地,您也可以针对“图像”和“缩略图”执行此操作。


这似乎适用于常规图像,但是它为选择了错误的文件夹small_image。似乎所有小图像都已调整大小,并且没有选择调整大小的变体。知道如何解决吗?您还对商品网址有解决方案吗?
Sander Koedood 2014年

@SanderKoedood要调整大小,请添加$ imageModel-> setWidth(150)-> setHeight(150)-> resize()-> getUrl();
mpaepper 2014年

当然,请使用所需的值代替150;)
mpaepper 2014年

我的知识的确传播了这么远;-),但感谢您指出这一点。但是,这不会改变网站加载错误文件夹的问题。因此,使用小图像时不会显示任何图像。
Sander Koedood 2014年

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

如果我运行上述代码,浏览器将返回空白页。我的代码:justpaste.it/7hwc9
Gem

3

试试下面提到的代码来获取图像URL:

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

要么

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

要么

To get product URL:
$_products->getProductUrl();

2

您不能没有$ products / $ product变量:

对于产品网址:

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

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

//即使将_store_to_url设置为false,也无法停止将___store添加到URL的方法

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

** //即使将_store_to_url设置为false,也无法停止将___store添加到URL的方法//注意-请参阅下面的“使用_ignore_category”部分,以获取使用此参数的可争论的错误**

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

对于产品图片:

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

如果您想在标记中使用图片网址,

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

$product->getUrlPath();通过获取,我已经有了结果url_key。因此,没有$product变量是可能的。这使我相信,无需加载整个产品,也可以获取产品图像并调整其大小。(因此不使用Mage::getModel('catalog/product')->load($productId);
Sander Koedood 2014年

2

我想在mpaepper的注释中添加1行代码,我认为这在特定情况下是一个很好的解决方案。我在没有产品对象的页面上的循环中使用它来通过产品模型加载图像。

当您不想使用产品对象加载图像时,可以使用方法mpaepper exlpains。使用此解决方案时,请不要忘记保存手动创建的图像。保存图像对象时,它将创建一个缓存文件,就像普通的Magento图像一样。

因此完整的代码应为:

$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

可以通过以下方式访问产品的图像:

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

要调整图像大小,您可以添加以下内容:

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

要获取产品网址:

$_products->getProductUrl();

这里$ _products是产品本身,而不是产品ID;


2
我无权访问该$_products变量,因为这将需要我完全加载该产品。而要加载我正在循环浏览的所有产品,将导致加载时间仅为几秒钟,这实在太多了。
Sander Koedood 2014年

为什么您不希望在不加载产品的情况下获取产品数据?您可以添加attributeToSelect函数以仅选择所需的属性,而不是加载所有属性。
Rojan Shrestha 2014年

1
您能告诉我如何获取产品网址和图片吗?我没有收集的主要目的是假设这样做太慢。
Sander Koedood 2014年

我通常会加载产品,但从来没有感觉到任何速度变慢。我做$ _products = Mage :: getModel('catalog / product')-> loadByAttribute('sku','productsku');
Rojan Shrestha 2014年

之后,请按照我的上方答案
Rojan Shrestha 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.