Import produktów z zdjęciami

Często konieczne jest zaimportowanie listy produktów wraz z ich zdjęciami. Jeżeli posiadamy plik z listą naszych zdjęć ich zaimportowanie jest bardzo poste za pomocą System -> Import/Export -> Data Flow Profile

Jednak wcześniej konieczne będzie dokonanie pewnej modyfikacji pliku

/app/code/core/Mage/Catalog/Model/Convert/Adapter/Product.php

W powyższym pliku odnajdujemy linię :

        foreach ($importData as $field => $value) {

znajduje się ona w okolicy wiersza 707.

Następnie poniżej wstawiamy :

        	if(($field=="Image1" || $field=="Image2" || $field=="Image3") && $value != "" )
        	{ 
				/** EXTERNAL IMAGE IMPORT - START **/
				$image_url  = $value; //get external image url from csv
				$image_type = substr(strrchr($image_url,"."),1); //find the image extension
				$filename   = md5($image_url . $importData['sku']).'.'.$image_type; //give a new name, you can modify as per your requirement
				$filepath   = Mage::getBaseDir('media') . DS . 'import'. DS . $filename; //path for temp storage folder: ./media/import/
				file_put_contents($filepath, file_get_contents(trim($image_url))); //store the image from external url to the temp storage folder
				
				if($field=="Image1")
				{
					/**
					 * BEGIN REMOVE EXISTING MEDIA GALLERY
					 */
					$attributes = $product->getTypeInstance ()->getSetAttributes ();
					if (isset ( $attributes ['media_gallery'] )) {
						$gallery = $attributes ['media_gallery'];
						//Get the images
						$galleryData = $product->getMediaGallery ();
						foreach ( $galleryData ['images'] as $image ) {
							//If image exists
							if ($gallery->getBackend ()->getImage ( $product, $image ['file'] )) {
								$gallery->getBackend ()->removeImage ( $product, $image ['file'] );
							}
						}
						$product->save ();
					}
					/**
					 * END REMOVE EXISTING MEDIA GALLERY
					*/
					
					$mediaAttribute = array (
					        'thumbnail',
					        'small_image',
					        'image'
					);
				}
				else $mediaAttribute = array ();
				/**
				 * Add image to media gallery
				 *
				 * @param string        $file              file path of image in file system
				 * @param string|array  $mediaAttribute    code of attribute with type 'media_image',
				 *                                         leave blank if image should be only in gallery
				 * @param boolean       $move              if true, it will move source file
				 * @param boolean       $exclude           mark image as disabled in product page view
				 */

				$product->addImageToMediaGallery($filepath, $mediaAttribute, false, false);
				/** EXTERNAL IMAGE IMPORT - END **/        		
        	}

Od tej chwili nasz plik importu może posiadać kolumny Image1, Image2, Image3 z adresami url do obrazków.
Jeżeli plik będzie posiadał kolumnę Image1 stare obrazki produktu zostaną usunięte. Natomiast kolumny Image2 i Image3 jedynie dogrywają kolejne obrazy do produktu.

Modyfikacja była testowana w wersji Magento 1.6.1.0 i działa tam wyśmienicie, rozwiązując kłopotliwy problem dodawania obrazów do produktów w Magento.