Register an application with Instagram - old Instagram for magento documentation

To do this you need to Register an Application for your website with Instagram. Visit the link below and sign in with your normal Instagram login.
http://instagram.com/developer#
manual-1

If this is your first time here then clicking the Register Your Application button will take you to a quick form asking what your intend on doing with the API. Fill out the fields, tick the terms and conditions and then “Sign Up”.
Magento-Instagram-09

Click the Register your Application or Manage Clients button, they will both take you to the same place.
manual-2

Register a new client.
manual-3

Fill in the following details
Application Name, Just put in the name of your website
Website, Your websites URL including the http://
OAuth redirect_uri, This is your websites URL including the path to Magento (if in a subfolder) with “index.php/instagram/auth/” added at the end. This is the return URL that the Instagram for Magento extension needs to verify your Client ID and talk with the Instagram API.
For example:
Magento installed in main directory: http://magentosite.com/index.php/instagram/auth/
Magento installed in folder “store”: http://magentosite.com/store/index.php/instagram/auth/
Screen Shot 2014-07-01 at 12.30.56 pm

Once you have those filled out, fill in the Captcha then click the Register button.

You will now be given a Client ID and a Client Secret, you will need these for your store so keep them handy.
Magento-Instagram-04

Installation

Once you have downloaded and unzipped the zip file you have 2 options,
1) upload the contents of the two folders (app and skin) to the corresponding directories in your store via FTP.
2) Via the admin area of your store, use the Connect Manager (System -> Magento Connect -> Magento Connect Manager) to install the package (CDL_Instagram-1.2.1.tgz).

Clear the cache (System -> Cache Management) then log out of the admin area, then log back in.

You will now have a new tab in your System -> Configuration panel called CDL with a tab named Instagram Gallery.

Connect to Instagram

Now we connect Magento with Instagram, enter your Client ID and Client Secret into the fields in the Magento System Configuration Instagram Gallery tab. Save the config.
Magento-Instagram-05

Now you can authorise your website with Instagram by using the Auth on Instagram Button.
Magento-Instagram-08
Magento-Instagram-06

If you see a white page with some weird code in it instead of the Instagram website then you have not entered the correct Client ID and Client Secret and saved the config. Go back and double check these numbers with the ones given to you here, http://instagram.com/developer#.

If you have successfully Authorised Instagram and Magento together then you should see your Instagram Username and Profile Pic in the Magento CDL Instagram Admin section.
Magento-Instagram-07
If you do not see your profile pic but everything went well, clear the cache (System -> Cache Management).
If you still do not see your pic, the authorisation process did not work, please go through it again.
Proceed to final steps.


Move the mini gallery to the footer Instagram 4 Magento module

I get a lot of requests for this so here is a quick step by step on how to move the Instagram gallery from the sidebar to the footer in Magento. While this is written with the footer in mind, you can change the paths in the code to move the gallery to another sidebar or anywhere else you like.

UPDATE** The latest version of the Instagram for Magento module has this option built in. All you need to do is select where you would like the Mini gallry to appear from the drop down in the admin configuration, and then save and clear the cache.

Remember to change the template paths (default/default) to your template pages if you are not using the default theme.

Step 1
Open /app/design/frontend/default/default/layout/cdlinstagram.xml
On line 24 change the reference name from “right” to “footer”.

<reference name="footer">

Step 2
Log into your Magento backend and navigate to System -> Cache Management
Refresh the cache (select all).

Reload your websites frontend and you should see the mini gallery in the footer.
If not, (some themes change these references) you can do the below.

Open /app/design/frontend/default/default/template/page/html/footer.phtml
Paste the following code into this file where you would like it to appear.

<?php echo $this->getLayout()->createBlock('core/template','instagramcarousel')->setTemplate('cdl/instagram/photoset.phtml')->toHtml(); ?>

That should be it.

UPDATE** The latest version of the Instagram for Magento module has this option built in. All you need to do is select where you would like the Mini gallry to appear from the drop down in the admin configuration, and then save and clear the cache.


WP E-Commerce add_to_cart shortcode with Quantity Box

A quick little code snippet that extends the in-built add_to_cart shortcode and adds a Quantity Box with it. Feel free to modify this code all you like.
Tested on WordPress 3.5.x and WP-E-Commerce 3.8.x

