Agregar atributo personalizado al cliente

64

Necesitamos una manera simple de agregar un atributo a un registro de cliente que no sea editable por el cliente o el administrador, solo programáticamente. Esencialmente, tenemos un sitio ExpressionEngine junto con Magento.

Nos autenticamos a través del servicio web y nos gustaría almacenar algunos JSON que recuperamos de la autenticación en el registro del cliente y actualizarlos cada vez que inician sesión.

También queremos que se modifiquen los datos si cambian la información en el proceso de pago, como la dirección de envío. Luego enviaremos los datos de vuelta a nuestro servicio web como lo hacemos actualmente con cada pedido.

¿Es difícil hacerlo ya que ahora estamos almacenando algo de JSON en cada producto usando un atributo personalizado con la extensión de Opciones personalizadas de MageWorx?

Utilicé el Creador de módulos en línea aquí http://www.silksoftware.com/magento-module-creator/ pero no estoy seguro de cómo modificar o recuperar el valor una vez que el módulo está instalado.

¿Dónde podría aprender a escribir una extensión para hacer esto?

MB34
fuente
¿Cómo hacer si quiero guardar este valor de atributo en la tabla de base de datos 'customer_entity'? @Marius
Kazim Noorani
1
@KazimNoorani Si desea guardar el valor directamente en la customer_entitytabla, debe agregar la columna a la tabla y en el script que agrega el atributo (vea mi respuesta a continuación) reemplace el tipo de varchara static.
Marius
@ Mario Ya agregué una columna en la customer_entitytabla. Y mi atributo es de tipo 'select'. Quiero guardar mi valor de atributo directamente en esta 'columna personalizada' en la customer_entitytabla. ¿Como hacer eso?
Kazim Noorani
1
Incluso si desea guardar los datos en la tabla principal, aún necesita un atributo con el tipo static.
Marius

Respuestas:

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>

Luego, para recuperar o editar, usa:

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

Tendrá que crear observadores de eventos para el evento de inicio de sesión, respondido aquí: ¿Cómo puedo obtener los datos del cliente del observador después de un inicio de sesión exitoso?

y también observadores probables para customer_save_after en caso de que alteren su dirección en la cuenta de administración, y uno para la cotización, que podría estar en diferentes lugares dependiendo de lo que esté buscando.

willboudle
fuente
¿Qué es customer_band_sku?
MB34
Lo siento, ese fue uno que creé sobrantes.
willboudle
Entonces, ¿cómo funcionaría setCustomAttribute () para establecer los datos?
MB34
¿Tiene un ejemplo de cómo CONFIGURAR los datos cuando el usuario inicia sesión?
MB34
1
Funciona bien ... ¿podría decir también cómo mostrar ese atributo en el panel de administración + cuadrícula del cliente
Aravind
9

Hay una gran cantidad de funcionalidades personalizadas que tendrá que crear usted mismo como clases personalizadas que anulan las clases y se conectan a los eventos donde desea que los datos pasen a su servicio web. En lo que respecta al atributo, cuando crea su módulo personalizado y define un recurso de configuración para él en el módulo config.xmlcomo en el tutorial anterior, luego en su script de instalación puede hacer algo como esto:

[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_definedconvierte el atributo en un systematributo si se establece en 0, lo que deshabilita la capacidad de eliminarlo del administrador.

russjman
fuente
0

Después de una gran cantidad de depuración del núcleo descubrí que magento espera que el archivo esté en datos / Companyname_Modulname_setup / o en sql / Companyname_Modulname_setup / .

Y tiene que ser nombrado, mysql4-data-upgrade-OLDVERSION-NEWVERSION.phppor ejemplo, en mysql4-data-upgrade-0.1.0-0.1.0.phplugar demysql4-install-0.1.0.php

Al menos en Magento 1.9.3

Negro
fuente