我最近在处理图像,我相信我对它有很好的理解。
我不认为约书亚所说的是“真正的”正确答案。很高兴他的回答可以解决您的问题,但我无法忍受看到误导性信息。
至于他的第一个选项,是“正确的”。
让我分解代码:
Mage_Catalog_Model_Product_Media_Config
public function getMediaUrl($file)
{
$file = $this->_prepareFileForUrl($file);
if(substr($file, 0, 1) == '/') {
return $this->getBaseMediaUrl() . $file;
}
return $this->getBaseMediaUrl() . '/' . $file;
}
public function getBaseMediaUrl()
{
return Mage::getBaseUrl('media') . 'catalog/product';
}
protected function _prepareFileForUrl($file)
{
return str_replace(DS, '/', $file);
}
如您所见,它只是简单地添加media/ + catalog/product + $file
.
$file 取自数据库,值将类似于/e/x/example.jpeg
您上传的产品图片存储在这些文件夹中。
现在,对于为什么$product-> getImageUrl()
给你错误的 URL 的问题仍然未知。
Josua 建议的第二个选项的代码:
$this->helper('catalog/image')
->init($product, $type)
->resize(163, 100);
与 几乎“几乎”相同$product->getImageUrl()
,只是有所不同resize
Mage_Catalog_Model_Product
public function getImageUrl()
{
return (string)$this->_getImageHelper()->init($this, 'image')->resize(265);
}
因此,对于他的第二个选项,它将与您的旧代码给出相同的结果。我不知道他为什么建议第二个选项,我认为他从不检查这些功能背后的内容(这不是一个好主意,因为它可能导致错误信息)
当您调用时$product->getImageUrl()
,它会尝试从缓存中加载您的图像(如果存在),如果不存在,它将从数据库中加载图像(获取路径,然后从媒体文件夹中查找正确的图像)并创建缓存。如果找不到图像或发生错误,它将获取占位符图像。
我的建议是检查是否抛出异常。您需要使用旧代码$product->getImageUrl()
。打开你的app/code/core/Mage/Catalog/Helper/Image.php
然后转到:
Mage_Catalog_Helper_Image
public function __toString()
{
try {
if( $this->getImageFile() ) {
$this->_getModel()->setBaseFile( $this->getImageFile() );
} else {
$this->_getModel()->setBaseFile( $this->getProduct()->getData($this->_getModel()->getDestinationSubdir()) );
}
if( $this->_getModel()->isCached() ) {
return $this->_getModel()->getUrl();
} else {
if( $this->_scheduleRotate ) {
$this->_getModel()->rotate( $this->getAngle() );
}
if ($this->_scheduleResize) {
$this->_getModel()->resize();
}
if( $this->getWatermark() ) {
$this->_getModel()->setWatermark($this->getWatermark());
}
$url = $this->_getModel()->saveFile()->getUrl();
}
} catch( Exception $e ) {
//put log to show error message
Mage::log($e->getMessage());
$url = Mage::getDesign()->getSkinUrl($this->getPlaceholder());
}
return $url;
}
如果抛出Mage::log($e->getMessage());
异常,则记录在日志中。很可能会调用您的占位符图像,因为引发了异常。
这只是我的一个建议,以确保您的图像/其他事情没有问题,因为实际上您已经通过直接从media/catalog/product/...
Josua 代码的另一个更正:
注意 $full_product = Mage::getModel('catalog/product')->load($product_id);
这是绝对没有必要的,因为在 foreach($collection as $product) 内部,将加载产品对象,因此不需要再次加载产品($product_id 也未定义)
更新,只是修复你的代码:
public function items($filters = null, $store = null)
{
$collection = Mage::getModel('catalog/product')->getCollection()
->addStoreFilter($this->_getStoreId($store))
->addAttributeToSelect(array('name','image'));
//->addAttributeToSelect('name'); add another select, either image / small_image / thumbnail, modify it as you need
if (is_array($filters)) {
try {
foreach ($filters as $field => $value) {
if (isset($this->_filtersMap[$field])) {
$field = $this->_filtersMap[$field];
}
$collection->addFieldToFilter($field, $value);
}
} catch (Mage_Core_Exception $e) {
$this->_fault('filters_invalid', $e->getMessage());
}
}
$result = array();
foreach ($collection as $product) {
//$result[] = $product->getData();
$result[] = array( // Basic product data
'product_id' => $product->getId(),
'sku' => $product->getSku(),
'name' => $product->getName(),
'set' => $product->getAttributeSetId(),
'type' => $product->getTypeId(),
'category_ids'=> $product->getCategoryIds(),
'url_path' => $product-> getImageUrl() // Added the Method here
);
}
return $result;
}