2011-05-11 16 views
37

mi objetivo actual es agregar un nuevo atributo de cliente (con int tipo) que debería aparecer como seleccionar con opciones predefinidas (cargadas desde un modelo con entradas editables en back-end, que está hecho). Estoy luchando con el uso adecuado del método $installer->addAttribute(), especialmente especificando la opción de fuente correcta. Otro problema es el nuevo atributo no se guarda en la tabla eav_entity_attributeAgregando atributos a la entidad del cliente

Estoy en Magento CE 1.5.1.0

Respuesta

71

Este es el código para un atributo básico int con text procesador:

$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', 'your_attribute_code_here', array(
    'input'   => 'text', 
    'type'   => 'int', 
    'label'   => 'Some textual description', 
    'visible'  => 1, 
    'required'  => 0, 
    'user_defined' => 1, 
)); 

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

$oAttribute = Mage::getSingleton('eav/config')->getAttribute('customer', 'your_attribute_code_here'); 
$oAttribute->setData('used_in_forms', array('adminhtml_customer')); 
$oAttribute->save(); 

$setup->endSetup(); 

El paso inusual para agregar atributos es setData('used_in_forms'); esto parece ser exclusivo de los atributos del cliente. Sin él, el campo no se renderizará, ciertamente no en el adminhtml de todos modos. Puede ver las opciones válidas para esta matriz en la tabla de la base de datos customer_form_attribute.

En cuanto al uso de un select con opciones predefinidas, esto es lo que necesita:

$iAttributeId = $installer->getAttributeId($entityTypeId, 'your_attribute_code_here'); 
$aClasses = array('TV','DVD','Home Theatre','Air Conditioner','Stereo/Hifi','Game Console','Camcorder','VCR','Set Top Box','PVR'); 
$aOption = array(); 
$aOption['attribute_id'] = $iAttributeId; 

for($iCount=0;$iCount<sizeof($aClasses);$iCount++){ 
    $aOption['value']['option'.$iCount][0] = $aClasses[$iCount]; 
} 
$setup->addAttributeOption($aOption); 

Y aquí es un walk-through sobre el uso de una fuente personalizada para su desplegable

Espero que esto ayude,
JD

+0

gracias por la respuesta, que estaré dando a este un intento.En cuanto a las opciones predefinidas, no deberían ser estáticas en mi caso, pero editables desde la interfaz de administración, es por eso que estaba tratando de hacer uso de la opción 'source' – Zifius

+0

Editado con el enlace para las opciones dinámicas. Mi ejemplo de opciones predefinidas se puede editar en el administrador si está utilizando una versión de Magento que proporciona el Administrador de atributos del cliente, es solo un conjunto inicial. –

+0

Acabo de probar su código y funcionó como un encanto, la llamada addAttributeToGroup fue realmente útil. También configuré la opción de fuente. – Zifius

23

@Jonathan Day La respuesta es genial y me ayudó muchísimo. Sin embargo - siempre y cuando se haya definido su clase setup a Mage_Customer_Model_Entity_Setup, a continuación, Magento puede hacer todo ese trabajo para usted:

<!-- config.xml Example --> 
<?xml version="1.0"?> 
<config> 
    <global> 
     <resources> 
      <acme_module_setup> 
       <setup> 
        <module>Acme_Module</module> 
        <class>Mage_Customer_Model_Entity_Setup</class> 
       </setup> 
       <connection> 
        <use>core_setup</use> 
       </connection> 
      </acme_module_setup> 
     </resources> 
    </global> 
</config> 

Y aquí está el archivo mysql4-install-X.X.X.php:

<?php 

$installer = $this; 
/* @var $installer Mage_Customer_Model_Entity_Setup */ 

$installer->startSetup(); 

$installer->addAttribute(
    'customer', 
    'acme_imported', 
    array(
     'group'    => 'Default', 
     'type'     => 'int', 
     'label'    => 'Imported into Acme', 
     'input'    => 'select', 
     'source'    => 'eav/entity_attribute_source_boolean', 
     'global'    => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE, 
     'required'    => 0, 
     'default'    => 0, 
     'visible_on_front'  => 1, 
     'used_for_price_rules' => 0, 
     'adminhtml_only'  => 1, 
    ) 
); 

$installer->endSetup(); 

El adminhtml_only anteriormente manejará toda la lógica de used_in_forms para usted. Además, al definir group se ocupará de asignarlo al grupo de atributos.

+3

Usando 1.7.0.2 CE, el truco * adminhtml_only * no funcionó para mí. Todavía tenía que añadir: 'Mago :: getSingleton ('EAV/config') -> getAttribute ('cliente', $ custom_attribute_id) -> setData ('used_in_forms', array ('adminhtml_customer')) -> save()' para que el atributo se muestre en el back-end. –

4

Acaba de agregar el atributo de cliente debajo del archivo de instalación de mysql del módulo personalizado a través de la siguiente secuencia de comandos.

$installer = $this; 
$installer->startSetup(); 


$installer->addAttribute("customer", "yourattributename", array(
    "type"  => "int", 
    "backend" => "", 
    "label" => "Bad Customer", 
    "input" => "select", 
    "source" => "eav/entity_attribute_source_boolean", 
    "visible" => true, 
    "required" => false, 
    "default" => "", 
    "frontend" => "", 
    "unique"  => false, 
    "note"  => "" 

    )); 

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

El siguiente script utilizado para donde desea utilizar el atributo del cliente

$used_in_forms=array(); 

$used_in_forms[]="adminhtml_customer"; 
     $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", 0) 
     ->setData("sort_order", 100) 
     ; 
     $attribute->save(); 

$installer->endSetup(); 
0

La solución proporcionan por Alex y puerro ambos trabajaban para mí. Sólo tengo que añadir la función de colocador en nuestra AccountController.php

$customer->setProfession($this->getRequest()->getPost('profession')) 
         ->save(); // Added for updating Profession 

Donde "profesión" fue mi atributo personalizado.

3

Este blog tiene una explicación muy completa de modelo de Magento EAV con una descripción detallada de los parámetros de campos y significados: http://www.solvingmagento.com/magento-eav-system/

+3

¡Bienvenido a SO! Las respuestas con enlaces como este deberían contener las partes importantes de un enlace, ya que los enlaces pueden romperse y ya no son accesibles. – hichris123

Cuestiones relacionadas