64

We need a simple way to add an attribute to a customer record that is not editable by the customer or admin, only programatically. Essentially, we have an ExpressionEngine site coupled with Magento.

We authenticate via webservice and would like to store some JSON that we get back from the authentication into the customer's record and update it each time they login.

We will also want the data modified if they change information in the checkout process, such as shipping address. We will then send the data back to our webservice as we currently do that with each order.

Is this difficult to do as we are now storing some JSON on each product using a custom attribute with MageWorx's Custom Options extension?

I used the Online Module Creator here http://www.silksoftware.com/magento-module-creator/ but am not sure how to modify or retrieve the value once the module is installed.

Where could I learn how to write an extension to do this?

5
  • X-Ref: Adding attributes to customer entity (May 2011)
    – hakre
    Commented May 19, 2015 at 8:41
  • How to do if I want to save this attribute value into 'customer_entity' database table? @Marius Commented Dec 8, 2016 at 7:31
  • 1
    @KazimNoorani If you want to save the value directly in the customer_entity table you need to add the column to the table and in the script that adds the attribute (see my answer below) replace the type from varchar to static.
    – Marius
    Commented Dec 8, 2016 at 7:36
  • @Marius I already added column in customer_entity table. And my attribute is of type 'select'. I want to save my attribute value directly at this 'custom_column' in customer_entity table. How to do that? Commented Dec 8, 2016 at 7:52
  • 1
    Even if you want to save the data in the main table you still need an attribute with the type static.
    – Marius
    Commented Dec 8, 2016 at 7:54

3 Answers 3

70

/app/code/local/Your/Customattribute/sql/your_customattribute_setup/install-0.1.0.php

<?php
$installer = $this;

$installer->startSetup();

$setup = new Mage_Eav_Model_Entity_Setup('core_setup');

$entityTypeId     = $setup->getEntityTypeId('customer');
$attributeSetId   = $setup->getDefaultAttributeSetId($entityTypeId);
$attributeGroupId = $setup->getDefaultAttributeGroupId($entityTypeId, $attributeSetId);

$setup->addAttribute("customer", "customattribute",  array(
    "type"     => "varchar",
    "backend"  => "",
    "label"    => "Custom Attribute",
    "input"    => "text",
    "source"   => "",
    "visible"  => true,
    "required" => false,
    "default" => "",
    "frontend" => "",
    "unique"     => false,
    "note"       => "Custom Attribute"
));

$attribute   = Mage::getSingleton("eav/config")->getAttribute("customer", "customattribute");

$setup->addAttributeToGroup(
    $entityTypeId,
    $attributeSetId,
    $attributeGroupId,
    'customattribute',
    '999'  //sort_order
);

$used_in_forms=array();

$used_in_forms[]="adminhtml_customer";
//$used_in_forms[]="checkout_register";
//$used_in_forms[]="customer_account_create";
//$used_in_forms[]="customer_account_edit";
//$used_in_forms[]="adminhtml_checkout";
        $attribute->setData("used_in_forms", $used_in_forms)
                ->setData("is_used_for_customer_segment", true)
                ->setData("is_system", 0)
                ->setData("is_user_defined", 1)
                ->setData("is_visible", 1)
                ->setData("sort_order", 100)
                ;
        $attribute->save();



$installer->endSetup();

/app/code/local/Your/Customattribute/etc/config.xml

 <?xml version="1.0"?>
    <config>
        <modules>
            <Your_Customattribute>
                <version>0.1.0</version>
            </Your_Customattribute>
        </modules>
        <global>

            <resources>
                <Your_Customattribute_setup>
                    <setup>
                        <module>Your_Customattribute</module>
                        <class>Mage_Customer_Model_Entity_Setup</class>
                    </setup>
                    <connection>
                        <use>core_setup</use>
                    </connection>
                </Your_Customattribute_setup>
                <Your_Customattribute_write>
                    <connection>
                        <use>core_write</use>
                    </connection>
                </Your_Customattribute_write>
                <Your_Customattribute_read>
                    <connection>
                        <use>core_read</use>
                    </connection>
                </Your_Customattribute_read>
            </resources>
        </global>

    </config>

app/etc/modules/Your_Customattribute.xml

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

Then to retrieve or edit you use:

$customer = Mage::getModel('customer/customer')->load($custid);
$customer->getCustomattribute();
$customer->setCustomattribute($yourjson);

You will have to create event observers for the login event, answered here: How can i get customer data from observer after successful login?

and also likely observers for the customer_save_after in case they alter their address in account mgmt, and one for the quote, which could be in different places depending on what you are going for.

9
  • What is customer_band_sku?
    – MB34
    Commented Jan 30, 2014 at 22:46
  • Sorry, that was one I created leftover.
    – willboudle
    Commented Jan 31, 2014 at 2:26
  • So how would setCustomAttribute() work to set the data?
    – MB34
    Commented Jan 31, 2014 at 15:33
  • Do you have an example of how to SET the data when the user logs in?
    – MB34
    Commented Feb 6, 2014 at 22:52
  • 1
    Working good..could you also tell how to show that attribute in admin panel+ customer grid
    – aravind
    Commented Nov 14, 2017 at 9:59
9

There is a lot of custom functionality you'll have to create yourself as custom module overriding classes, and hooking into events where you want data passed to your web service. As far as the attribute goes, when you create your custom module and define a setup resource for it in the module's config.xml like in the tutorial above, then in your install script you can do something like this:

[module_path]/sql/[resource_node_defined_in_config_xml]/mysql4-install-[module_version_number].php

$installer = $this;

$installer->startSetup ();

$setup = Mage::getModel ( 'customer/entity_setup' , 'core_setup' );

    //add budget
    $setup->addAttribute('customer', 'budget', array(
        'type' => 'decimal',
        'input' => 'text',
        'label' => 'Budget',
        'global' => 1,
        'visible' => 1,
        'required' => 0,
        'user_defined' => 0,
        'default' => '',
        'visible_on_front' => 1,
        'source' =>   NULL,
        'comment' => 'This is a budget'
    ));

$installer->endSetup ();

user_defined makes the attribute a system attribute if set to 0, which disables the ability to delete it from the admin.

0

After alot of core debugging I found out that magento expects the file to be in either data/Companyname_Modulname_setup/ or in sql/Companyname_Modulname_setup/.

And it has to be named mysql4-data-upgrade-OLDVERSION-NEWVERSION.php e.g. mysql4-data-upgrade-0.1.0-0.1.0.php instead of mysql4-install-0.1.0.php

At least on Magento 1.9.3

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.