如何在“管理员送货地址”框中显示自定义属性?


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

    }
}

在此处输入图片说明 引用扩展

上面的插件工作正常,并将值保存在quote_address表中。我也想在订单视图页面和电子邮件模板中显示自定义属性。任何人都知道代码有什么问题。提前致谢



您的示例在magento2.2.3中不起作用
Parmar,

分享您的问题,以便我检查一下
Magento2 Devloper 18-4-27

启用访客结帐功能后,我如何获取电子邮件ID
Ketan Borada

报价和订购对象将其退回
Magento2 Devloper'Aug

Answers:


4

导航到系统配置

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

在地址模板的“查找HTML”部分中,取消选中复选框系统值,添加以下代码。您可以根据需要更改属性代码。

对于电子邮件模板,相同的地址格式[HTML地址格式]将起作用。

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

php bin/magento cache:clean如果未显示,请运行。

属性将显示在订单视图页面上,同时还将显示订单电子邮件。

上面的地址都显示在两个地址中,但是如果您只想在运输中显示,则只需在运输地址表(sales_order_address and quote_address)中放入SMS值,而不用开票即可。请享用

表格检视-

在此处输入图片说明

结果-

在此处输入图片说明


如何仅保存在收货地址中?
Magento2 Devloper

您需要添加事件。或这一个可以是有用的- magento.stackexchange.com/questions/138902/...
日本人m2显影剂

实际上,这不适用于我的情况,我不了解变量如何引用已保存在quote_address和sales_order_address表中的扩展名attrbute。似乎我需要覆盖两个info.phtml模板
hkguile

4

试试我的方法。考虑问题中所述的模块。

  1. 使用了问题中显示的相同模块。不用找了

  2. 您要参考的已安装参考扩展(SMS扩展)

导航到系统配置

商店->配置->客户->客户配置->地址模板

在地址模板的“查找HTML”部分中,取消选中复选框系统值,添加以下代码。您可以根据需要更改属性代码。

对于电子邮件模板,相同的地址格式[HTML地址格式]将起作用。

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

在此处输入图片说明

可能需要清除缓存。

php bin/magento cache:clean如果未显示则运行

属性将显示在订单视图页面上,同时还将显示订单电子邮件。

在此处输入图片说明


谢谢您的回答。我们如何管理仅在收货地址区域显示?
Magento2 Devloper

您可能需要创建更多的系统配置,而送货地址只能是html_for_shippingMagento/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

突然不起作用。不能按顺序在SMS详细信息上方显示我。任何想法?
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谢谢您的回答,我仅在帐单地址中显示此信息,而不在收货地址中显示它,我想在两个地方都显示它。
shivashankar m

2

我将这样做:将其添加到中quotesales_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.xmlYour_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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.