Magento API 管理产品图片

Magento API操作产品图片参考文档:http://www.magentocommerce.com/api/soap/catalog/catalogProductAttributeMedia/productImages.html

1 首先看看所谓的MediaTypes:

// 44 是属性集Id
$result = $proxy->catalogProductAttributeMediaTypes($sessionId, '44');
var_dump($result); 

// 输出
array(4) {
  [0]=>
  object(stdClass)#2 (2) {
    ["code"]=>
    string(9) "thumbnail"
    ["scope"]=>
    string(5) "store"
  }
  [1]=>
  object(stdClass)#3 (2) {
    ["code"]=>
    string(11) "small_image"
    ["scope"]=>
    string(5) "store"
  }
  [2]=>
  object(stdClass)#4 (2) {
    ["code"]=>
    string(5) "image"
    ["scope"]=>
    string(5) "store"
  }
  [3]=>
  object(stdClass)#5 (2) {
    ["code"]=>
    string(14) "my_media_image"
    ["scope"]=>
    string(5) "store"
  }
}

可见媒体的类型就是指thumbnail、small_image、image和my_media_image(自定义属性)。自定义属性my_media_image添加到了属性集Id为44的某个组中,我们找一个应用了这个属性集的产品查看图片:
Magento添加自定义的媒体属性

除了系统自定义的类型,还添加了一个my_media_image(底下的单选表示选择哪张图的链接保存到这个属性中)。

2 catalogProductAttributeMediaCurrentStore
这个方法可以获取商店Id, 或者设置当前商店Id(方法第二参数)。可以通过它改变当前商店(默认情况在处于0)方便针对某个商店的图片应用。

$result = $proxy->catalogProductAttributeMediaCurrentStore($sessionId, 'english');
var_dump($result);

3 catalogProductAttributeMediaInfo
获取媒体信息,通过第三参数指定图片链接。看起来当只想查看某个图片的信息时比较有用。但是还要指定图片链接….

4 catalogProductAttributeMediaRemove
这个方法和catalogProductAttributeMediaInfo参数类似,第三参数指定图片链接,它将删除这个图片(注意,它只是把相关信息从数据库中去除,并没有实际删除文件)。

5 catalogProductAttributeMediaList
获取图片列表,第二参数指定产品Id,第三参数可选,指定StoreId(默认是0,表示默认,如果要获取只应用到了某个商店的图片列表就需要指定了)

$result = $proxy->catalogProductAttributeMediaList($sessionId, '48');
var_dump($result);

array(3) {
  [0]=>
  object(stdClass)#2 (6) {
    ["file"]=>
    string(48) "/k/o/kodak-easyshare-c530-5mp-digital-camera.jpg"
    ["label"]=>
    string(0) ""
    ["position"]=>
    string(1) "0"
    ["exclude"]=>
    string(1) "0"
    ["url"]=>
    string(96) "http://magento.vfeelit.com/media/catalog/product/k/o/kodak-easyshare-c530-5mp-digital-camera.jpg"
    ["types"]=>
    array(0) {
    }
  }
  [1]=>
  object(stdClass)#3 (6) {
    ["file"]=>
    string(50) "/k/o/kodak-easyshare-c530-5mp-digital-camera-1.jpg"
    ["label"]=>
    string(0) ""
    ["position"]=>
    string(1) "0"
    ["exclude"]=>
    string(1) "0"
    ["url"]=>
    string(98) "http://magento.vfeelit.com/media/catalog/product/k/o/kodak-easyshare-c530-5mp-digital-camera-1.jpg"
    ["types"]=>
    array(0) {
    }
  }
  [2]=>
  object(stdClass)#4 (6) {
    ["file"]=>
    string(50) "/k/o/kodak-easyshare-c530-5mp-digital-camera-2.jpg"
    ["label"]=>
    string(0) ""
    ["position"]=>
    string(1) "0"
    ["exclude"]=>
    string(1) "1"
    ["url"]=>
    string(98) "http://magento.vfeelit.com/media/catalog/product/k/o/kodak-easyshare-c530-5mp-digital-camera-2.jpg"
    ["types"]=>
    array(3) {
      [0]=>
      string(9) "thumbnail"
      [1]=>
      string(11) "small_image"
      [2]=>
      string(5) "image"
      [3]=>
      string(14) "my_media_image"
    }
  }
}

注意观察这个输出,第一第二个types是一个空数组,第三个types分别列出了4个属性(其中三个系统默认,一个自定义),它表示当前这个图片的链接保存到对应的这四个属性中(产品主图首先应用这些属性的信息,也可以把不同属性应用到不同图片)。

6 catalogProductAttributeMediaUpdate
这个方法是更新图片信息,第三参数指定图片链接,第四参数给出新图片信息,第五参数可选,指定更新只应用到指定商店的图片信息。

$productId = 1;
$file = '/i/m/image.jpg';

$newFile = array(
'content' => '',
'mime' => 'image/jpeg'
);

$result = $client->catalogProductAttributeMediaUpdate(
$session,
$productId,
$file,
array('file' => $newFile, 'label' => 'New label', 'position' => '50', 'types' => array('image'), 'exclude' => 1)
);

更新已经存在的图片的相关信息比较有用,但是如果指定了file(相当上传图片),那么跟删除了原来的图片然后新建没有什么不一样(只是更新了数据表的字段信息)。

7 catalogProductAttributeMediaCreate
这个是比较有用的方法。它可以实现在后台图片管理那里上传图片然后保存类似的操作。看例子:

$productId = 2;
$file = array(
	'content' => '',
	'mime' => 'image/jpeg'
);

$result = $proxy->catalogProductAttributeMediaCreate(
	$session,
	$productId,
	array('file' => $file, 'label' => 'Label', 'position' => '100', 'types' => array('thumbnail'), 'exclude' => 0)
);

方法的第三参数是一个数组指定了图片的相关信息,数组下标是file的索引它指向一个表示图片的数组,它又由三部分组成,content是图片经过base_64编码后的字符串(这个就相当上传图片了),第二个是mime类型,比如image/jpeg,它用来表示图片的类型,第三个可选,指定图片名字(不指定系统自命名,一般还是指定比较好,这样可以使用自己的名字)。然后label就是图片的alt信息,position是图片排序码,exclude表示是否应用到当前店铺(默认店铺是0,当然需要指定为0,不过如果当前店铺有指定,而且不希望这个图片应用到这个店铺,那么这个exclude就可以设置为1),还有就是types,它指定这个图片是否保存到类型指定的属性中,比如这里的thumbnail,那就会用新图链接更新当前产品的thumbnail对应的值。

以下是一个更加实用的例子:

//$client = new SoapClient('http://magento.vfeelit.com/api/soap/?wsdl');
$proxy = new SoapClient('http://magento.vfeelit.com/api/v2_soap/?wsdl');
$sessionId = $proxy->login('vfeelit', '1234567890');

$pid = 48;
$image = "http://magento.vfeelit.com/test.jpg";
$file = array(
	'content' => base64_encode(file_get_contents($image)),
	'mime' => 'image/jpeg',
	'name' => 'new-main-image' //如果没有指定名字,系统自动命名为image,注意:千万不要加后缀,系统将根据提供的mime自定添加后缀
);

$result = $proxy->catalogProductAttributeMediaCreate(
	$sessionId,
	$pid,
	array('file' => $file, 'label' => 'Label', 'position' => '100', 'types' => array(), 'exclude' => 0)
);
echo $result;

可以把这段代码和现有的导入程序进行整合,批量导入产品图片。

永久链接:http://blog.ifeeline.com/601.html
原创文章,转载务必保留出处。