Làm cách nào để hiển thị một thuộc tính tùy chỉnh trong hộp Địa chỉ giao hàng của quản trị viên?


13

Tôi đã thêm trường tùy chỉnh thả xuống trên trang thanh toán với các giá trị tùy chỉnh. Nó hoạt động tốt cũng lưu các giá trị thuộc tính trong cơ sở dữ liệu nhưng không hiển thị trong địa chỉ giao hàng. Bất kỳ ý tưởng làm thế nào để hiển thị nó?

nhập mô tả hình ảnh ở đây

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

Cắm vào

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

nhập mô tả hình ảnh ở đây

vv / 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>

SaveAddressIn information.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);
    }

    }
}

nhập mô tả hình ảnh ở đây Gia hạn giới thiệu

Plugin trên đang hoạt động tốt và lưu các giá trị trong bảng quote_address. Tôi cũng muốn hiển thị thuộc tính tùy chỉnh trong trang xem thứ tự và mẫu email. Mọi người có ý tưởng gì về mã sai. Cảm ơn trước



ví dụ của bạn không hoạt động trong magento2.2.3
Jigs Parmar

chia sẻ vấn đề của bạn để tôi có thể kiểm tra nó
Magento2 Devloper

Làm cách nào tôi có thể nhận được email id khi bật tính năng kiểm tra khách
Ketan Borada

trích dẫn và đặt hàng đối tượng trả lại
Magento2 Devloper

Câu trả lời:


4

Điều hướng đến cấu hình hệ thống

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

Từ Mẫu Địa chỉ, Tìm phần HTML, bỏ chọn giá trị hệ thống hộp kiểm, thêm mã sau đây. bạn có thể thay đổi mã thuộc tính nếu cần.

Đối với mẫu email, cùng định dạng địa chỉ [Định dạng địa chỉ HTML] sẽ hoạt động.

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

Chạy php bin/magento cache:cleannếu không hiển thị.

Một thuộc tính sẽ hiển thị tại trang xem đơn hàng và email đặt hàng.

ở trên được hiển thị trong cả hai địa chỉ nhưng nếu bạn chỉ muốn hiển thị trong giao hàng thì bạn chỉ cần đặt giá trị SMS vào bảng địa chỉ giao hàng ( sales_order_address and quote_address) không thanh toán, nó hoạt động tốt. Thưởng thức

Bảng xem -

nhập mô tả hình ảnh ở đây

Kết quả -

nhập mô tả hình ảnh ở đây


Làm thế nào tôi có thể chỉ lưu trong địa chỉ giao hàng?
Magento2 Devloper

bạn cần thêm sự kiện hoặc cái này có thể hữu ích - magento.stackexchange.com/questions/138902/iêu
Nhà phát triển Japs M2

4

Hãy thử với cách tiếp cận của tôi. Cân nhắc mô-đun như mô tả trong câu hỏi.

  1. Được sử dụng cùng một mô-đun hiển thị trong câu hỏi. không thay đổi

  2. Cài đặt tiện ích mở rộng tham chiếu mà bạn đang giới thiệu (tiện ích mở rộng SMS)

Điều hướng đến cấu hình hệ thống

Cửa hàng -> Cấu hình -> Khách hàng -> Cấu hình khách hàng -> Mẫu địa chỉ

Từ Mẫu Địa chỉ, Tìm phần HTML, bỏ chọn giá trị hệ thống hộp kiểm, thêm mã sau đây. bạn có thể thay đổi mã thuộc tính nếu cần.

Đối với mẫu email, cùng định dạng địa chỉ [Định dạng địa chỉ HTML] sẽ hoạt động.

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

nhập mô tả hình ảnh ở đây

có thể được yêu cầu để xóa bộ nhớ cache.

Chạy php bin/magento cache:cleannếu không hiển thị

Một thuộc tính sẽ hiển thị tại trang xem đơn hàng và email đặt hàng.

nhập mô tả hình ảnh ở đây


Cảm ơn về câu trả lời của bạn. Làm thế nào chúng ta quản lý chỉ hiển thị trong khu vực địa chỉ vận chuyển?
Magento2 Devloper

