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?

  • X-Ref: Adding attributes to customer entity (May 2011) – hakre May 19 '15 at 8:41
  • How to do if I want to save this attribute value into 'customer_entity' database table? @Marius – Kazim Noorani Dec 8 '16 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 Dec 8 '16 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? – Kazim Noorani Dec 8 '16 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 Dec 8 '16 at 7:54
68

/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.

  • What is customer_band_sku? – MB34 Jan 30 '14 at 22:46
  • Sorry, that was one I created leftover. – willboudle Jan 31 '14 at 2:26
  • So how would setCustomAttribute() work to set the data? – MB34 Jan 31 '14 at 15:33
  • Do you have an example of how to SET the data when the user logs in? – MB34 Feb 6 '14 at 22:52
  • 1
    Working good..could you also tell how to show that attribute in admin panel+ customer grid – aravind Nov 14 '17 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, privacy policy and cookie policy

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