3

i tried to Import Attributes via the following tutorial: how to export and import all attributes and attribute sets from one magento to other? how to export and import all attributes and attribute sets from one magento to other?

it worked fine for first time, except, that the data in field is_visible_on_checkout couldn't been imported.

So i tried a second time and now i get the following message: Attribute [Delivery time] could not be saved: Attribute with the same code already exists.

Is there a way, that i overwrite existing data?

Also i do not know how to import Attribute sets and assign the attributes to the right sets without doing manually. I do not want to use a Extension, i would like to do it via PHP script.

Many thanks for your help!

1 Answer 1

2

Create a file with following code and place it on root of the old website. After the execution of this file, this will give a csv file.

<?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);
}

Now create a file with following code and place it in new magento. After the execution the attributes and attribute sets will be imported:

<?php
define('MAGENTO', realpath(dirname(__FILE__)));
require_once MAGENTO . '/../app/Mage.php';
Mage::app();
$fileName = 'importAttrib.csv'; //Change file path with your path
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..
1
  • This will only export the attributes, not the attribute sets
    – Haim
    Commented Mar 21, 2016 at 16:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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