The original functions can be found in :
/wp-content/plugins/wp-e-commerce/wpsc-includes/display.functions.php (approx line 198)
/wp-content/plugins/wp-e-commerce/wpsc-includes/theme.functions.php (approx line 1196)

Just copy and paste the code into your functions.php file in your theme.
Then you can use the shortcode [cdl_add_to_cart=99] in your post or page, remember to replace the 99 with your own product ID.

/*-------------------------------------------------------------------------------------------*/
/* cdl_add cart button function used for php template tags and shortcodes
/*-------------------------------------------------------------------------------------------*/


function cdl_add_to_cart_button( $product_id, $return = false ) {
	global $wpdb,$wpsc_variations;
	$output = '';
	if ( $product_id > 0 ) {
		// grab the variation form fields here
		$wpsc_variations = new wpsc_variations( $product_id );
		if ( $return )
			ob_start();
		?>
			<div class='wpsc-add-to-cart-button'>
				<form class='wpsc-add-to-cart-button-form' id='product_<?php echo esc_attr( $product_id ) ?>' action='' method='post'>
					<?php do_action( 'wpsc_add_to_cart_button_form_begin' ); ?>
					<div class='wpsc_variation_forms'>
						<?php while ( wpsc_have_variation_groups() ) : wpsc_the_variation_group(); ?>
							<p>
								<select class='wpsc_select_variation' name='variation[<?php echo wpsc_vargrp_id(); ?>]' id='<?php echo wpsc_vargrp_form_id(); ?>'>
									<?php while ( wpsc_have_variations() ): wpsc_the_variation(); ?>
										<option value='<?php echo wpsc_the_variation_id(); ?>' <?php echo wpsc_the_variation_out_of_stock(); ?>><?php echo esc_html( wpsc_the_variation_name() ); ?></option>
									<?php endwhile; ?>
								</select>
							</p>
						<?php endwhile; ?>
					</div>
					
					<legend>Quantity</legend>
						<div class="wpsc_quantity_update">
							<input id="wpsc_quantity_update_<?php echo esc_attr( $product_id ) ?>" name="wpsc_quantity_update" size="2" value="1" type="text">
							<input name="key" value="-1" type="hidden">
							<input name="wpsc_update_quantity" value="true" type="hidden">
                        </div><!--close wpsc_quantity_update-->
                    
					
					
					<input type='hidden' name='wpsc_ajax_action' value='add_to_cart' />
					<input type='hidden' name='product_id' value='<?php echo $product_id; ?>' />
					<input type='submit' id='product_<?php echo $product_id; ?>_submit_button' class='wpsc_buy_button' name='Buy' value='<?php echo __( 'Add To Cart', 'wpsc' ); ?>'  />
					<?php do_action( 'wpsc_add_to_cart_button_form_end' ); ?>
				</form>
			</div>
		<?php
		
		if ( $return )
			return ob_get_clean();
	}
}

function cdl_add_to_cart_shortcode( $content = '' ) {
	static $fancy_notification_output = false;
	if ( preg_match_all( "/\[cdl_add_to_cart=([\d]+)\]/", $content, $matches ) ) {
		foreach ( $matches[1] as $key => $product_id ) {
			$original_string = $matches[0][$key];
			$output = cdl_add_to_cart_button( $product_id, true );
			$content = str_replace( $original_string, $output, $content );
		}

		if ( ! $fancy_notification_output ) {
			$content .= wpsc_fancy_notifications( true );
			$fancy_notification_output = true;
		}
	}
	return $content;
}
add_filter( 'the_content', 'cdl_add_to_cart_shortcode', 12 );

Export products from Magento with multiple images

How to export additional images for products

Many people have described how to import additional images in Magento store. The question often arises as to how export additional images for products in Magento store.

Magento’s architecture is module-based, which means that you can easily modify existing and add new functions by creating your own modules.

Used example
For this howto, I will create a module that overrides the “unparse()” function, which returns the csv Data for a export products. This module has been written for Magento 1.4 but should work on 1.3 as well. This will NOT work on version 1.7.x. It was written for 1.4 and I have yet to write an updated version. Sorry.

