编辑:我正在使用Magento 1.6.2(社区)
我想迭代产品。我运行以下代码(虽然这不是一个完整的文件,它是SOAP服务的类定义的一部分 - 这里没有描述的方法对我的问题不重要):
//ok
private function _listProductData($product, $full = false)
{
$result = array(
//_getProductAttribute($product, $attribute)
'product_id' => $product->getId(),
'type' => $product->getTypeId(),
'position' => $product->getCatIndexPosition(),
'sku' => $product->getSku(),
'price' => $this->_getProductAttribute($product, 'price'),
'kilometraje' => $this->_getProductAttribute($product, 'kilometraje'),
'thumbnail' => Mage::helper('catalog/image')->init($product, 'thumbnail'),
'model' => $this->_getProductModel($product)
);
if ($full)
{
//meter mas datos
$result = $result + array(
'image' => $this->_getProductAttribute($product, 'small_image'),
'tipo_vehiculo' => $this->_getProductAttribute($product, 'vehiculo_tipo', true),
'cilindrada' => $this->_getProductAttribute($product, 'cilindrada', true),
'combustible' => $this->_getProductAttribute($product, 'combustible', true),
'transmision' => $this->_getProductAttribute($product, 'transmision', true),
'direccion' => $this->_getProductAttribute($product, 'direccion', true),
'traccion' => $this->_getProductAttribute($product, 'traccion', true),
'anio' => $this->_getProductAttribute($product, 'rango_anio', true),
'tapiz' => $this->_getProductAttribute($product, 'tapiz', true),
'aire_acondicionado' => $this->_getProductAttribute($product, 'aire_acondicionado', true),
'vidrios' => $this->_getProductAttribute($product, 'vidrios', true),
'origen' => $this->_getProductAttribute($product, 'origen', true),
'numero_placa' => $this->_getProductAttribute($product, 'numero_placa', true),
'placa' => $this->_getProductAttribute($product, 'placa')
);
}
//$result = array();
//foreach ($product->getTypeInstance(true)->getEditableAttributes($product) as $attribute) {
// if ($this->_isAllowedAttribute($attribute, $attributes)) {
// $result[$attribute->getAttributeCode()] = $product->getData($attribute->getAttributeCode());
// }
//}
return $result;
}
//ok
private function _listProductCollection($collection, $offset, $order)
{
//ordenamos y nos quedamos con un cachito de la coleccion nomas
$order = in_array($order, array('ASC', 'DESC', false)) ? $order : false;
$order ? $collection->setOrder('name', $order) : false;
$collection->setPage($offset, 10);
//iteramos y recolectamos los datos (TO-DO listar los atributos y la imagen principal)
$result = array();
foreach ($collection as $product) {
$result[] = $this->_listProductData($product, false);
}
return $result;
}
//ok
public function listVehicles($categoryId=null, $offset=1, $order='ASC')
{
$categoryId = (int) $categoryId;
$offset = (int) $offset;
if (($categoryId < 1) || ($offset < 1) || !in_array($order, array('DESC', 'ASC'))) {
$this->_fault('bad_params');
}
//cargamos categoria actual, y store actual (1).
//la categoria no puede ser de una rama que no sea Marcas o Tipos.
//si eso pasa, o la categoria no existe, tiramos un 404.
$category = $this->_initCategory($categoryId, 1);
$parentId = $category->getParentId();
if (!in_array($parentId, array(4, 94))) {
$this->_fault('category_not_exists');
}
//tratamos su lista de resultado.
return $this->_listProductCollection($category->setStoreId($storeId = 1)->getProductCollection()->addAttributeToSelect('*'), $offset, $order);
}
要获取每个单独项目的图片,我曾经让行$this->_getProductAttribute($product, 'thumbnail')
,但它返回了一个相对网址:/p/c/pcd0748-1.jpg
(仅限说明网址)。
当我试图获取完整的url时,通过知道它的基本url所以我只需要附加块,我发现这样的基本url不是那么“稳定”(即不是一个众所周知的文件夹结构,而是一些东西与缓存有关):
所以我不能简单地将那个长网址作为基本网址,因为哈希 - 常识告诉我们这个基本网址会改变。
所以我将图像检索行更改为当前给定的(Mage::helper('catalog/image')->init($product, 'thumbnail')
),我收到了内存错误(我得到了10个产品的子集,所以这样的行运行共10次)。
Fatal error: Allowed memory size of 314572800 bytes exhausted (tried to allocate 295698398 bytes) ...
(10张图片为295MB !!!)
是否有一种更高效的方式,不会因为10张图像而扼杀我的记忆?我知道这样的图像存在,只是想得到图像网址。
答案 0 :(得分:0)
解决方案:
Mage::helper('catalog/image')->init($product, 'thumbnail')
这不会返回一个URL,而是一个非常复杂的对象,它有一个指向产品模型对象的指针。并且这样的对象具有指向对象的巨大链(或树)的指针,其总计这样的存储量。序列化这样的对象会要求很多MB。
要仅获取网址,必须将对象转换为字符串:
(string) Mage::helper('catalog/image')->init($product, 'thumbnail')
这只会有url - 这是我对序列化的期望。