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



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


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


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.