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

时间:2022-06-26 14:53:51

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

第一步:

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

1
2
3
4
5
6
7
8
9
< ?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 文件.

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
< ?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升级后仍然能够使用多图片批量上传功能。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
< ?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

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

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

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

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

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

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

大家都知道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 单产品多图片批量上传技巧”这篇文章有详细介绍,这里就不多说了。