Hinzufügen eines benutzerdefinierten Attributs zum Kunden

64

Wir benötigen eine einfache Methode, um einem Kundendatensatz ein Attribut hinzuzufügen, das nicht vom Kunden oder Administrator bearbeitet werden kann, sondern nur programmgesteuert. Im Wesentlichen haben wir eine ExpressionEngine-Site, die mit Magento gekoppelt ist.

Wir authentifizieren uns über den Webservice und möchten einige JSON-Daten, die wir von der Authentifizierung erhalten, im Datensatz des Kunden speichern und bei jeder Anmeldung aktualisieren.

Wir möchten auch, dass die Daten geändert werden, wenn sie sich während des Bestellvorgangs ändern, z. B. die Lieferadresse. Wir senden die Daten dann an unseren Webservice zurück, wie wir dies derzeit bei jeder Bestellung tun.

Ist dies schwierig, da wir jetzt für jedes Produkt JSON mit einem benutzerdefinierten Attribut und der Erweiterung "Benutzerdefinierte Optionen" von MageWorx speichern?

Ich habe den Online Module Creator hier verwendet http://www.silksoftware.com/magento-module-creator/ , bin mir aber nicht sicher, wie ich den Wert nach der Installation des Moduls ändern oder abrufen soll.

Wo kann ich lernen, wie man eine Erweiterung dazu schreibt?

MB34
quelle
Wie gehe ich vor, wenn ich diesen Attributwert in der Datenbanktabelle 'customer_entity' speichern möchte? @Marius
Kazim Noorani
1
@KazimNoorani Wenn Sie den Wert direkt in der customer_entityTabelle speichern möchten, müssen Sie die Spalte der Tabelle hinzufügen und in dem Skript, das das Attribut hinzufügt (siehe meine Antwort unten), den Typ von varcharbis ersetzen static.
Marius
@Marius Ich habe bereits eine Spalte in der customer_entityTabelle hinzugefügt . Und mein Attribut ist vom Typ 'select'. Ich möchte meinen Attributwert direkt in dieser 'custom_column' in der customer_entityTabelle speichern . Wie geht das?
Kazim Noorani
1
Auch wenn Sie die Daten in der Haupttabelle speichern möchten, benötigen Sie ein Attribut vom Typ static.
Marius

Antworten:

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>

Zum Abrufen oder Bearbeiten verwenden Sie dann:

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

Sie müssen Ereignisbeobachter für das Anmeldeereignis erstellen, die hier beantwortet werden: Wie kann ich nach erfolgreicher Anmeldung Kundendaten vom Beobachter abrufen?

und wahrscheinlich auch Beobachter für den customer_save_after, falls sie ihre Adresse in account mgmt ändern, und eine für das Angebot, die sich an verschiedenen Orten befinden kann, je nachdem, was Sie anstreben.

willboudle
quelle
Was ist customer_band_sku?
MB34
Entschuldigung, das war einer, den ich übrig gelassen habe.
Willboudle
Wie würde setCustomAttribute () funktionieren, um die Daten festzulegen?
MB34
Haben Sie ein Beispiel, wie Sie die Daten einstellen, wenn sich der Benutzer anmeldet?
MB34
1
Funktioniert gut? Könnten Sie auch sagen, wie dieses Attribut im Admin-Panel und im Kunden-Grid
angezeigt werden soll
9

Es gibt eine Menge benutzerdefinierter Funktionen, die Sie selbst als benutzerdefinierte Modulüberschreibungsklassen erstellen und in Ereignisse einbinden müssen, bei denen Daten an Ihren Webdienst übergeben werden sollen. Was das Attribut betrifft, können Sie config.xmlin Ihrem Installationsskript Folgendes tun , wenn Sie Ihr benutzerdefiniertes Modul erstellen und eine Setup-Ressource für dieses Modul definieren, wie im obigen Lernprogramm beschrieben:

[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_definedmacht das Attribut zu einem systemAttribut, wenn es auf gesetzt ist 0, wodurch die Möglichkeit deaktiviert wird, es aus dem Administrator zu löschen.

russjman
quelle
0

Nach einer Menge Core-Debugging habe ich herausgefunden, dass Magento erwartet, dass sich die Datei entweder in data / Companyname_Modulname_setup / oder in sql / Companyname_Modulname_setup / befindet .

Und es muss mysql4-data-upgrade-OLDVERSION-NEWVERSION.phpzB mysql4-data-upgrade-0.1.0-0.1.0.phpstatt benannt werdenmysql4-install-0.1.0.php

Zumindest auf Magento 1.9.3

Schwarz
quelle