Como mostrar um atributo personalizado na caixa Endereço de entrega do administrador?

13

Adicionei o campo personalizado suspenso na página de check-out com valores personalizados. Ele está funcionando bem e também salva os valores dos atributos no banco de dados, mas não é exibido no endereço de entrega do pedido. Alguma idéia de como mostrá-lo?

insira a descrição da imagem aqui

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

Plugar

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

insira a descrição da imagem aqui

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

    }
}

insira a descrição da imagem aqui Extensão Refe

O plug-in acima está funcionando bem e salve os valores na tabela quote_address. Quero exibir o atributo personalizado também na página de exibição de pedidos e no modelo de email. Alguém tem uma idéia do que há de errado com o código. desde já, obrigado

Magento2 Devloper
fonte
o seu exemplo não funcionar em magento2.2.3
Jigs Parmar
compartilhar o seu problema para que eu possa verificá-lo
Magento2 Devloper
Como posso obter id e-mail quando check-out convidado é permitir
Ketan Borada
citar e retorno objeto encomendá-lo
Magento2 Devloper

Respostas:

4

Navegue para a configuração do sistema

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

Na seção Modelos de Endereço, Localizar HTML, desmarque o valor do sistema da caixa de seleção e adicione o seguinte código. você pode alterar um código de atributo, se necessário.

Para o modelo de email, o mesmo formato de endereço [formato de endereço HTML] funcionará.

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

Execute php bin/magento cache:cleanse não aparecer.

Um atributo será exibido na página de visualização do pedido e no email do pedido também.

acima é exibido nos dois endereços, mas se você deseja exibir apenas na remessa, é necessário inserir apenas o valor SMS na tabela de endereços de remessa ( sales_order_address and quote_address), para que a cobrança não funcione corretamente. Desfrutar

Vista de mesa -

insira a descrição da imagem aqui

Resultado -

insira a descrição da imagem aqui

Japs M2 Developer
fonte
como posso salvar apenas no endereço de entrega?
Magento2 Devloper 10/0318
você precisa adicionar o evento. ou este pode ser útil - magento.stackexchange.com/questions/138902/…
Japs M2 Developer
4

Tente com a minha abordagem. Levando em consideração o módulo conforme descrito na pergunta.

  1. Utilizou o mesmo módulo mostrado na pergunta. nenhuma mudança

  2. Extensão de referência instalada à qual você está se referindo (extensão SMS)

Navegue para a configuração do sistema

Lojas -> Configuração -> Clientes -> Configuração do Cliente -> Modelos de Endereço

Na seção Modelos de Endereço, Localizar HTML, desmarque o valor do sistema da caixa de seleção e adicione o seguinte código. você pode alterar um código de atributo, se necessário.

Para o modelo de email, o mesmo formato de endereço [formato de endereço HTML] funcionará.

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

insira a descrição da imagem aqui

pode ser necessário limpar o cache.

Corre php bin/magento cache:clean se não aparecer

Um atributo será exibido na página de visualização do pedido e no email do pedido também.

insira a descrição da imagem aqui

sandip
fonte
Obrigado pela sua resposta. como gerenciamos a exibição apenas na área de endereço de entrega?
Magento2 Devloper 10/0318
pode ser necessário criar mais configurações do sistema, apenas para o endereço de entrega como html_for_shipping. Magento/sales/view/adminhtml/templates/order/view/info.phtml, localize abaixo da $block->getFormattedAddress( $order->getShippingAddress() );alteração de linha em $block->getFormattedShippingAddress( $order->getShippingAddress() );No info.phparquivo, você pode criar um novo método apenas para a formatação do endereço de entrega. Você pode alterar o parâmetro do método de formato 'html' para 'html_for_shipping', onde 'html_for_shipping' será o novo valor de configuração do sistema para o formato do endereço de entrega.
Sandip
de repente não está funcionando. não me exibir acima dos detalhes do SMS em ordem. qualquer ideia?
Magento2 Devloper
Eu tentei isso @ sandip..But ele não é exibido .... Por favor me ajude
Vishali Mariappan
3

Se o atributo for salvo corretamente, você precisará adicionar o atributo aos modelos de endereço. Estes podem ser encontrados em

Lojas -> Configuração -> Clientes -> Configuração do Cliente -> Modelos de Endereço

Você pode adicionar no final algo como:

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

Dependendo do tipo de modelo, você pode usar <br/>para criar novas linhas.

Langley
fonte
Quero exibir apenas o endereço de entrega e como posso gerenciar também na página de visualização de pedidos?
Magento2 Devloper
Esses modelos são usados ​​em qualquer lugar. Frontend, backend, PDF, e-mails ... Se o atributo é salvo apenas no endereço de entrega, em seguida, ele só irá exibir lá
Langley
ok, deixe-me verificá-lo
Magento2 Devloper
Não está funcionando. não é exibido em nenhum lugar. - nimb.ws/9cnpHW
Magento2 Devloper
Oi @ Langley Obrigado pela resposta, eu estou recebendo isso apenas no endereço de cobrança, não exibi-lo no endereço de entrega, eu quero exibi-lo nos dois lugares.
Shivashankar m
2

Eu faria isso como este: adicioná-lo ao quotee sales_ordere trabalhar os dados de lá utilizar o seguinte código (também tentam usando scripts upgradeSchema se você precisa atualizar a tabela DB existente, InstallSchema deve ser usado para novas tabelas DB)

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

ATUALIZAR

Crie um mixin js da seguinte maneira:

dentro requirejs-config.js

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

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

Além disso, você deve ter um extension_attributes.xmlem Your_Module/etc/com seguinte código

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

faça as alterações necessárias (código de atributo, tipo etc.). Isso adicionará seu atributo personalizado às informações de remessa

Vlad Patru
fonte
mas como salvar esses dados de campo na tabela, você pode compartilhar o código? obrigado
Magento2 Devloper
você pode me mostrar como você definiu seu plugin no di.xmlarquivo?
Vlad Patru
verifique se atualizei o código de campo salvo e estou funcionando bem, mas como exibir na área do endereço de entrega do pedido?
Magento2 Devloper
obrigado pela atualização, mas olha minha pergunta acima. salve o que foi feito, mas não seja exibido na visualização do pedido e no modelo de email obrigado
Magento2 Devloper
os campos existem show com a getShippingAddress()função que recebe todos os campos definidos para o próprio endereço, é por isso que eu adicionei este código, ele deve adicionar seu atributo para o próprio endereço de entrega
Vlad Patru