15

I need to export all the product attributes and attribute sets from my current website (Enterprise Edition 1.12.0.0) and import all of them to a new website (CE 1.8).

I've gone through these:

But can't figure out how to export all the attributes first moreover I can't spend money for any extension for this process :( as my company won't provide it.

Can some one point me the right direction?

1
  • All the posts I've gone through focus on importing attributes from CSV (manually prepared) or php script, nothing on extracting attributes and their values from source website.
    – Shathish
    Commented Dec 5, 2013 at 8:32

2 Answers 2

28

I've done this to export all attributes and their options (if it is a dropdown attribute) from the source website:

exportAttributes.php in root directory of source website:

<?php
define('MAGENTO', realpath(dirname(__FILE__)));
require_once MAGENTO . '/app/Mage.php';
Mage::app();
$entity_type_id = Mage::getModel('catalog/product')->getResource()->getTypeId();

prepareCollection($entity_type_id);

function prepareCollection($ent_type_id){
    $resource = Mage::getSingleton('core/resource');
    $connection = $resource->getConnection('core_read');
    $select_attribs = $connection->select()
            ->from(array('ea'=>$resource->getTableName('eav/attribute')))
            ->join(array('c_ea'=>$resource->getTableName('catalog/eav_attribute')), 'ea.attribute_id = c_ea.attribute_id');
            // ->join(array('e_ao'=>$resource->getTableName('eav/attribute_option'), array('option_id')), 'c_ea.attribute_id = e_ao.attribute_id')
            // ->join(array('e_aov'=>$resource->getTableName('eav/attribute_option_value'), array('value')), 'e_ao.option_id = e_aov.option_id and store_id = 0')
    $select_prod_attribs = $select_attribs->where('ea.entity_type_id = '.$ent_type_id)
                                            ->order('ea.attribute_id ASC');

    $product_attributes = $connection->fetchAll($select_prod_attribs);

    $select_attrib_option = $select_attribs
                                ->join(array('e_ao'=>$resource->getTableName('eav/attribute_option'), array('option_id')), 'c_ea.attribute_id = e_ao.attribute_id')
                                ->join(array('e_aov'=>$resource->getTableName('eav/attribute_option_value'), array('value')), 'e_ao.option_id = e_aov.option_id and store_id = 0')
                                ->order('e_ao.attribute_id ASC');

    $product_attribute_options = $connection->fetchAll($select_attrib_option);

    $attributesCollection = mergeCollections($product_attributes, $product_attribute_options);
    prepareCsv($attributesCollection);

}

function mergeCollections($product_attributes, $product_attribute_options){

    foreach($product_attributes as $key => $_prodAttrib){
        $values = array();
        $attribId = $_prodAttrib['attribute_id'];
        foreach($product_attribute_options as $pao){
            if($pao['attribute_id'] == $attribId){
                $values[] = $pao['value'];
            }
        }
        if(count($values) > 0){
            $values = implode(";", $values);
            $product_attributes[$key]['_options'] = $values;
        }
        else{
            $product_attributes[$key]['_options'] = "";
        }
        /*
            temp
        */
        $product_attributes[$key]['attribute_code'] = $product_attributes[$key]['attribute_code'];
    }

    return $product_attributes;

}

function prepareCsv($attributesCollection, $filename = "importAttrib.csv", $delimiter = '|', $enclosure = '"'){

    $f = fopen('php://memory', 'w');
    $first = true;
    foreach ($attributesCollection as $line) {
        if($first){
            $titles = array();
            foreach($line as $field => $val){
                $titles[] = $field;
            }
            fputcsv($f, $titles, $delimiter, $enclosure);
            $first = false;
        }
        fputcsv($f, $line, $delimiter, $enclosure); 
    }
    fseek($f, 0);
    header('Content-Type: application/csv');
    header('Content-Disposition: attachement; filename="'.$filename.'"');
    fpassthru($f);
}

This will give a csv file [actually i used "|" to separate ;)] paste this csv file in MAGENTO_ROOT/attribImport directory of the destination website, i.e. website to which attributes need to be imported:

now put the following code in MAGENTO_ROOT/attribImport** directory of the destination website