1. Create directories

First of all, you need to create some directory structure that will hold your module files. Go to /app/code/local and create a directory representing your’s or your company’s name. All your modules will go into that directory. I will use this for the example:
/app/code/local/CDL.
Now we need to create the module directory. The module directory represents the name your module gets. I will use:
/app/code/local/CDL/Export in this example.
Every module needs a configuration file. This file is located under the etc/ subdirectory, so you need to create that directory as well. In my example it is:
/app/code/local/CDL/Export/etc.

The last needed directory is the Model/ subdirectory. I will explain what this is for later.

2. Config File

Now that we have all the directories we need, we can create a new file named config.xml inside the etc/ directory. This file will be used by the Magento module system to know what your module does and where the needed files are located. Here is the config.xml that we will need for our example:

<?xml version="1.0"?>
<config>
    <modules>
        <CDL_Export>
            <version>0.1.0</version>
        </CDL_Export>
    </modules>
    <global>
        <models>
		   <dataflow>
			<rewrite>
			  <convert_parser_csv>CDL_Export_Model_Export</convert_parser_csv>
			</rewrite>
		   </dataflow>
        </models>
    </global>
</config>

As you can see, we will override the “Convert/Parser/Csv.php” model inside the “Dataflow” Module. Note that the underscores in represent the directory structure the core model is in. This is the same with CDL_Export_Model_Export, which points to CDL/Export/Model/Export.php.

3. Create the Model

Now we need to create the model. As you can see in the config.xml file, we have to create a new file named Export.php in the Model/ subdirectory. Here is the content of the file:

