2

我正在尝试通过编辑Magento 的 API来获取产品的图像 URL。我曾经获取过URL,但我得到了错误的URL items() function$product-> getImageUrl()

我得到的URL是我们为没有图像 的产品放置的默认图像(图像即将推出,如图像的 url)。

我正在使用XML-RPC从Android 客户端调用该函数。 我得到的产品的其他详细信息是正确的,但是我得到的产品URL是错误的。而且,我得到的不同产品的 所有URL都是相同的。

仅供参考,我在响应中得到的 URL 如下:

http://192.168.1.237/machinetest/media/catalog/product/cache/0/image/265x/9df78eab33525d08d6e5fb8d27136e95/images/catalog/product/placeholder/image.jpg

我正在编辑的功能如下:

public function items($filters = null, $store = null)
{
    $collection = Mage::getModel('catalog/product')->getCollection()
        ->addStoreFilter($this->_getStoreId($store))
        ->addAttributeToSelect('name');

    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;
}
4

3 回答 3

4

我最近在处理图像,我相信我对它有很好的理解。

我不认为约书亚所说的是“真正的”正确答案。很高兴他的回答可以解决您的问题,但我无法忍受看到误导性信息。

至于他的第一个选项,是“正确的”。

让我分解代码:

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;
}
于 2012-09-01T16:48:43.030 回答
4

只需写下请尝试这种方式..您将在顶部获得解决方案

您可以使用此代码获取图像,只需通过它,您将获得图像

public function items($filters = null, $store = null)
{
    $collection = Mage::getModel('catalog/product')->getCollection()
        ->addStoreFilter($this->_getStoreId($store))
        ->addAttributeToSelect('name');

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

        $_product = Mage::getModel('catalog/product')->load($product->getId());
        $_image=$_product->getImageUrl();

        $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(),
            'image_url_path' =>  $_image
        );
    }

    return $result;
}

希望它的工作,如果你有任何疑问告诉我,我会帮助你!

于 2012-09-03T05:15:24.480 回答
0

你的代码太棒了!

是的,您可以通过以下方式获取图片网址:

'url_path'  =>  Mage::getModel('catalog/product_media_config')
                ->getMediaUrl($product->getImage());//getSmallImage(), getThumbnail()

或通过调用另一个选项:

$type = 'small_image';
'url_path'  => $this->helper('catalog/image')
                   ->init($product, $type)
                   ->resize(163, 100);

可以通过 'image' small_image' 或 'thumbnail' 改变

默认:

  • 基本图像:265x265 像素

  • 小图像:135x135 像素

  • 缩略图图像:75x75 像素


更简单的选择(详细):

public function items($filters = null, $store = null)
{
    $collection = Mage::getModel('catalog/product')->getCollection()
        ->addStoreFilter($this->_getStoreId($store))
        ->addAttributeToSelect('name');

    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();
           $full_product = Mage::getModel('catalog/product')->load($product_id);

           $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'  =>  $full_product->getImageUrl(),
            // 'product_path' => $full_product->getProductUrl() 
            // you can call $full_product->getData();
        );
    }
    return $result;
}
于 2012-09-01T12:45:48.813 回答