Dodanie niestandardowego atrybutu do klienta

64

Potrzebujemy prostego sposobu dodania atrybutu do rekordu klienta, który nie może być edytowany przez klienta lub administratora, tylko programowo. Zasadniczo mamy witrynę ExpressionEngine połączoną z Magento.

Uwierzytelniamy za pośrednictwem usługi internetowej i chcielibyśmy przechowywać część JSON, którą otrzymujemy z uwierzytelnienia, do rejestru klienta i aktualizować go przy każdym logowaniu.

Będziemy również wymagać modyfikacji danych, jeśli zmienią one informacje w procesie realizacji transakcji, takie jak adres wysyłki. Następnie wyślemy dane z powrotem do naszego serwisu internetowego, ponieważ obecnie robimy to przy każdym zamówieniu.

Czy jest to trudne, ponieważ teraz przechowujemy trochę JSON na każdym produkcie za pomocą niestandardowego atrybutu z rozszerzeniem MageWorx Custom Options?

Użyłem tutaj Online Module Creator http://www.silksoftware.com/magento-module-creator/, ale nie jestem pewien, jak zmodyfikować lub pobrać wartość po zainstalowaniu modułu.

Gdzie mogę się dowiedzieć, jak napisać rozszerzenie, aby to zrobić?

MB34
źródło
X-Ref: Dodawanie atrybutów do bytu klienta (maj 2011)
hakre
Jak to zrobić, jeśli chcę zapisać tę wartość atrybutu w tabeli bazy danych „customer_entity”? @Marius
Kazim Noorani,
1
@KazimNoorani Jeśli chcesz zapisać wartość bezpośrednio w customer_entitytabeli, musisz dodać kolumnę do tabeli, aw skrypcie, który dodaje atrybut (patrz moja odpowiedź poniżej), zastąp typ od varcharna static.
Marius
@Marius Dodałem już kolumnę w customer_entitytabeli. A mój atrybut jest typu „wybierz”. Chcę zapisać moją wartość atrybutu bezpośrednio w tej „kolumnie niestandardowej” w customer_entitytabeli. Jak to zrobić?
Kazim Noorani,
1
Nawet jeśli chcesz zapisać dane w głównej tabeli, nadal potrzebujesz atrybutu o typie static.
Marius

Odpowiedzi:

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>

app / etc / modules / 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>

Następnie do pobierania lub edycji używasz:

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

Będziesz musiał utworzyć obserwatorów zdarzeń dla zdarzenia logowania, odpowiedź tutaj: Jak mogę uzyskać dane klienta od obserwatora po udanym zalogowaniu?

a także prawdopodobnych obserwatorów dla klienta_zapisz_w przypadku, gdyby zmienili swój adres na koncie mgmt, i jednego dla oferty, który może znajdować się w różnych miejscach w zależności od tego, czego szukasz.

willboudle
źródło
Co to jest customer_band_sku?
MB34
Przepraszam, to był jeden, który stworzyłem.
willboudle
Jak więc działa setCustomAttribute (), aby ustawić dane?
MB34
Czy masz przykład ustawiania danych podczas logowania użytkownika?
MB34
1
Czy działa dobrze. Czy możesz również powiedzieć, jak pokazać ten atrybut w panelu administracyjnym + siatka klientów
aravind
9

Istnieje wiele niestandardowych funkcji, które musisz stworzyć jako niestandardowy moduł zastępujący klasy i łączący się ze zdarzeniami, w których chcesz, aby dane były przekazywane do usługi internetowej. Jeśli chodzi o atrybut, po utworzeniu niestandardowego modułu i zdefiniowaniu zasobu konfiguracyjnego dla niego w module, config.xmltak jak w powyższym samouczku, w skrypcie instalacyjnym można wykonać następujące czynności:

[ścieżka_modułu] / sql / [nazwa_węzła_zasobu_w_konfiguracji_xml] / mysql4-install- [numer_wersji modułu] .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_definedsystemustawia atrybut jako atrybut, jeśli jest ustawiony na 0, co wyłącza możliwość usunięcia go z administratora.

Russjman
źródło
0

Po wielu debugowaniu rdzenia dowiedziałem się, że magento oczekuje, że plik będzie zawierał dane / nazwa_instalacji_nazwa_modulu / lub sql / nazwa_instalacji_modulu_modulu / .

I trzeba to nazwać mysql4-data-upgrade-OLDVERSION-NEWVERSION.phpnp. mysql4-data-upgrade-0.1.0-0.1.0.phpZamiastmysql4-install-0.1.0.php

Przynajmniej na Magento 1.9.3

czarny
źródło