class CDL_Export_Model_Export extends Mage_Dataflow_Model_Convert_Parser_Abstract
{
    protected $_fields;
    protected $_mapfields = array();
    public function parse()
    {
        // fixed for multibyte characters
        setlocale(LC_ALL, Mage::app()->getLocale()->getLocaleCode().'.UTF-8');
        $fDel = $this->getVar('delimiter', ',');
        $fEnc = $this->getVar('enclose', '"');
        if ($fDel == '\t') {
            $fDel = "\t";
        }
        $adapterName   = $this->getVar('adapter', null);
        $adapterMethod = $this->getVar('method', 'saveRow');
        if (!$adapterName || !$adapterMethod) {
            $message = Mage::helper('dataflow')->__('Please declare "adapter" and "method" node first');
            $this->addException($message, Mage_Dataflow_Model_Convert_Exception::FATAL);
            return $this;
        }
        try {
            $adapter = Mage::getModel($adapterName);
        }
        catch (Exception $e) {
            $message = Mage::helper('dataflow')->__('Declared adapter %s not found', $adapterName);
            $this->addException($message, Mage_Dataflow_Model_Convert_Exception::FATAL);
            return $this;
        }
        if (!is_callable(array($adapter, $adapterMethod))) {
            $message = Mage::helper('dataflow')->__('Method "%s" not defined in adapter %s', $adapterMethod, $adapterName);
            $this->addException($message, Mage_Dataflow_Model_Convert_Exception::FATAL);
            return $this;
        }
        $batchModel = $this->getBatchModel();
        $batchIoAdapter = $this->getBatchModel()->getIoAdapter();
        if (Mage::app()->getRequest()->getParam('files')) {
            $file = Mage::app()->getConfig()->getTempVarDir().'/import/'
                . urldecode(Mage::app()->getRequest()->getParam('files'));
            $this->_copy($file);
        }
        $batchIoAdapter->open(false);
        $isFieldNames = $this->getVar('fieldnames', '') == 'true' ? true : false;
        if (!$isFieldNames && is_array($this->getVar('map'))) {
            $fieldNames = $this->getVar('map');
        }
        else {
            $fieldNames = array();
            foreach ($batchIoAdapter->read(true, $fDel, $fEnc) as $v) {
                $fieldNames[$v] = $v;
            }
        }
        $countRows = 0;
        while (($csvData = $batchIoAdapter->read(true, $fDel, $fEnc)) !== false) {
            if (count($csvData) == 1 && $csvData[0] === null) {
                continue;
            }
            $itemData = array();
            $countRows ++; $i = 0;
            foreach ($fieldNames as $field) {
                $itemData[$field] = isset($csvData[$i]) ? $csvData[$i] : null;
                $i ++;
            }
            $batchImportModel = $this->getBatchImportModel()
                ->setId(null)
                ->setBatchId($this->getBatchModel()->getId())
                ->setBatchData($itemData)
                ->setStatus(1)
                ->save();
        }
        $this->addException(Mage::helper('dataflow')->__('Found %d rows', $countRows));
        $this->addException(Mage::helper('dataflow')->__('Starting %s :: %s', $adapterName, $adapterMethod));
        $batchModel->setParams($this->getVars())
            ->setAdapter($adapterName)
            ->save();
        //$adapter->$adapterMethod();
        return $this;
//        // fix for field mapping
//        if ($mapfields = $this->getProfile()->getDataflowProfile()) {
//            $this->_mapfields = array_values($mapfields['gui_data']['map'][$mapfields['entity_type']]['db']);
//        } // end
//
//        if (!$this->getVar('fieldnames') && !$this->_mapfields) {
//            $this->addException('Please define field mapping', Mage_Dataflow_Model_Convert_Exception::FATAL);
//            return;
//        }
//
//        if ($this->getVar('adapter') && $this->getVar('method')) {
//            $adapter = Mage::getModel($this->getVar('adapter'));
//        }
//
//        $i = 0;
//        while (($line = fgetcsv($fh, null, $fDel, $fEnc)) !== FALSE) {
//            $row = $this->parseRow($i, $line);
//
//            if (!$this->getVar('fieldnames') && $i == 0 && $row) {
//                $i = 1;
//            }
//
//            if ($row) {
//                $loadMethod = $this->getVar('method');
//                $adapter->$loadMethod(compact('i', 'row'));
//            }
//            $i++;
//        }
//
//        return $this;
    }
    public function parseRow($i, $line)
    {
        if (sizeof($line) == 1) return false;
        if (0==$i) {
            if ($this->getVar('fieldnames')) {
                $this->_fields = $line;
                return;
            } else {
                foreach ($line as $j=>$f) {
//                    $this->_fields[$j] = 'column'.($j+1);
                    $this->_fields[$j] = $this->_mapfields[$j];
                }
            }
        }
        $resultRow = array();
        foreach ($this->_fields as $j=>$f) {
            $resultRow[$f] = isset($line[$j]) ? $line[$j] : '';
        }
        return $resultRow;
    }
    /**
     * Read data collection and write to temporary file
     *
     * @return Mage_Dataflow_Model_Convert_Parser_Csv
     */
    public function unparse()
    {
        $batchExport = $this->getBatchExportModel()
            ->setBatchId($this->getBatchModel()->getId());
        $fieldList = $this->getBatchModel()->getFieldList();
        /*  CDL Export  start*/
        $fieldList['gallery'] = 'gallery';
        /* CDL Export finish*/
        $batchExportIds = $batchExport->getIdCollection();
        if (!$batchExportIds) {
            return $this;
        }
        $io = $this->getBatchModel()->getIoAdapter();
        $io->open();
        if ($this->getVar('fieldnames')) {
            $csvData = $this->getCsvString($fieldList);
            $io->write($csvData);
        }
        foreach ($batchExportIds as $batchExportId) {
            $csvData = array();
            $batchExport->load($batchExportId);
            $row = $batchExport->getBatchData();
            /* CDL Export start*/
            $productid = Mage::getModel('catalog/product')->getIdBySku($row['sku']);
            // Initiate product model
            $product = Mage::getModel('catalog/product');
            // Load specific product whose tier price want to update
            $product->load($productid);
            $mediaGallery = $product->getMediaGallery();
            $mediaGallery = $mediaGallery['images'];
            $add_images = '';
            foreach ($mediaGallery as $add_image) {
                if (!$add_image['disabled']){
                    $add_images .= $add_image['file'].';';
                }
            }
			// Remove last ';' from images list
			$add_images = substr_replace($add_images ,"",-1);
			
             $row['gallery'] =  $add_images;
            /* CDL Export finish*/
            foreach ($fieldList as $field) {
                $csvData[] = isset($row[$field]) ? $row[$field] : '';
            }
            $csvData = $this->getCsvString($csvData);
            $io->write($csvData);
        }
        $io->close();
        return $this;
    }
    public function unparseRow($args)
    {
        $i = $args['i'];
        $row = $args['row'];
        $fDel = $this->getVar('delimiter', ',');
        $fEnc = $this->getVar('enclose', '"');
        $fEsc = $this->getVar('escape', '\\');
        $lDel = "\r\n";
        if ($fDel == '\t') {
            $fDel = "\t";
        }
        $line = array();
        foreach ($this->_fields as $f) {
            $v = isset($row[$f]) ? str_replace(array('"', '\\'), array($fEnc.'"', $fEsc.'\\'), $row[$f]) : '';
            $line[] = $fEnc.$v.$fEnc;
        }
        return join($fDel, $line);
    }
    /**
     * Retrieve csv string from array
     *
     * @param array $fields
     * @return sting
     */
    public function getCsvString($fields = array()) {
        $delimiter  = $this->getVar('delimiter', ',');
        $enclosure  = $this->getVar('enclose', '');
        $escapeChar = $this->getVar('escape', '\\');
        if ($delimiter == '\t') {
            $delimiter = "\t";
        }
        $str = '';
        foreach ($fields as $value) {
            if (strpos($value, $delimiter) !== false ||
                empty($enclosure) ||
                strpos($value, $enclosure) !== false ||
                strpos($value, "\n") !== false ||
                strpos($value, "\r") !== false ||
                strpos($value, "\t") !== false ||
                strpos($value, ' ') !== false) {
                $str2 = $enclosure;
                $escaped = 0;
                $len = strlen($value);
                for ($i=0;$i<$len;$i++) {
                    if ($value[$i] == $escapeChar) {
                        $escaped = 1;
                    } else if (!$escaped && $value[$i] == $enclosure) {
                        $str2 .= $enclosure;
                    } else {
                        $escaped = 0;
                    }
                        $str2 .= $value[$i];
                }
                $str2 .= $enclosure;
                $str .= $str2.$delimiter;
            } else {
                $str .= $enclosure.$value.$enclosure.$delimiter;
            }
        }
        return substr($str, 0, -1) . "\n";
    }
}

