在magento里面批量上传多个产品是件很麻烦的事情,但工作效率却很高,所以大家都愿意用这种方法上传产品,特别是在产品很多的情况下。相信很多朋友都学会了怎样在magento里批量上传多个产品的技巧了,但目前还有一个问题大家经常会问到,就是怎样批量上传带有多个图片的产品呢?在这里我给大家详细解说一下。下面是详细步骤

第一步:

到/app/etc/modules/ 目录下创建文件并命名为YDL_ImportMultipleImages.xml 该文件会告诉Magento你有这样的模块,以及它的位置。代码如下:

[Copy to clipboard]​ ​View Code XML

magento 单产品多图片批量上传技巧_批量上传


第二步:

创建文件 /app/code/local/YDL/ImportMultipleImages/etc/config.xml

这个文件是你的模块配置文件。它告诉Magento哪个阶级我们将重写。详细点就是到你的/app/code/local  先新建YDL文件夹,再进入YDL里面新建ImportMultipleImages文件夹,接着再进入里面新建etc文件夹,最后进入新建config.xml 文件.

代码如下:


​​​[Copy to clipboard]​ ​View Code XML

magento 单产品多图片批量上传技巧_批量上传_02



第三步:

创建文件 /app/code/local/YDL/ImportMultipleImages/Model/Convert/Adapter/Product.php  此文件中扩大了saveRow() 类方法,这样保证了当你的magento升级后仍然能够使用多图片批量上传功能。代码如下:


< ?php
/**
* Import Multiple Images during Product Import
*
*/

class YDL_ImportMultipleImages_Model_Convert_Adapter_Product extends Mage_Catalog_Model_Convert_Adapter_Product
{
/**
* Save product (import)
*
* @param array $importData
* @throws Mage_Core_Exception
* @return bool
*/
public function saveRow(array $importData)
{
$product = $this->getProductModel()
->reset();

if (empty($importData['store'])) {
if (!is_null($this->getBatchParams('store'))) {
$store = $this->getStoreById($this->getBatchParams('store'));
} else {
$message = Mage::helper('catalog')->__('Skip import row, required field "%s" not defined', 'store');
Mage::throwException($message);
}
}
else {
$store = $this->getStoreByCode($importData['store']);
}

if ($store === false) {
$message = Mage::helper('catalog')->__('Skip import row, store "%s" field not exists', $importData['store']);
Mage::throwException($message);
}

if (empty($importData['sku'])) {
$message = Mage::helper('catalog')->__('Skip import row, required field "%s" not defined', 'sku');
Mage::throwException($message);
}
$product->setStoreId($store->getId());
$productId = $product->getIdBySku($importData['sku']);

if ($productId) {
$product->load($productId);
}
else {
$productTypes = $this->getProductTypes();
$productAttributeSets = $this->getProductAttributeSets();

/**
* Check product define type
*/
if (empty($importData['type']) || !isset($productTypes[strtolower($importData['type'])])) {
$value = isset($importData['type']) ? $importData['type'] : '';
$message = Mage::helper('catalog')->__('Skip import row, is not valid value "%s" for field "%s"', $value, 'type');
Mage::throwException($message);
}
$product->setTypeId($productTypes[strtolower($importData['type'])]);
/**
* Check product define attribute set
*/
if (empty($importData['attribute_set']) || !isset($productAttributeSets[$importData['attribute_set']])) {
$value = isset($importData['attribute_set']) ? $importData['attribute_set'] : '';
$message = Mage::helper('catalog')->__('Skip import row, is not valid value "%s" for field "%s"', $value, 'attribute_set');
Mage::throwException($message);
}
$product->setAttributeSetId($productAttributeSets[$importData['attribute_set']]);

foreach ($this->_requiredFields as $field) {
$attribute = $this->getAttribute($field);
if (!isset($importData[$field]) && $attribute && $attribute->getIsRequired()) {
$message = Mage::helper('catalog')->__('Skip import row, required field "%s" for new products not defined', $field);
Mage::throwException($message);
}
}
}

$this->setProductTypeInstance($product);

if (isset($importData['category_ids'])) {
$product->setCategoryIds($importData['category_ids']);
}

foreach ($this->_ignoreFields as $field) {
if (isset($importData[$field])) {
unset($importData[$field]);
}
}

if ($store->getId() != 0) {
$websiteIds = $product->getWebsiteIds();
if (!is_array($websiteIds)) {
$websiteIds = array();
}
if (!in_array($store->getWebsiteId(), $websiteIds)) {
$websiteIds[] = $store->getWebsiteId();
}
$product->setWebsiteIds($websiteIds);
}

if (isset($importData['websites'])) {
$websiteIds = $product->getWebsiteIds();
if (!is_array($websiteIds)) {
$websiteIds = array();
}
$websiteCodes = split(',', $importData['websites']);
foreach ($websiteCodes as $websiteCode) {
try {
$website = Mage::app()->getWebsite(trim($websiteCode));
if (!in_array($website->getId(), $websiteIds)) {
$websiteIds[] = $website->getId();
}
}
catch (Exception $e) {}
}
$product->setWebsiteIds($websiteIds);
unset($websiteIds);
}

foreach ($importData as $field => $value) {
if (in_array($field, $this->_inventoryFields)) {
continue;
}
if (in_array($field, $this->_imageFields)) {
continue;
}

$attribute = $this->getAttribute($field);
if (!$attribute) {
continue;
}

$isArray = false;
$setValue = $value;

if ($attribute->getFrontendInput() == 'multiselect') {
$value = split(self::MULTI_DELIMITER, $value);
$isArray = true;
$setValue = array();
}

if ($value && $attribute->getBackendType() == 'decimal') {
$setValue = $this->getNumber($value);
}

if ($attribute->usesSource()) {
$options = $attribute->getSource()->getAllOptions(false);

if ($isArray) {
foreach ($options as $item) {
if (in_array($item['label'], $value)) {
$setValue[] = $item['value'];
}
}
}
else {
$setValue = null;
foreach ($options as $item) {
if ($item['label'] == $value) {
$setValue = $item['value'];
}
}
}
}

$product->setData($field, $setValue);
}

if (!$product->getVisibility()) {
$product->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE);
}

$stockData = array();
$inventoryFields = isset($this->_inventoryFieldsProductTypes[$product->getTypeId()])
? $this->_inventoryFieldsProductTypes[$product->getTypeId()]
: array();
foreach ($inventoryFields as $field) {
if (isset($importData[$field])) {
if (in_array($field, $this->_toNumber)) {
$stockData[$field] = $this->getNumber($importData[$field]);
}
else {
$stockData[$field] = $importData[$field];
}
}
}
$product->setStockData($stockData);

$imageData = array();
foreach ($this->_imageFields as $field) {
if (!empty($importData[$field]) && $importData[$field] != 'no_selection') {
if (!isset($imageData[$importData[$field]])) {
$imageData[$importData[$field]] = array();
}
$imageData[$importData[$field]][] = $field;
}
}

foreach ($imageData as $file => $fields) {
try {
$product->addImageToMediaGallery(Mage::getBaseDir('media') . DS . 'import' . $file, $fields);
}
catch (Exception $e) {}
}

/**
* Allows you to import multiple images for each product.
* Simply add a 'gallery' column to the import file, and separate
* each image with a semi-colon.
*/
try {
$galleryData = explode(';',$importData["gallery"]);
foreach($galleryData as $gallery_img)
/**
* @param directory where import image resides
* @param leave 'null' so that it isn't imported as thumbnail, base, or small
* @param false = the image is copied, not moved from the import directory to it's new location
* @param false = not excluded from the front end gallery
*/
{
$product->addImageToMediaGallery(Mage::getBaseDir('media') . DS . 'import' . $gallery_img, null, false, false);
}
}
catch (Exception $e) {}
/* End Modification */

$product->setIsMassupdate(true);
$product->setExcludeUrlRewrite(true);

$product->save();

return true;
}
}


