Jak wyświetlić niestandardowy atrybut w polu Administracyjny adres wysyłki?

13

Dodałem rozwijane pole niestandardowe na stronie kasy z wartościami niestandardowymi. Działa dobrze, a także zapisuje wartości atrybutów w bazie danych, ale nie wyświetla się w adresie wysyłki zamówienia. Masz pomysł, jak to pokazać?

wprowadź opis zdjęcia tutaj

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();

Podłącz

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;
    }
}

wprowadź opis zdjęcia tutaj

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);
    }

    }
}

wprowadź opis zdjęcia tutaj Rozszerzenie Refe

Powyższa wtyczka działa dobrze i zapisuje wartości w tabeli quote_address. Chcę również wyświetlić niestandardowy atrybut w widoku strony i szablonie wiadomości e-mail. Każdy ma pojęcie, co jest nie tak z kodem. Z góry dziękuję

Magento2 Devloper
źródło
twój przykład nie działa w magento2.2.3
Jigs Parmar
dzielić swój problem, więc mogę to sprawdzić
Magento2 Devloper
w jaki sposób mogę uzyskać identyfikator e-mail, gdy jest włączona obsługa
płatności dla
wyceń

Odpowiedzi:

4

Przejdź do konfiguracji systemu

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

Z szablonów adresów, sekcji Znajdź HTML, odznacz wartość systemową pola wyboru, dodaj następujący kod. w razie potrzeby możesz zmienić kod atrybutu.

W przypadku szablonu wiadomości e-mail działa ten sam format adresu [Format adresu HTML].

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

Uruchom, php bin/magento cache:cleanjeśli nie pokazuje.

Atrybut pojawi się na stronie widoku zamówienia i e-mailu zamówienia.

powyższe jest wyświetlane w obu adresach, ale jeśli chcesz wyświetlać tylko w wysyłce, musisz wstawić tylko wartość SMS w tabeli adresów wysyłki ( sales_order_address and quote_address), aby nie naliczać opłat, działa poprawnie. Cieszyć się

Widok tabeli -

wprowadź opis zdjęcia tutaj

Wynik -

wprowadź opis zdjęcia tutaj

Japs M2 Developer
źródło
jak mogę zapisać tylko w adresie wysyłki?
Magento2 Devloper
musisz dodać wydarzenie. lub ten może być przydatny - magento.stackexchange.com/questions/138902/...
Japs M2 Developer
Właściwie to nie działa w moim przypadku, nie rozumiem, jak zmienna może odnosić się do rozszerzenia attrbute, które już zostało zapisane w tabeli quote_address & sales_order_address. Wydaje się, że muszę zastąpić dwa szablony
info.phtml
4

Spróbuj z moim podejściem. Biorąc pod uwagę moduł opisany w pytaniu.

  1. Użyłem tego samego modułu pokazanego w pytaniu. brak zmiany

  2. Zainstalowane rozszerzenie referencyjne, którego dotyczysz (rozszerzenie SMS)

Przejdź do konfiguracji systemu

Sklepy -> Konfiguracja -> Klienci -> Konfiguracja klienta -> Szablony adresów

Z szablonów adresów, sekcji Znajdź HTML, odznacz wartość systemową pola wyboru, dodaj następujący kod. w razie potrzeby możesz zmienić kod atrybutu.

W przypadku szablonu wiadomości e-mail ten sam format adresu [format adresu HTML] będzie działał.

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

wprowadź opis zdjęcia tutaj

może być wymagane do wyczyszczenia pamięci podręcznej.

Uruchom, php bin/magento cache:cleanjeśli nie pokazuje

Atrybut pojawi się na stronie widoku zamówienia i e-mailu zamówienia.

wprowadź opis zdjęcia tutaj

sandip
źródło
Dziękuję za Twoją odpowiedź. jak zarządzamy wyświetlaniem tylko w obszarze adresu wysyłki?
Magento2 Devloper
może być konieczne utworzenie większej konfiguracji systemu, dla adresu wysyłki tylko jako html_for_shipping. Magento/sales/view/adminhtml/templates/order/view/info.phtml, znajdź poniżej $block->getFormattedAddress( $order->getShippingAddress() );zmiany linii na $block->getFormattedShippingAddress( $order->getShippingAddress() );W info.phppliku, możesz utworzyć nową metodę tylko dla formatowania adresu wysyłki. Możesz zmienić parametr metody formatu „html” na „html_for_shipping”, gdzie „html_for_shipping” będzie nową wartością konfiguracji systemu dla formatu adresu wysyłki.
sandip
nagle to nie działa. nie wyświetlaj mnie powyżej szczegółów SMS w kolejności. dowolny pomysł?
Magento2 Devloper
Próbowałem tego @ sandip..Ale to się nie wyświetla .... Proszę o pomoc
Vishali Mariappan,
3

Jeśli atrybut jest zapisany poprawnie, musisz dodać atrybut do szablonów adresów. Można je znaleźć w

Sklepy -> Konfiguracja -> Klienci -> Konfiguracja klienta -> Szablony adresów

Możesz dodać na końcu coś takiego:

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

W zależności od typu szablonu można użyć <br/>do utworzenia nowych linii.

Langley
źródło
Chcę wyświetlać tylko adres wysyłki i jak mogę zarządzać również na stronie widoku zamówienia?
Magento2 Devloper
Te szablony są używane wszędzie. Frontend, backend, pdf, e-maile ... Jeśli atrybut jest zapisany tylko w adresie wysyłkowym, to wyświetli się tylko tam
Langley
ok, pozwól mi to sprawdzić
Magento2 Devloper
Nie działa. nigdzie się nie wyświetla. - nimb.ws/9cnpHW
Magento2 Devloper
Cześć @ Langley Dzięki za odpowiedź, dostaję to tylko na adres rozliczeniowy, nie wyświetlając go w adresie wysyłkowym, chcę wyświetlić go w obu miejscach.
shivashankar m
2

Zrobiłbym to w ten sposób: dodaj go do quotei sales_orderdziałaj dane stamtąd użyj następującego kodu (spróbuj także użyć skryptów UpgradeSchema, jeśli chcesz zaktualizować istniejącą tabelę DB, w nowych tabelach DB należy użyć InstallSchema)

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();
    }
}

AKTUALIZACJA

Utwórz mixin js w następujący sposób:

w requirejs-config.js

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

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();
        });
    };
});

Ponadto należy mieć extension_attributes.xmlna Your_Module/etc/z następującym kodem

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

w razie potrzeby wprowadź zmiany (kod atrybutu, typ itp.), aby dodać niestandardowy atrybut do informacji o wysyłce

Vlad Patru
źródło
ale jak zapisać dane tego pola w tabeli, czy możesz udostępnić kod? dzięki
Magento2 Devloper
czy możesz mi pokazać, jak zdefiniowałeś wtyczkę w di.xmlpliku?
Vlad Patru,
sprawdź zaktualizowałem, zapisz kod pola i działa dobrze, ale jak wyświetlić, aby zamówić adres wysyłki?
Magento2 Devloper
dzięki za aktualizację, ale spójrz na moje powyższe pytanie. zapisz rzeczy zrobione, ale nie będą wyświetlane w widoku zamówienia i szablonie wiadomości e-mail. dzięki
Magento2 Devloper
pola są wyświetlane z getShippingAddress()funkcją, która ustawia wszystkie pola ustawione na sam adres, dlatego dodałem ten kod, powinien on dodać twój atrybut do samego adresu wysyłki
Vlad Patru