As you can see, we create a new model class which extends the core model class. that means your new class will have all the properties and functions the core class has. all functions you put in your class will be used instead of the core classes functions, and your can also add completely new functions to it. For now we changed the unparse() function, so it will return additional images for products (during Export Products).

4. Load your module

Now we finished our module, but Magento doesn’t know of it’s existence yet. We have to create a file in /app/etc/Modules that loads our module. Name that file CDL_Export.xml and put this in it:

<?xml version="1.0"?>
<config>
  <modules>
    <CDL_Export>
      <active>true</active>
      <codePool>local</codePool>
    </CDL_Export>
  </modules>
</config>

All xml files inside /app/etc/Modules will be loaded automatically. By placing the above file in that directory, Magento will know that is has to look for a config.xml in /app/code/local/CDL/Export/etc and load your module.

Step 4

Test it out! Please clear cash before. This is how it works: Use the Magento product export functionality (Admin >> System >> Import/Export >> Profiles >> Export All Products). Check your file. You can see, we added a column ”gallery” and pictures are separated with “;”


Import products into Magento with multiple images

We did a migration from Zen Cart to Magento and we had to import all products with additional images. Almost every product had multiple images which was a problem because Magento doesn’t have built-in ability to upload multiple images for products. Why, i don’t know but we can easily extend Magento and create this ability.

The best way to accomplish this is to create a new module that will override the basic import module and perform the additional tasks we need. We also do it this way so that we do not touch the core code.

A few notes:

  • This will NOT work on version 1.7.x. It was written for 1.4 and I have yet to write an updated version. Sorry.
  • All pictures must be uploaded into the folder: “/media/import” else they will not be imported
  • The import module uses the “sku” to identify each product, if you have already imported the products but now just want to add the extra images you only need the “sku” and “gallery” columns, you do not have to re-import all your products.

1. Create Directories

