Как отобразить пользовательский атрибут в поле Адреса доставки администратора?

13

Я добавил раскрывающееся пользовательское поле на странице оформления заказа с пользовательскими значениями. Работает нормально, также сохраняет значения атрибутов в базе данных, но не отображает их в адресе доставки заказа. Есть идеи как это показать?

введите описание изображения здесь

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

введите описание изображения здесь

и т.д. / 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);
    }

    }
}

введите описание изображения здесь Refe Extension

Выше плагин работает нормально и сохраняет значения в таблице quote_address. Я хочу отобразить пользовательский атрибут на странице просмотра заказа и шаблон электронной почты также. У каждого есть идея, что не так с кодом. заранее спасибо

Magento2 Devloper
источник
Ваш пример не работает в magento2.2.3
Джиги Пармар
поделитесь своей проблемой, чтобы я мог ее проверить
Magento2 Devloper
Как я могу получить идентификатор электронной почты, когда
включена
цитата и объект заказа возвращают его
Magento2 Devloper

Ответы:

4

Перейдите к Конфигурации системы

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

Из шаблонов адресов, раздела «Найти HTML», снимите флажок «системное значение» и добавьте следующий код. Вы можете изменить код атрибута, если это необходимо.

Для шаблона электронной почты будет работать тот же формат адреса [HTML Address format].

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

Беги php bin/magento cache:cleanесли не показывает.

Атрибут будет отображаться на странице просмотра заказа и электронной почте заказа.

выше отображается в обоих адресах, но если вы хотите показать только при доставке, то вам нужно указать только значение SMS в таблице адресов доставки ( sales_order_address and quote_address), не считая, что он работает нормально. наслаждаться

Представление таблицы -

введите описание изображения здесь

Результат -

введите описание изображения здесь

Japs M2 Developer
источник
как сохранить только в адресе доставки?
Magento2 Devloper
вам нужно добавить событие. или это один может быть полезно - magento.stackexchange.com/questions/138902/...
япошки М2 Разработчик
На самом деле это не работает для моего случая, я не понимаю, как переменная может ссылаться на расширение attrbute, которое уже было сохранено в таблице quote_address & sales_order_address. Кажется, мне нужно переопределить два шаблона
info.phtml
4

Попробуйте с моим подходом. Принимая во внимание модуль, как описано в вопросе.

  1. Использовал тот же модуль, показанный в вопросе. без изменений

  2. Установленное ссылочное расширение, на которое вы ссылаетесь (расширение SMS)

Перейдите к Конфигурации системы

Магазины -> Конфигурация -> Клиенты -> Конфигурация клиента -> Шаблоны адресов

Из шаблонов адресов, раздела «Найти HTML», снимите флажок «системное значение» и добавьте следующий код. Вы можете изменить код атрибута, если это необходимо.

Для шаблона электронной почты будет работать тот же формат адреса [HTML Address format].

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

введите описание изображения здесь

может потребоваться очистить кеш.

Беги php bin/magento cache:cleanесли не показывает

Атрибут будет отображаться на странице просмотра заказа и электронной почте заказа.

введите описание изображения здесь

Сандип
источник
Спасибо за ваш ответ. как нам управлять отображением только в адресной области доставки?
Magento2 Devloper
Возможно, вам придется создать больше конфигурации системы, для адреса доставки только как html_for_shipping. Magento/sales/view/adminhtml/templates/order/view/info.phtml, Найти ниже линии $block->getFormattedAddress( $order->getShippingAddress() );изменения в $block->getFormattedShippingAddress( $order->getShippingAddress() );В info.phpфайл, вы можете создать новый метод только для отправки адреса форматирования. Вы можете изменить параметр метода формата «html» на «html_for_shipping», где «html_for_shipping» будет вашим новым значением конфигурации системы для формата адреса доставки.
Sandip
вдруг это не работает. не показывать мне выше смс детали в порядке. любая идея?
Magento2 Devloper
Я пробовал это @ sandip .. Но это не отображается .... Пожалуйста, помогите мне
Vishali Mariappan
3

Если атрибут сохранен правильно, вам нужно добавить атрибут в шаблоны адресов. Их можно найти в

Магазины -> Конфигурация -> Клиенты -> Конфигурация клиента -> Шаблоны адресов

Вы можете добавить в конце что-то вроде:

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

В зависимости от типа шаблона вы можете использовать <br/>для создания новых строк.

Лэнгли
источник
Я хочу отображать только адрес доставки и как я могу управлять также на странице просмотра заказа?
Magento2 Devloper
Эти шаблоны используются везде. Интерфейс, бэкэнд, pdf, электронная почта ... Если атрибут сохраняется только в адресе доставки, он будет отображаться только там
Langley
хорошо, позвольте мне проверить это
Magento2 Devloper
Не работает. не показывать нигде. - nimb.ws/9cnpHW
Magento2 Devloper
Привет @Langley Спасибо за ответ, я получаю это только по адресу выставления счета, не показывая это в адресе доставки, я хочу показать это в обоих местах.
Шивашанкар м
2

Я бы сделал это следующим образом: добавьте его в quoteи sales_orderи обработайте данные оттуда, используя следующий код (также попробуйте использовать сценарии UpgradeSchema, если вам нужно обновить существующую таблицу БД, 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();
    }
}

ОБНОВИТЬ

Создайте миксин js следующим образом:

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

Также вы должны иметь extension_attributes.xmlв Your_Module/etc/со следующим кодом

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

вносите изменения в случае необходимости (код атрибута, тип и т. д.), чтобы добавить пользовательский атрибут к информации о доставке

Влад Патру
источник
а как сохранить данные этого поля в таблице можете поделиться кодом? спасибо
Magento2 Devloper
Можете ли вы показать мне, как вы определили свой плагин в di.xmlфайле?
Влад Патру
проверьте, что я обновил код сохранения поля и работает нормально, но как отобразить в области адреса доставки заказа?
Magento2 Devloper
спасибо за обновление, но посмотрите мой вопрос выше. сохранить вещи, но не отображать в представлении заказа и шаблоне электронной почты. Благодарность
Magento2 Devloper
поля там показывают с getShippingAddress() функцией, которая получает все поля, установленные для самого адреса, поэтому я добавил этот код, он должен добавить ваш атрибут к самому адресу доставки
Vlad Patru