第四步:

现在可以开始进行批量上传了!哈哈,不过在上传之前还有很重要的事要做,不然会前功尽弃,就是在编写好你的csv文件后,需要在你的csv文件里增加一列并命名为gallery,然后在此列中把你想要上传的产品图片分别用半角英文分号“;” 隔开,举个例子吧:

你的gallery 这一列 必需类似于 / image1.jpg;/ image2.jpg;/ image3.jpg

好了,基本上大功告成了,你可以在后台->系统(System)->设置(Configuration)->高级(Advanced)里面高级选项-“模块输出”里看到你添加的模块YDL_ImportMultipleImages。

只要你csv文件里的其它产品属性字段没有错误,保证你的多个图片能成功的显示在你的magento网店中。 最终在前台显示的结果如下图:

eg:

注:如果你觉得自己写代码比较麻烦,为了需要,这里提供一个批量上传多图的模块供大家免费下载。请看“(分享)批量上传多图模块(非在线安装)”一文。

大家都知道magento程序在批量上传产品时是无法导入多张图片的,为了需要,这里提供一个批量上传多图的模块供大家免费下载。本人在magento1.324和magento1.4.1.0版本测试均能正确上传多图。

下载地址:http://topmagento.com/wp-content/uploads/2010/07/magento-import-multiple-images-for-products-module.zip

安装步骤:
1.解压文件包。
2.复制包内app文件夹,用ftp等软件上传到magento根目录覆盖原来的app文件夹即可。
3.登录magento后台控制面板,刷新缓存。
4.登录后台->系统(System)->设置(Configuration)->高级(Advanced)里面高级选项-“模块输出”里看到你新添加的模块MY_ImportMultipleImages。确保把它设置成enable。

接着你就可以用magento自带的导入/导出(import/export)工具进行批量上传了,上传产品时需注意一点,在原来csv文件中需插入一列,属性字段为”gallery” 。

前面“magento 单产品多图片批量上传技巧”这篇文章有详细介绍,这里就不多说了。