First of all, you need to create some directory structure that will hold your module files. Go to /app/code/local and create a directory representing your’s or your company’s name. All your modules will go into that directory. I will use this for the example:
/app/code/local/CDL.
Now we need to create the module directory. The module directory represents the name your module gets. I will use:
/app/code/local/CDL/Import in this example.
Every module needs a configuration file. This file is located under the etc/ subdirectory, so you need to create that directory as well. In my example it is:
/app/code/local/CDL/Import/etc.

2. Config File

Save this in the file: /app/code/local/CDL/Import/etc/config.xml

<?xml version="1.0"?>
<config>
	<modules>
		<CDL_Import>
			<version>0.1.0</version>
		</CDL_Import>
	</modules>
	<global>
		<models>
			<catalog>
				<rewrite>
					<convert_adapter_product>CDL_Import_Model_Gallery</convert_adapter_product>
				</rewrite>
			</catalog>
		</models>
	</global>
</config>

3. Create the Model File

We create model in /App/code/local/CDL/Import/Model/Gallery.php

<?php
/**
 * Import Multiple Images during Product Import
 *
 */
 
class CDL_Import_Model_Gallery extends Mage_Catalog_Model_Convert_Adapter_Product
{
     /**
     * Save product (import)
     *
     * @param array $importData
     * @throws Mage_Core_Exception 
     * @return bool
     */
	  protected $custom_options = array();
	  
	  
    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']);
        }
 		/*	if category name is in csv file		*/
		if (isset($importData['categories'])) {
           
			$categoryIds = $this->_addCategories($importData['categories'], $store);
            if ($categoryIds) {
                $product->setCategoryIds($categoryIds);
            }
        }
        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 = explode(',', $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) {
			
				if(strpos($field,':')!==FALSE && strlen($value)) {
				   $values=explode('|',$value);
				   if(count($values)>0) {
					  @list($title,$type,$is_required,$sort_order) = explode(':',$field);
					  $title = ucfirst(str_replace('_',' ',$title));
					  $custom_options[] = array(
						 'is_delete'=>0,
						 'title'=>$title,
						 'previous_group'=>'',
						 'previous_type'=>'',
						 'type'=>$type,
						 'is_require'=>$is_required,
						 'sort_order'=>$sort_order,
						 'values'=>array()
					  );
					  foreach($values as $v) {
						 $parts = explode(':',$v);
						 $title = $parts[0];
						 if(count($parts)>1) {
							$price_type = $parts[1];
						 } else {
							$price_type = 'fixed';
						 }
						 if(count($parts)>2) {
							$price = $parts[2];
						 } else {
							$price =0;
						 }
						 if(count($parts)>3) {
							$sku = $parts[3];
						 } else {
							$sku='';
						 }
						 if(count($parts)>4) {
							$sort_order = $parts[4];
						 } else {
							$sort_order = 0;
						 }
						 switch($type) {
							case 'file':
							   /* TODO */
							   break;
							   
							case 'field':
							case 'area':
							   $custom_options[count($custom_options) - 1]['max_characters'] = $sort_order;
							   /* NO BREAK */
							   
							case 'date':
							case 'date_time':
							case 'time':
							   $custom_options[count($custom_options) - 1]['price_type'] = $price_type;
							   $custom_options[count($custom_options) - 1]['price'] = $price;
							   $custom_options[count($custom_options) - 1]['sku'] = $sku;
							   break;
														  
							case 'drop_down':
							case 'radio':
							case 'checkbox':
							case 'multiple':
							default:
							   $custom_options[count($custom_options) - 1]['values'][]=array(
								  'is_delete'=>0,
								  'title'=>$title,
								  'option_type_id'=>-1,
								  'price_type'=>$price_type,
								  'price'=>$price,
								  'sku'=>$sku,
								  'sort_order'=>$sort_order,
							   );
							   break;
						 }
					  }
				   }
				}

                continue;
            }
 
            $isArray = false;
            $setValue = $value;
 
            if ($attribute->getFrontendInput() == 'multiselect') {
                $value = explode(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, false, false);
            }
            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();
		 /* Add the custom options specified in the CSV import file 	*/
		
		if(isset($custom_options)){
		if(count($custom_options)) {
		   foreach($custom_options as $option) {
			  try {
				$opt = Mage::getModel('catalog/product_option');
				$opt->setProduct($product);
				$opt->addOption($option);
				$opt->saveOptions();
			  }
			  catch (Exception $e) {}
		   }
		}
		}
        return true;
    }
	
	protected $_categoryCache = array();
	/*	Add category and sub category.	 */
    protected function _addCategories($categories, $store)
    {
		
		 $rootId = $store->getRootCategoryId();
		
        if (!$rootId) {
            /* If stoder not create that mense admin then assign 1 to storeId */
			$storeId = 1;
		 	$rootId = Mage::app()->getStore($storeId)->getRootCategoryId();
			
        }
		
		if($categories=="")
		   return array();
        $rootPath = '1/'.$rootId;
        if (empty($this->_categoryCache[$store->getId()])) {
            $collection = Mage::getModel('catalog/category')->getCollection()
                ->setStore($store)
                ->addAttributeToSelect('name');
            $collection->getSelect()->where("path like '".$rootPath."/%'");

            foreach ($collection as $cat) {
                $pathArr = explode('/', $cat->getPath());
                $namePath = '';
                for ($i=2, $l=sizeof($pathArr); $i<$l; $i++) {
                    $name = $collection->getItemById($pathArr[$i])->getName();
                    $namePath .= (empty($namePath) ? '' : '/').trim($name);
                }
                $cat->setNamePath($namePath);
            }
            
            $cache = array();
            foreach ($collection as $cat) {
                $cache[strtolower($cat->getNamePath())] = $cat;
                $cat->unsNamePath();
            }
            $this->_categoryCache[$store->getId()] = $cache;
        }
        $cache =& $this->_categoryCache[$store->getId()];
      
        $catIds = array();
        foreach (explode(',', $categories) as $categoryPathStr) {
            $categoryPathStr = preg_replace('#\s*/\s*#', '/', trim($categoryPathStr));
            if (!empty($cache[$categoryPathStr])) {
                $catIds[] = $cache[$categoryPathStr]->getId();
                continue;
            }
            $path = $rootPath;
            $namePath = '';
            foreach (explode('/', $categoryPathStr) as $catName) {
                $namePath .= (empty($namePath) ? '' : '/').strtolower($catName);
                if (empty($cache[$namePath])) {
                    $cat = Mage::getModel('catalog/category')
                        ->setStoreId($store->getId())
                        ->setPath($path)
                        ->setName($catName)
                        ->setIsActive(1)
                        ->save();
                    $cache[$namePath] = $cat;
                }
                $catId = $cache[$namePath]->getId();
                $path .= '/'.$catId;
            }
            if ($catId) {
                $catIds[] = $catId;
            }
        }
        return join(',', $catIds);
    }
}

