Wie zeige ich ein benutzerdefiniertes Attribut im Feld Versandadresse des Administrators an?

13

Ich habe das benutzerdefinierte Dropdown-Feld auf der Checkout-Seite mit benutzerdefinierten Werten hinzugefügt. Es funktioniert gut, auch Attributwerte in der Datenbank zu speichern, aber nicht in der Lieferadresse der Bestellung anzuzeigen. Irgendeine Idee, wie man es zeigt?

Bildbeschreibung hier eingeben

InstallSchema.php

$connection->addColumn(
                $installer->getTable('quote_address'),
                'mob_type',
                [
                    'type' => \Magento\Framework\DB\Ddl\Table ::TYPE_TEXT,
                    'nullable' => true,
                    'default' => NULL,
                    'length' => 255,
                    'comment' => 'Mob Type'
                ]
            );
        $connection->addColumn(
                $installer->getTable('sales_order_address'),
                'mob_type',
                [
                    'type' => \Magento\Framework\DB\Ddl\Table ::TYPE_TEXT,
                    'nullable' => true,
                    'default' => NULL,
                    'length' => 255,
                    'comment' => 'Mob Type'
                ]
            );
        $installer->endSetup();

Plugin

use Magento\Checkout\Block\Checkout\LayoutProcessor;

class MobPlugin
{
    public function afterProcess(LayoutProcessor $subject, $jsLayout) {
        $customAttributeCode = 'mob_type';
        $customField = [
            'component' => 'Magento_Ui/js/form/element/select',
            'config' => [
                'customScope' => 'shippingAddress.custom_attributes',
                'template' => 'ui/form/field',
                'elementTmpl' => 'ui/form/element/select',
                'id' => 'drop-down',
            ],
            'dataScope' => 'shippingAddress.custom_attributes.mob_type',
            'label' => 'Mob Type',
            'provider' => 'checkoutProvider',
            'visible' => true,
            'validation' => ['required-entry' => true],
            'sortOrder' => 150,
            'id' => 'drop-down',
            'options' => [
                [
                    'value' => 'local',
                    'label' => 'Local',
                ],
                [
                    'value' => 'vip',
                    'label' => 'VIP',
                ]
            ]
        ];

        $jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['shippingAddress']['children']['shipping-address-fieldset']['children'][$customAttributeCode] = $customField;

        return $jsLayout;
    }
}

Bildbeschreibung hier eingeben

etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Checkout\Model\ShippingInformationManagement">
        <plugin name="save_custom_field" type="Namespace\CustomModule\Plugin\Checkout\SaveAddressInformation" />
    </type>

</config>

SaveAddressInformation.php

class SaveAddressInformation
{
    protected $quoteRepository;
    public function __construct(
        \Magento\Quote\Model\QuoteRepository $quoteRepository
    ) {
        $this->quoteRepository = $quoteRepository;
    }
    /**
     * @param \Magento\Checkout\Model\ShippingInformationManagement $subject
     * @param $cartId
     * @param \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
     */
    public function beforeSaveAddressInformation(
        \Magento\Checkout\Model\ShippingInformationManagement $subject,
        $cartId,
        \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
    ) {
        $shippingAddress = $addressInformation->getShippingAddress();
    $shippingAddressExtensionAttributes = $shippingAddress->getExtensionAttributes();
    if ($shippingAddressExtensionAttributes) {
        $customField = $shippingAddressExtensionAttributes->getMobType();
        $shippingAddress->setMobType($customField);
    }

    }
}

Bildbeschreibung hier eingeben Refe Extension

Das obige Plugin funktioniert einwandfrei und speichert die Werte in der Tabelle quote_address. Ich möchte auch benutzerdefinierte Attribute in der Bestellansicht und der E-Mail-Vorlage anzeigen. Jeder hat eine Idee, was mit dem Code nicht stimmt. Danke im Voraus

Magento2 Entwickler
quelle
Ihr Beispiel funktioniert nicht in Magento2.2.3
Jigs Parmar
Teile
Wie kann ich eine E-Mail-ID erhalten, wenn der Check-
out für
Objekt zitieren und bestellen
zurücksenden

Antworten:

4

