установите пользовательский атрибут раскрывающегося списка для клиента


Я создал пользовательский атрибут (выпадающий список) для клиента следующим образом:

$installer = $this;
$installer->startSetup();
$entityTypeId     = (int)$installer->getEntityTypeId('customer');
$attributeSetId   = (int)$installer->getDefaultAttributeSetId($entityTypeId);
$attributeGroupId = (int)$installer->getDefaultAttributeGroupId($entityTypeId, $attributeSetId);

$installer->addAttribute( $entityTypeId, 'customer_status', array(
    'type'               => 'int',
    'label'              => 'Customer Status',
    'input'              => 'select',
    'forms'              => array('adminhtml_customer'),
    'source'             => 'eav/entity_attribute_source_table',
    'required'           => false,
    'visible'            => 1,
    'position'           => 110,
    'option'             => array('values' => array('Inactive', 'Candidate', 'Certified')),
    'default'            => 'Inactive',
));

$installer->addAttributeToGroup($entityTypeId, $attributeSetId, $attributeGroupId, 'customer_status', 100);

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

$installer->endSetup();

Атрибут создан успешно, но:

  1. Когда я создаю нового клиента, значение по умолчанию равно нет, не inactive как в моем случае. Как я могу сделать неактивным значение по умолчанию.
  2. Как я могу изменить значение этого атрибута программно?

Вопрос № 2 Ответ: Я пытался изменить значение атрибута с помощью текста опции. Копать глубже в это показывает, что выпадающий список имеет некоторое значение int для параметра, как показано ниже.

<select id="_accountcustomer_status" class=" select" name="account[customer_status]">
<option value=""></option>
<option selected="selected" value="241">Inactive</option>
<option value="242">Candidate</option>
<option value="243">Certified</option>
</select>

Итак, теперь, используя следующий код, я могу получить значение для требуемого параметра и сохранить его.

$attributeInfo = Mage::getResourceModel('eav/entity_attribute_collection')->setCodeFilter('customer_status')->getFirstItem();
$attributeOptions = $attributeInfo->getSource()->getAllOptions(false);
foreach($attributeOptions as $attr){
    if($attr['label'] == 'Candidate'){
        $statusValue = $attr['value'];
        break;
    }
}
        $customer->setCustomerStatus($statusValue);
        $customer->save();
Author: 7ochem, 2016-07-13

1 answers

Вы не правильно создали Атрибут клиента .

Как вы создали раскрывающийся атрибут клиента, поэтому вам нужно определите исходную модель для этого атрибута.

 "source"   => "[module_Model_Prefix]/source_option",

В основном в этом исходном классе у вас есть опция определения для этого атрибута

Также необходимо удалить 'option' => array('values' => array('Inactive', 'Candidate', 'Certified')),

Класс источника

<?php
class [ModuleNameSpace]_[ModuleName]_Model_Source_Option extends Mage_Eav_Model_Entity_Attribute_Source_Abstract
{
    /**
     * Retrieve all options array
     *
     * @return array
     */
    public function getAllOptions()
    {
        if (is_null($this->_options)) {
            $this->_options = array(

                array(
                    "label" => Mage::helper("eav")->__("Inactive"),
                    "value" =>  1
                ),

                array(
                    "label" => Mage::helper("eav")->__("Candidate"),
                    "value" =>  2
                ),

            );
        }
        return $this->_options;
    }

    /**
     * Retrieve option array
     *
     * @return array
     */
    public function getOptionArray()
    {
        $_options = array();
        foreach ($this->getAllOptions() as $option) {
            $_options[$option["value"]] = $option["label"];
        }
        return $_options;
    }

    /**
     * Get a text for option value
     *
     * @param string|integer $value
     * @return string
     */
    public function getOptionText($value)
    {
        $options = $this->getAllOptions();
        foreach ($options as $option) {
            if ($option["value"] == $value) {
                return $option["label"];
            }
        }
        return false;
    }
 3
Author: Amit Bera, 2016-07-13 08:36:05