<?php
define('MAGENTO', realpath(dirname(__FILE__)));
require_once MAGENTO . '/../app/Mage.php';
Mage::app();
// $fileName = MAGENTO . '/var/import/importAttrib.csv';
$fileName = 'importAttrib.csv';
// getCsv($fileName);
getAttributeCsv($fileName);

function getAttributeCsv($fileName){
    // $csv = array_map("str_getcsv", file($fileName,FILE_SKIP_EMPTY_LINES));
    $file = fopen($fileName,"r");
    while(!feof($file)){
        $csv[] = fgetcsv($file, 0, '|');
    }
    $keys = array_shift($csv);
    foreach ($csv as $i=>$row) {
        $csv[$i] = array_combine($keys, $row);
    }
    foreach($csv as $row){
        $labelText = $row['frontend_label'];
        $attributeCode = $row['attribute_code'];
        if($row['_options'] != "")
            $options = explode(";", $row['_options']); // add this to createAttribute parameters and call "addAttributeValue" function.
        else
            $options = -1;
        if($row['apply_to'] != "")
            $productTypes = explode(",", $row['apply_to']);
        else
            $productTypes = -1;
        unset($row['frontend_label'], $row['attribute_code'], $row['_options'], $row['apply_to'], $row['attribute_id'], $row['entity_type_id'], $row['search_weight']);
        createAttribute($labelText, $attributeCode, $row, $productTypes, -1, $options);
    }
}


/**
 * Create an attribute.
 *
 * For reference, see Mage_Adminhtml_Catalog_Product_AttributeController::saveAction().
 *
 * @return int|false
 */
function createAttribute($labelText, $attributeCode, $values = -1, $productTypes = -1, $setInfo = -1, $options = -1)
{

    $labelText = trim($labelText);
    $attributeCode = trim($attributeCode);

    if($labelText == '' || $attributeCode == '')
    {
        echo "Can't import the attribute with an empty label or code.  LABEL= [$labelText]  CODE= [$attributeCode]"."<br/>";
        return false;
    }

    if($values === -1)
        $values = array();

    if($productTypes === -1)
        $productTypes = array();

    if($setInfo !== -1 && (isset($setInfo['SetID']) == false || isset($setInfo['GroupID']) == false))
    {
        echo "Please provide both the set-ID and the group-ID of the attribute-set if you'd like to subscribe to one."."<br/>";
        return false;
    }

    echo "Creating attribute [$labelText] with code [$attributeCode]."."<br/>";

    //>>>> Build the data structure that will define the attribute. See
    //     Mage_Adminhtml_Catalog_Product_AttributeController::saveAction().

    $data = array(
                    'is_global'                     => '0',
                    'frontend_input'                => 'text',
                    'default_value_text'            => '',
                    'default_value_yesno'           => '0',
                    'default_value_date'            => '',
                    'default_value_textarea'        => '',
                    'is_unique'                     => '0',
                    'is_required'                   => '0',
                    'frontend_class'                => '',
                    'is_searchable'                 => '1',
                    'is_visible_in_advanced_search' => '1',
                    'is_comparable'                 => '1',
                    'is_used_for_promo_rules'       => '0',
                    'is_html_allowed_on_front'      => '1',
                    'is_visible_on_front'           => '0',
                    'used_in_product_listing'       => '0',
                    'used_for_sort_by'              => '0',
                    'is_configurable'               => '0',
                    'is_filterable'                 => '0',
                    'is_filterable_in_search'       => '0',
                    'backend_type'                  => 'varchar',
                    'default_value'                 => '',
                    'is_user_defined'               => '0',
                    'is_visible'                    => '1',
                    'is_used_for_price_rules'       => '0',
                    'position'                      => '0',
                    'is_wysiwyg_enabled'            => '0',
                    'backend_model'                 => '',
                    'attribute_model'               => '',
                    'backend_table'                 => '',
                    'frontend_model'                => '',
                    'source_model'                  => '',
                    'note'                          => '',
                    'frontend_input_renderer'       => '',                      
                );

    // Now, overlay the incoming values on to the defaults.
    foreach($values as $key => $newValue)
        if(isset($data[$key]) == false)
        {
            echo "Attribute feature [$key] is not valid."."<br/>";
            return false;
        }

        else
            $data[$key] = $newValue;

    // Valid product types: simple, grouped, configurable, virtual, bundle, downloadable, giftcard
    $data['apply_to']       = $productTypes;
    $data['attribute_code'] = $attributeCode;
    $data['frontend_label'] = array(
                                        0 => $labelText,
                                        1 => '',
                                        3 => '',
                                        2 => '',
                                        4 => '',
                                    );

    //<<<<

    //>>>> Build the model.

    $model = Mage::getModel('catalog/resource_eav_attribute');

    $model->addData($data);

    if($setInfo !== -1)
    {
        $model->setAttributeSetId($setInfo['SetID']);
        $model->setAttributeGroupId($setInfo['GroupID']);
    }

    $entityTypeID = Mage::getModel('eav/entity')->setType('catalog_product')->getTypeId();
    $model->setEntityTypeId($entityTypeID);

    $model->setIsUserDefined(1);

    //<<<<

    // Save.

    try
    {
        $model->save();
    }
    catch(Exception $ex)
    {
        echo "Attribute [$labelText] could not be saved: " . $ex->getMessage()."<br/>";
        return false;
    }

    if(is_array($options)){
        foreach($options as $_opt){
            addAttributeValue($attributeCode, $_opt);
        }
    }

    $id = $model->getId();

    echo "Attribute [$labelText] has been saved as ID ($id).<br/>";

    // return $id;
}

