Добавление пользовательского атрибута в Customer


64

Нам нужен простой способ добавить атрибут в запись клиента, который не может быть изменен клиентом или администратором, только программно. По сути, у нас есть сайт ExpressionEngine в сочетании с Magento.

Мы выполняем аутентификацию через веб-сервис и хотели бы сохранить некоторые данные JSON, которые мы получаем от аутентификации, в записи клиента и обновлять его при каждом входе в систему.

Мы также хотим, чтобы данные были изменены, если они изменяют информацию в процессе оформления заказа, например, адрес доставки. Затем мы отправим данные обратно в наш веб-сервис, как мы делаем это с каждым заказом.

Сложно ли это сделать, поскольку сейчас мы храним некоторые JSON для каждого продукта, используя пользовательский атрибут с расширением пользовательских параметров MageWorx?

Я использовал Создателя онлайн-модуля здесь http://www.silksoftware.com/magento-module-creator/, но не уверен, как изменить или получить значение после установки модуля.

Где я могу узнать, как написать расширение для этого?



Как это сделать, если я хочу сохранить значение этого атрибута в таблице базы данных customer_entity? @Marius
Казим Нурани

1
@KazimNoorani Если вы хотите сохранить значение непосредственно в customer_entityтаблице, вам нужно добавить столбец в таблицу и в скрипте, который добавляет атрибут (см. Мой ответ ниже), заменить тип с varcharна static.
Мариус

@Marius Я уже добавил столбец в customer_entityтаблице. И мой атрибут имеет тип «выбрать». Я хочу сохранить значение моего атрибута непосредственно в этом «custom_column» в customer_entityтаблице. Как это сделать?
Казим Нурани

1
Даже если вы хотите сохранить данные в основной таблице, вам все равно нужен атрибут со статическим типом.
Мариус

Ответы:


68

/app/code/local/Your/Customattribute/sql/your_customattribute_setup/install-0.1.0.php

<?php
$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", "customattribute",  array(
    "type"     => "varchar",
    "backend"  => "",
    "label"    => "Custom Attribute",
    "input"    => "text",
    "source"   => "",
    "visible"  => true,
    "required" => false,
    "default" => "",
    "frontend" => "",
    "unique"     => false,
    "note"       => "Custom Attribute"
));

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

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

$used_in_forms=array();

$used_in_forms[]="adminhtml_customer";
//$used_in_forms[]="checkout_register";
//$used_in_forms[]="customer_account_create";
//$used_in_forms[]="customer_account_edit";
//$used_in_forms[]="adminhtml_checkout";
        $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", 1)
                ->setData("sort_order", 100)
                ;
        $attribute->save();



$installer->endSetup();

/app/code/local/Your/Customattribute/etc/config.xml

 <?xml version="1.0"?>
    <config>
        <modules>
            <Your_Customattribute>
                <version>0.1.0</version>
            </Your_Customattribute>
        </modules>
        <global>

            <resources>
                <Your_Customattribute_setup>
                    <setup>
                        <module>Your_Customattribute</module>
                        <class>Mage_Customer_Model_Entity_Setup</class>
                    </setup>
                    <connection>
                        <use>core_setup</use>
                    </connection>
                </Your_Customattribute_setup>
                <Your_Customattribute_write>
                    <connection>
                        <use>core_write</use>
                    </connection>
                </Your_Customattribute_write>
                <Your_Customattribute_read>
                    <connection>
                        <use>core_read</use>
                    </connection>
                </Your_Customattribute_read>
            </resources>
        </global>

    </config>

приложение / и т.д. / модули / Your_Customattribute.xml

  <?xml version="1.0"?>
    <config>
        <modules>
            <Your_Customattribute>
                <active>true</active>
                <codePool>local</codePool>
                <version>0.1.0</version>
            </Your_Customattribute>
        </modules>
    </config>

Затем для извлечения или редактирования вы используете:

$customer = Mage::getModel('customer/customer')->load($custid);
$customer->getCustomattribute();
$customer->setCustomattribute($yourjson);

Вам нужно будет создать наблюдателей событий для события входа в систему, ответьте здесь: Как я могу получить данные клиента от наблюдателя после успешного входа в систему?

а также, вероятно, наблюдатели для customer_save_after в случае, если они изменят свой адрес в учетной записи mgmt, и один для цитаты, которая может быть в разных местах в зависимости от того, что вы собираетесь.


Что такое customer_band_sku?
MB34

Извините, это был тот, который я создал остаток.
Willboudle

Итак, как setCustomAttribute () будет работать, чтобы установить данные?
MB34

У вас есть пример того, как установить данные, когда пользователь входит в систему?
MB34

1
Работает хорошо .. не могли бы вы также рассказать, как показать этот атрибут в админ-панели + сетка клиента
aravind

9

Существует множество пользовательских функций, которые вы должны будете создавать самостоятельно, переопределяя классы пользовательских модулей и подключаясь к событиям, когда вы хотите, чтобы данные передавались в ваш веб-сервис. Что касается атрибута, когда вы создаете свой пользовательский модуль и определяете для него ресурс установки в модуле, config.xmlкак в учебном руководстве выше, то в вашем скрипте установки вы можете сделать что-то вроде этого:

[Module_path] / SQL / [resource_node_defined_in_config_xml] / MySQL4-install- [module_version_number] .php

$installer = $this;

$installer->startSetup ();

$setup = Mage::getModel ( 'customer/entity_setup' , 'core_setup' );

    //add budget
    $setup->addAttribute('customer', 'budget', array(
        'type' => 'decimal',
        'input' => 'text',
        'label' => 'Budget',
        'global' => 1,
        'visible' => 1,
        'required' => 0,
        'user_defined' => 0,
        'default' => '',
        'visible_on_front' => 1,
        'source' =>   NULL,
        'comment' => 'This is a budget'
    ));

$installer->endSetup ();

user_definedделает атрибут systemатрибутом, если он установлен на 0, что отключает возможность его удаления от администратора.


0

После многих отладок ядра я обнаружил, что magento ожидает, что файл будет либо в data / Companyname_Modulname_setup /, либо в sql / Companyname_Modulname_setup / .

И это должно быть названо, mysql4-data-upgrade-OLDVERSION-NEWVERSION.phpнапример, mysql4-data-upgrade-0.1.0-0.1.0.phpвместоmysql4-install-0.1.0.php

По крайней мере, на Magento 1.9.3

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.