Navigieren Sie zur Systemkonfiguration

Stores -> Configuration -> Customers -> Customer Configuration -> Address Templates

Deaktivieren Sie unter Adressvorlagen, HTML-Abschnitt suchen das Kontrollkästchen Systemwert, und fügen Sie folgenden Code hinzu. Sie können bei Bedarf einen Attributcode ändern.

Für die E-Mail-Vorlage funktioniert dasselbe Adressformat [HTML-Adressformat].

{{depend mob_type}}Mob_Type: {{var mob_type}}{{/depend}}

Ausführen, php bin/magento cache:cleanwenn nicht angezeigt.

Ein Attribut wird auch auf der Bestellansichtsseite und der Bestell-E-Mail angezeigt.

Die obige Adresse wird in beiden Adressen angezeigt, aber wenn Sie nur im Versand anzeigen möchten, müssen Sie nur den SMS-Wert in die Versandadressentabelle ( sales_order_address and quote_address) eingeben, damit die Abrechnung funktioniert. Genießen

Tabellenansicht -

Bildbeschreibung hier eingeben

Ergebnis -

Bildbeschreibung hier eingeben

Japs M2 Entwickler
quelle
wie kann ich nur bei versandadresse sparen?
Magento2 Devloper
Sie müssen das Ereignis hinzufügen. oder dies könnte nützlich sein - magento.stackexchange.com/questions/138902/…
Japs M2 Developer
4

Versuche es mit meinem Ansatz. Berücksichtigung Modul wie in der Frage beschrieben.

  1. Verwendet das gleiche Modul wie in der Frage. Keine Änderung

  2. Installierte Referenzerweiterung, auf die Sie verweisen (SMS-Erweiterung)

Navigieren Sie zur Systemkonfiguration

Stores -> Konfiguration -> Kunden -> Kundenkonfiguration -> Adressvorlagen

Deaktivieren Sie unter Adressvorlagen, HTML-Abschnitt suchen das Kontrollkästchen Systemwert, und fügen Sie folgenden Code hinzu. Sie können bei Bedarf einen Attributcode ändern.

Für die E-Mail-Vorlage funktioniert dasselbe Adressformat [HTML-Adressformat].

{{depend mob_type}}Mob_Type: {{var mob_type}}{{/depend}}

Bildbeschreibung hier eingeben

Möglicherweise muss der Cache geleert werden.

Ausführen, php bin/magento cache:cleanwenn nicht angezeigt

Ein Attribut wird auch auf der Bestellansichtsseite und der Bestell-E-Mail angezeigt.

Bildbeschreibung hier eingeben

Sandip
quelle
Vielen Dank für Ihre Antwort. Wie verwalten wir die Anzeige nur im Versandadressbereich?
Magento2 Devloper
Möglicherweise müssen Sie mehr Systemkonfiguration erstellen, nur für die Versandadresse als html_for_shipping. Magento/sales/view/adminhtml/templates/order/view/info.phtmlfinden Sie unter $block->getFormattedAddress( $order->getShippingAddress() );Zeilenwechsel zu $block->getFormattedShippingAddress( $order->getShippingAddress() );In info.phpDatei. Sie können eine neue Methode nur für die Versandadressenformatierung erstellen. Sie können den Parameter der Formatmethode 'html' in 'html_for_shipping' ändern, wobei 'html_for_shipping' Ihr neuer Systemkonfigurationswert für das Versandadressenformat ist.
Sandip
plötzlich funktioniert es nicht mehr. zeige mich nicht über SMS-Details in der Reihenfolge. irgendeine Idee?
Magento2 Devloper
Ich habe versucht, diese @ sandip..Aber es wird nicht angezeigt .... Bitte helfen Sie mir
Vishali Mariappan
3

Wenn das Attribut korrekt gespeichert wurde, müssen Sie das Attribut zu Adressvorlagen hinzufügen. Diese finden Sie in

Stores -> Konfiguration -> Kunden -> Kundenkonfiguration -> Adressvorlagen

Sie können am Ende etwas hinzufügen wie:

{{depend mob_type}}, Mob. Type: {{var mob_type}}{{/depend}}

Abhängig vom Vorlagentyp können Sie <br/>neue Linien erstellen.