function addAttributeValue($arg_attribute, $arg_value)
{
    $attribute_model        = Mage::getModel('eav/entity_attribute');

    $attribute_code         = $attribute_model->getIdByCode('catalog_product', $arg_attribute);
    $attribute              = $attribute_model->load($attribute_code);

    if(!attributeValueExists($arg_attribute, $arg_value))
    {
        $value['option'] = array($arg_value,$arg_value);
        $result = array('value' => $value);
        $attribute->setData('option',$result);
        $attribute->save();
    }

    $attribute_options_model= Mage::getModel('eav/entity_attribute_source_table') ;
    $attribute_table        = $attribute_options_model->setAttribute($attribute);
    $options                = $attribute_options_model->getAllOptions(false);

    foreach($options as $option)
    {
        if ($option['label'] == $arg_value)
        {
            return $option['value'];
        }
    }
   return false;
}
function attributeValueExists($arg_attribute, $arg_value)
{
    $attribute_model        = Mage::getModel('eav/entity_attribute');
    $attribute_options_model= Mage::getModel('eav/entity_attribute_source_table') ;

    $attribute_code         = $attribute_model->getIdByCode('catalog_product', $arg_attribute);
    $attribute              = $attribute_model->load($attribute_code);

    $attribute_table        = $attribute_options_model->setAttribute($attribute);
    $options                = $attribute_options_model->getAllOptions(false);

    foreach($options as $option)
    {
        if ($option['label'] == $arg_value)
        {
            return $option['value'];
        }
    }

    return false;
}

NOTE: Allthough exceptions have been handled, Backup your Database before you import these attributes, to be on safer side. Happy Importing!

Thanks to :

9
  • 1
    Remove the 'test'. from line 54 of your export script and the export runs fine. Commented Feb 25, 2014 at 14:32
  • oops! I've removed "test" now :)
    – Shathish
    Commented Feb 26, 2014 at 4:27
  • The import script results in a 500 server error.
    – Gabriele
    Commented Oct 26, 2015 at 19:25
  • I've placed the csv file and the importAttribute.php file in the /var/import dir of my magento installation but I get a 403 Forbidden error.
    – Gabriele
    Commented Oct 26, 2015 at 19:34
  • any way to export attribute sets?
    – Haim
    Commented Mar 21, 2016 at 16:15
1

I think the easiest part ist to take all the tables and copy them over.

Depending on whether you care about the other attributes (customer, addresses, order, ...) you can copy everything or just select the product attributes and insert them into the new database.

Check eav_entity_type, normally catalog_product is ID 4.

Then copy everything from eav_attribute and catalog_eav_attribute with entity_type_id = 4 to you new instance. Becareful to not destroy the foreign keys.

This is a problem, if you want to copy products too, because the IDs of the attributes might change!

Not the answer you're looking for? Browse other questions tagged or ask your own question.