4. Load the Moduel

Save this in the file “/app/etc/modules/CDL_Import.xml”

<?xml version="1.0"?>
<config>
	<modules>
		<CDL_Import>
			<active>true</active>
			<codePool>local</codePool>
		</CDL_Import>
	</modules>
</config>

5. Clear Cache and Check Results

Clear the cache!

We import products with csv file and example of csv:

"store","websites","attribute_set","type"……"gallery"
"admin","base","Default","simple"……"/tees/nautical_girls650.jpg;/tees/nautical_girls750.jpg"

You can see, we added a column ”gallery”
and pictures are separated with “;”

All pictures must be uploaded in folder: “/media/import” and you can go to: (Admin > System > Import/Export > Profiles >> Import All Products) and import can begin…


Empty product attributes showing up with NO or N/A (1.4.2.0)

Recently I upgraded a Magento Store to 1.4.2.0 and noticed empty Product Attributes showing up on the product pages when they weren’t there before.

I took a quick look into it and created a workaround loop to stop these empty attribute appearing.

Open template/catalog/product/view/attribute.phtml

find:

<?php foreach ($_additional as $_data): ?>
    <tr>
        <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
        <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
    </tr>
<?php endforeach; ?>

replace with:

<?php foreach ($_additional as $_data): ?>
    <?php $_attribute = $_product->getResource()->getAttribute($_data['code']);
    if (!is_null($_product->getData($_attribute->getAttributeCode())) && ((string)$_attribute->getFrontend()->getValue($_product) != '')) { ?>
    <tr>
        <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
        <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td>
    </tr>
    <?php } ?>
<?php endforeach; ?>