Langley
quelle
Ich möchte nur die Lieferadresse anzeigen und wie kann ich das auch auf der Bestellansichtsseite verwalten?
Magento2 Devloper
Diese Vorlagen werden überall verwendet. Frontend, Backend, PDF, E-Mail ... Wenn das Attribut nur in der Lieferadresse gespeichert ist, wird es nur dort angezeigt
Langley
ok, lass es mich überprüfen
Magento2 Devloper
Funktioniert nicht. nirgendwo anzeigen. - nimb.ws/9cnpHW
Magento2 Devloper
Hallo @Langley, danke für die Antwort. Ich erhalte diese nur in der Rechnungsadresse und nicht in der Lieferadresse. Ich möchte sie an beiden Stellen anzeigen.
Shivashankar m
2

Ich würde das so machen: Füge es dem quoteund hinzu sales_orderund bearbeite die Daten von dort mit dem folgenden Code

namespace Vendor\Module\Setup;

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;

class UpgradeSchema implements UpgradeSchemaInterface
{
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        $quoteAddressTable = 'quote';
        $orderTable = 'sales_order';

        //Quote address table
        $setup->getConnection()
            ->addColumn(
                $setup->getTable($quoteAddressTable),
                'mob_type',
                [
                    'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                    'length' => 255,
                    'comment' =>'Mob type'
                ]
            );
        //Order address table
        $setup->getConnection()
            ->addColumn(
                $setup->getTable($orderTable),
                'mob_type',
                [
                    'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                    'length' => 255,
                    'comment' =>'Mob type'

                ]
            );

        $setup->endSetup();
    }
}

AKTUALISIEREN

Erstellen Sie ein Mixing wie folgt:

im requirejs-config.js

var config = {
    config: {
        mixins: {
            'Magento_Checkout/js/action/set-shipping-information': {
                '<YourNamespace_YourModule>/js/action/set-shipping-information-mixin': true
            }
        }
    }
};

das set-shipping-information-mixin.js

/*jshint browser:true jquery:true*/
/*global alert*/
define([
    'jquery',
    'mage/utils/wrapper',
    'Magento_Checkout/js/model/quote'
], function ($, wrapper, quote) {
    'use strict';

    return function (setShippingInformationAction) {

        return wrapper.wrap(setShippingInformationAction, function (originalAction) {
            var shippingAddress = quote.shippingAddress();
            if (shippingAddress['extension_attributes'] === undefined) {
                shippingAddress['extension_attributes'] = {};
            }

            shippingAddress['extension_attributes']['custom_field'] = shippingAddress.customAttributes['custom_field'];
            // pass execution to original action ('Magento_Checkout/js/action/set-shipping-information')
            return originalAction();
        });
    };
});

Außerdem solltest du einen extension_attributes.xmlin Your_Module/etc/mit folgendem Code haben

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
    <extension_attributes for="Magento\Quote\Api\Data\AddressInterface">
        <attribute code="custom_field" type="string" />
    </extension_attributes>
</config>

Nehmen Sie bei Bedarf Änderungen vor (Attributcode, Typ usw.). Dadurch wird Ihr benutzerdefiniertes Attribut zu den Versandinformationen hinzugefügt

Vlad Patru
quelle
aber wie diese Felddaten in der Tabelle speichern können Sie bitte Code teilen? danke
Magento2 Devloper
Kannst du mir zeigen, wie du dein Plugin in der di.xmlDatei definiert hast ?
Vlad Patru
Überprüfen Sie, ob ich die Feldcode-Speicherung aktualisiert habe und sie funktioniert. Wie wird sie im Adressbereich der Bestellung angezeigt?
Magento2 Devloper
danke für das update aber schau mal meine obige frage. Speichern Sie erledigte Dinge, aber nicht in der Bestellansicht und der E-Mail-Vorlage. danke
Magento2 Devloper
Die Felder dort werden mit der getShippingAddress()Funktion angezeigt, die alle Felder auf die Adresse selbst setzt. Deshalb habe ich diesen Code hinzugefügt. Er sollte Ihr Attribut der Versandadresse selbst hinzufügen
Vlad Patru