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