bạn có thể phải tạo thêm cấu hình hệ thống, chỉ cho địa chỉ giao hàng html_for_shipping. Magento/sales/view/adminhtml/templates/order/view/info.phtml, tìm dòng dưới đây $block->getFormattedAddress( $order->getShippingAddress() );thay đổi thành $block->getFormattedShippingAddress( $order->getShippingAddress() );Trong info.phptệp, bạn chỉ có thể tạo phương thức mới để định dạng địa chỉ giao hàng. Bạn có thể thay đổi tham số của phương thức định dạng 'html' thành 'html_for_shipping', trong đó 'html_for_shipping' sẽ là giá trị cấu hình hệ thống mới của bạn cho định dạng địa chỉ giao hàng.
Sandip

đột nhiên nó không hoạt động. không hiển thị cho tôi chi tiết SMS theo thứ tự. bất kỳ ý tưởng?
Magento2 Devloper

Tôi đã thử cái này @ sandip..Nhưng nó không được hiển thị .... Xin hãy giúp tôi
Vishali Mariappan

3

Nếu thuộc tính được lưu chính xác, bạn cần thêm thuộc tính vào mẫu địa chỉ. Đây có thể được tìm thấy trong

Cửa hàng -> Cấu hình -> Khách hàng -> Cấu hình khách hàng -> Mẫu địa chỉ

Bạn có thể thêm vào cuối một cái gì đó như:

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

Tùy thuộc vào loại mẫu, bạn có thể sử dụng <br/>để tạo dòng mới.


Tôi muốn chỉ hiển thị địa chỉ giao hàng và làm cách nào tôi có thể quản lý trên trang xem đơn hàng?
Magento2 Devloper

Các mẫu này được sử dụng ở mọi nơi. Frontend, backend, pdf, email ... Nếu thuộc tính chỉ được lưu trong địa chỉ giao hàng thì nó sẽ chỉ hiển thị ở đó
Langley

ok, để tôi kiểm tra xem
Magento2 Devloper

Không làm việc. không hiển thị ở bất cứ đâu. - nimb.ws/9cnpHW
Magento2 Devloper

Xin chào @Langley Cảm ơn câu trả lời, tôi chỉ nhận được điều này trong địa chỉ thanh toán không hiển thị trong địa chỉ giao hàng, tôi muốn hiển thị nó ở cả hai nơi.
shivashankar m

2

Tôi sẽ làm như thế này: thêm nó vào quotesales_orderxử lý dữ liệu từ đó bằng cách sử dụng đoạn mã sau (cũng thử sử dụng các kịch bản nâng cấp nếu bạn cần cập nhật bảng DB hiện có, nên sử dụng InstallSchema cho các bảng DB mới)

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

CẬP NHẬT

Tạo một mixin js như sau:

trong requirejs-config.js

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

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

Ngoài ra, bạn nên có một extension_attributes.xmltrong Your_Module/etc/với mã sau đây

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

thực hiện thay đổi khi cần thiết (mã thuộc tính, loại, v.v. điều này sẽ thêm thuộc tính tùy chỉnh của bạn vào thông tin giao hàng


Nhưng làm thế nào để lưu dữ liệu trường này trong bảng, bạn có thể vui lòng chia sẻ mã không? cảm ơn
Magento2 Devloper

bạn có thể chỉ cho tôi cách bạn xác định plugin của mình trong di.xmltệp không?
Vlad Patru

kiểm tra Tôi đã cập nhật lưu mã trường và hoạt động tốt nhưng làm thế nào để hiển thị theo thứ tự khu vực địa chỉ giao hàng?
Magento2 Devloper

cảm ơn đã cập nhật nhưng xem câu hỏi trên của tôi lưu những thứ được thực hiện nhưng không hiển thị trên giao diện đặt hàng và mẫu email. cảm ơn
Magento2 Devloper

các trường có hiển thị với getShippingAddress()chức năng nhận tất cả các trường được đặt thành địa chỉ, đó là lý do tại sao tôi đã thêm mã này, nó sẽ thêm thuộc tính của bạn vào chính địa chỉ giao hàng
Vlad Patru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.