Добавление атрибутов к объекту клиента
Моя текущая цель - добавить новый атрибут клиента (с типом int
), который должен отображаться как select с предопределенными параметрами (загружен из модели с записями, редактируемыми в бэкэнд, что и делается).
Я изо всех сил стараюсь использовать метод $installer->addAttribute()
, особенно указав правильный вариант источника. Другая проблема заключается в том, что новый атрибут не сохраняется в таблице eav_entity_attribute
Я на Magento CE 1.5.1.0
Ответы
Ответ 1
Это код базового атрибута int
с text
renderer:
$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();
Необычным шагом для добавления атрибутов является setData('used_in_forms')
, это кажется уникальным для атрибутов клиента. Без этого поле не будет отображаться, конечно же, не в adminhtml. Вы можете увидеть допустимые параметры для этого массива в таблице базы данных customer_form_attribute
.
С точки зрения использования select
с предопределенными параметрами, это то, что вам нужно:
$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);
И вот walk-through с использованием настраиваемого источника для раскрывающегося списка
Надеюсь, что это поможет,
JD
Ответ 2
@Jonathan Day ответ велик и очень помог мне. Однако - пока вы установите класс setup
на Mage_Customer_Model_Entity_Setup
, Magento может выполнить всю эту работу для вас:
<!-- 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>
И вот файл 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();
adminhtml_only
выше будет обрабатывать всю логику used_in_forms
для вас. Кроме того, определение group
позаботится о назначении его группе атрибутов.
Ответ 3
Просто добавьте свой клиентский атрибут в свой настраиваемый файл mysql для настраиваемого модуля через следующий script.
$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");
Следующий script используемый для использования атрибута customer
$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
В этом сообщении блога есть очень подробное объяснение модели Magento EAV с подробным описанием параметров и значений полей:
http://www.solvingmagento.com/magento-eav-system/
Ответ 5
Решение, предоставляемое alex и leek, работало для меня.
Только я должен добавить функцию setter в наш AccountController.php
$customer->setProfession($this->getRequest()->getPost('profession'))
->save(); // Added for updating Profession
Где "профессия" - мой пользовательский атрибут.