How to make add a customer attribute in Magento Programmatically
-
12-12-2019 - |
Question
$installer = $this;
$installer->startSetup();
$installer->addAttribute('customer','badge', array(
'label' => 'Badge',
'type' => 'text', //backend_type
'input' => 'multiselect', //frontend_input
'backend' => 'eav/entity_attribute_backend_array',
'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
'source' => 'marketplace/eav_entity_attribute_source_badge', // Goes to Step 2
'visible' => true,
'required' => false,
'default' => '',
'frontend' => '',
'unique' => false,
'note' => ''
));
Mage::getSingleton('eav/config')
->getAttribute('customer', 'badge')
->setData('used_in_forms', array(
'customer_account_create', 'customer_account_edit', 'customer_address_edit',
'checkout_onepage_register', 'checkout_onepage_register_guest', 'checkout_onepage_billing_address',
'adminhtml_customer','checkout_onepage_shipping_address','checkout_multishipping_register'
))
->save();
$installer->endSetup();
My Badge,php
class Company_Marketplace_Model_System_Config_Source_Badge
extends Mage_Eav_Model_Entity_Attribute_Source_Abstract
{
protected $_options;
public function toOptionArray()
{
$collection = Mage::getModel('marketplace/badge')->getCollection();
$allattributes = array();
foreach ($collection as $data) {
$allattributes[] = array(
'value' => $data->getBadgeName(),
'label' => $data->getBadgeName()
);
}
return $allattributes;
}
}
Get error:
Fatal error: Call to undefined method Mage_Core_Model_Resource_Setup::addAttribute()
in app\code\local\Company\Marketplace\sql\marketplace_setup\mysql4-upgrade-1.0.0-1.0.1.php on line 6
Solution
I assume you have this piece of xml in the config.xml
file inside the <global>
tag
<resources>
<[module]_setup>
<setup>
<module>Company_Marketplace</module>
</setup>
</[module]_setup>
</resources>
You need to tell magento to use the customer setup model for your setup. You can do that by transforming the markup above into:
<resources>
<[module]_setup>
<setup>
<module>Company_Marketplace</module>
<class>Mage_Customer_Model_Resource_Setup</class> <!-- this needs to be added -->
</setup>
</[module]_setup>
</resources>
[EDIT]
add this method to your source model also:
public function getOptionText($value)
{
$isMultiple = false;
if (strpos($value, ',')) {
$isMultiple = true;
$value = explode(',', $value);
}
$options = $this->getAllOptions(false);
if ($isMultiple) {
$values = array();
foreach ($options as $item) {
if (in_array($item['value'], $value)) {
$values[] = $item['label'];
}
}
return $values;
}
foreach ($options as $item) {
if ($item['value'] == $value) {
return $item['label'];
}
}
return false;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange