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

(继续)

,相 信大家按照我的步骤来,最终绝对会迈向成功,获取成就的喜悦!

下面是详细步骤

第一步:

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


<?xml version="1.0"?>

<config>

    <modules>

        <ydl_ImportMultipleImages>

            <active>true</active>

            <codePool>local</codePool>

        </ydl_ImportMultipleImages>

    </modules>

</config>






第二步:


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


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

代码如下:

<?xml version="1.0"?>
 <config>
 <modules>
 <ydl_ImportMultipleImages>
 <version>0.1.0</version>
 </ydl_ImportMultipleImages>
 </modules>
 <global>
 <models>
 <catalog>
 <rewrite>
 <!-- Override Mage_Catalog_Model_Convert_Adapter_Product -->
 <convert_adapter_product>ydl_ImportMultipleImages_Model_Convert_Adapter_Product</convert_adapter_product>
 </rewrite>
 </catalog>
 </models>
 </global>
 </config>

 

第三步:

创建文件 /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网店 中。