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


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

Підключати

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

Вище плагін працює добре і зберігає значення в таблиці quo_address. Я хочу показати спеціальний атрибут для того, щоб переглянути сторінку сторінки та шаблон електронної пошти. У кожного є уявлення, що не так з кодом. Спасибі заздалегідь



Ваш приклад не працює в magento2.2.3
Джиги Пармар

поділіться своєю проблемою, щоб я міг її перевірити
Magento2 Devloper

Як я можу отримати ідентифікатор електронної пошти, коли
включена

Відповіді:


4

Перейдіть до Конфігурація системи

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

З шаблонів адрес, знайдіть розділ HTML, зніміть прапорець у системному значенні, додайте наступний код. Ви можете змінити код атрибута, якщо це потрібно.

Для шаблону електронної пошти працюватиме той самий формат адреси [формат HTML-адреси].

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

Запустити, php bin/magento cache:cleanякщо не показує.

Атрибут відображатиметься також на сторінці перегляду замовлення та електронному листі замовлення.

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

Перегляд таблиці -

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

Результат -

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


як я можу зберегти лише адресу доставки?
Magento2 Devloper

вам потрібно додати подію. або це може бути корисним - magento.stackexchange.com/questions/138902/…
M2 Developer

Насправді це не працює для мого випадку, я не розумію, як змінна може посилатися на attrbute розширення, яка вже збережена в таблиці quo_address & sales_order_address. Здається, мені потрібно змінити два шаблони
info.phtml

4

Спробуйте з моїм підходом. Враховуючи модуль, як описано в питанні.

  1. Використовували той самий модуль, який відображається у питанні. без змін

  2. Встановлене розширення посилання, на яке ви посилаєтесь (розширення SMS)

Перейдіть до Конфігурація системи

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

З шаблонів адрес, знайдіть розділ HTML, зніміть прапорець у системному значенні, додайте наступний код. Ви можете змінити код атрибута, якщо це потрібно.

Для шаблону електронної пошти буде працювати той самий формат адреси [формат HTML-адреси].

{{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' буде вашим новим значенням конфігурації системи для формату адреси доставки.
пісок

раптом це не працює. не відображати мене над реквізитами SMS для порядку. будь-яка ідея?
Magento2 Devloper

Я спробував це @ sandip .. Але це не відображається .... Будь ласка, допоможіть мені
Vishali Mariappan

3

Якщо атрибут збережено правильно, вам потрібно додати атрибут до шаблонів адрес. Їх можна знайти в

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

Ви можете додати наприкінці щось на кшталт:

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

Залежно від типу шаблону, ви можете використовувати <br/>для створення нових рядків.


Я хочу відображати лише адресу доставки, і як я можу керувати також на сторінці перегляду замовлення?
Magento2 Devloper

Ці шаблони використовуються всюди. Frontend, бекенд, 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();
    }
}

ОНОВЛЕННЯ

Створіть mixin 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()функцію, яка отримує всі поля, встановлені на саму адресу, ось чому я додав цей код, він повинен додати ваш атрибут до самої адреси доставки
Влад Патру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.