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ć?



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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.