Magento: convert single select attribute to multiselect
Add in your entity-model following functions:
/**
* Get a text for option value
*
* @param string $value
* @return string|false
*/
public function getOptionText($value)
{
$options = $this->getAllOptions();
foreach ($options as $option) {
if ($option['value'] == $value) {
return $option['label'];
}
}
return false;
}
public function getFlatColums()
{
$columns = array();
$columns[$this->getAttribute()->getAttributeCode()] = array(
'type' => 'VARCHAR',
'unsigned' => false,
'is_null' => true,
'default' => null,
'extra' => null
);
return $columns;
}
/**
* Retrieve Indexes for Flat
*
* @return array
*/
public function getFlatIndexes()
{
$indexes = array();
$index = 'IDX_' . strtoupper($this->getAttribute()->getAttributeCode());
$indexes[$index] = array(
'type' => 'index',
'fields' => array($this->getAttribute()->getAttributeCode())
);
return $indexes;
}
/**
* Retrieve Select for update Attribute value in flat table
*
* @param int $store
* @return Varien_Db_Select|null
*/
public function getFlatUpdateSelect($store)
{
return Mage::getResourceModel('eav/entity_attribute_option')
->getFlatUpdateSelect($this->getAttribute(), $store, false);
}
Now the setup script to convert 2 attributes
$this->startSetup();
$installer = $this;
$attributes = array(array('name' => 'ENTER_ATTRIBUTE_KEY_HERE', 'attribute_id' => ''), // enter the attribute_key for ENTER_ATTRIBUTE_KEY_HERE
array('name' => 'ENTER_ATTRIBUTE_KEY_HERE', 'attribute_id' => '')
);
$productEntityTypeId = Mage::getModel('catalog/product')->getResource()->getTypeId();
foreach($attributes as $id => $value) {
$attributeId = $installer->getAttributeId($productEntityTypeId, $value['name']);
$attributes[$id]['attribute_id'] = $attributeId;
$installer->updateAttribute($productEntityTypeId, $attributeId, array(
'frontend_input' => 'multiselect',
'backend_type' => 'varchar',
'backend_model' => 'eav/entity_attribute_backend_array'
));
}
foreach($attributes as $id => $attributeData) {
// now copy attribute values from old attribute to new
$sql = 'INSERT INTO ' . $this->getTable('catalog_product_entity_varchar') . '(entity_type_id, attribute_id, store_id, entity_id, value)
SELECT entity_type_id, attribute_id, store_id, entity_id, value
FROM ' . $this->getTable('catalog_product_entity_int')
. ' WHERE attribute_id = ' . $attributeData['attribute_id'] . ';';
$installer->run($sql);
// delete values from old attribute (you must do this)
$sql = 'DELETE FROM ' . $this->getTable('catalog_product_entity_int')
. ' WHERE entity_type_id = 4 and attribute_id = ' . $attributeData['attribute_id'] . ';';
$installer->run($sql);
}
$this->endSetup();


