web-dev-qa-db-fra.com

Ajout d'attributs à l'entité client

mon objectif actuel est d’ajouter un nouvel attribut client (avec le type int) qui devrait apparaître comme étant sélectionné avec des options prédéfinies (chargé à partir d’un modèle avec des entrées modifiables dans le backend, ce qui est fait) .. $installer->addAttribute(), spécifiant en particulier l’option source correcte. Autre problème, le nouvel attribut n'est pas enregistré dans la table eav_entity_attribute

Je suis sur Magento CE 1.5.1.0

37
Zifius

Ceci est le code d'un attribut int de base avec le rendu text:

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

$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$setup->addAttribute('customer', 'your_attribute_code_here', array(
    'input'         => 'text',
    'type'          => 'int',
    'label'         => 'Some textual description',
    'visible'       => 1,
    'required'      => 0,
    'user_defined' => 1,
));

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

$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();

L'étape inhabituelle pour l'ajout d'attributs est la setData('used_in_forms'), qui semble être unique pour les attributs du client. Sans cela, le champ ne sera pas rendu, certainement pas dans le fichier adminhtml de toute façon. Vous pouvez voir les options valides pour ce tableau dans la table de base de données customer_form_attribute

Pour ce qui est d'utiliser une select avec des options prédéfinies, voici ce dont vous avez besoin: 

$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);

Et voici un walk-through on utilisant une source personnalisée pour votre liste déroulante 

J'espère que cela t'aides,
JD

70
Jonathan Day

@ Jonathan Day La réponse de/est excellente et m'a énormément aidée. Cependant, tant que vous avez défini votre setup classe sur Mage_Customer_Model_Entity_Setup, Magento peut alors effectuer tout ce travail à votre place:

<!-- 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>

Et voici le fichier 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();

Le adminhtml_only ci-dessus gérera toute la logique used_in_forms pour vous. De plus, définir group se chargera de l'attribuer au groupe d'attributs.

23
leek

Vous venez d’ajouter votre attribut client sous votre fichier d’installation mysql de module personnalisé via le script suivant.

$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");

Le script suivant utilisé pour où voulez utiliser l'attribut client

$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();
4
Alexandar

La solution fournie par alex et leek les deux a fonctionné pour moi . Seulement, je dois ajouter la fonction de définition dans notre AccountController.php

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

Où "profession" était mon attribut personnalisé.

0
Suman-PHP4U