¿Cómo mostrar un atributo personalizado en el cuadro Dirección de envío del administrador?

13

He agregado el campo personalizado desplegable en la página de pago con valores personalizados. Funciona bien, también guarda los valores de los atributos en la base de datos pero no los muestra en la dirección de envío del pedido. ¿Alguna idea de cómo mostrarlo?

ingrese la descripción de la imagen aquí

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

Enchufar

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

ingrese la descripción de la imagen aquí

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

    }
}

ingrese la descripción de la imagen aquí Refe Extension

El complemento anterior funciona bien y guarda valores en la tabla quote_address. También quiero mostrar un atributo personalizado en la página de vista de pedidos y la plantilla de correo electrónico. Cualquiera tiene una idea de lo que está mal con el código. Gracias por adelantado

Magento2 Devloper
fuente
su ejemplo no funciona en magento2.2.3
Jigs Parmar
comparta su problema para que pueda verificarlo
Magento2 Devloper
¿Cómo puedo obtener la identificación del correo electrónico cuando el checkout de invitado está habilitado?
Ketan Borada
objeto de cotización y pedido
devuélvelo

Respuestas:

4

Navegue a la configuración del sistema

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

Desde Plantillas de dirección, sección Buscar HTML, desmarque la casilla de verificación del valor del sistema, agregue el siguiente código. puede cambiar un código de atributo si es necesario.

Para la plantilla de correo electrónico, funcionará el mismo formato de dirección [formato de dirección HTML].

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

Ejecutar php bin/magento cache:cleansi no se muestra.

Se mostrará un atributo en la página de vista del pedido y también el correo electrónico del pedido.

arriba se muestra en ambas direcciones, pero si solo desea mostrar en el envío, entonces debe poner solo el valor de SMS en la tabla de direcciones de envío ( sales_order_address and quote_address) sin facturar, funciona bien. Disfrutar

Vista de tabla

ingrese la descripción de la imagen aquí

Resultado -

ingrese la descripción de la imagen aquí

Japs M2 Developer
fuente
¿Cómo puedo guardar solo en la dirección de envío?
Magento2 Devloper
necesitas agregar el evento. o este puede ser útil - magento.stackexchange.com/questions/138902/…
Japs M2 Developer
En realidad no funciona para mi caso, no entiendo cómo una variable puede referirse al atributo de extensión que ya se guardó en la tabla quote_address & sales_order_address. Parece que necesito anular las dos plantillas
info.phtml
4

Intenta con mi enfoque. Tomando en consideración el módulo como se describe en la pregunta.

  1. Usó el mismo módulo que se muestra en la pregunta. ningún cambio

  2. Extensión de referencia instalada a la que se refiere (extensión de SMS)

Navegue a la configuración del sistema

Tiendas -> Configuración -> Clientes -> Configuración del cliente -> Plantillas de direcciones

Desde Plantillas de dirección, sección Buscar HTML, desmarque la casilla de verificación del valor del sistema, agregue el siguiente código. puede cambiar un código de atributo si es necesario.

Para la plantilla de correo electrónico, funcionará el mismo formato de dirección [formato de dirección HTML].

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

ingrese la descripción de la imagen aquí

puede ser necesario para borrar el caché.

Ejecutar php bin/magento cache:cleansi no se muestra

Se mostrará un atributo en la página de vista del pedido y también el correo electrónico del pedido.

ingrese la descripción de la imagen aquí

sandip
fuente
Gracias por su respuesta. ¿Cómo gestionamos la visualización solo en el área de dirección de envío?
Magento2 Devloper
es posible que deba crear más configuración del sistema, para la dirección de envío solo como html_for_shipping. Magento/sales/view/adminhtml/templates/order/view/info.phtml, busque el $block->getFormattedAddress( $order->getShippingAddress() );cambio de línea a continuación $block->getFormattedShippingAddress( $order->getShippingAddress() );en el info.phparchivo In , puede crear un método nuevo solo para formatear la dirección de envío Puede cambiar el parámetro del método de formato 'html' a 'html_for_shipping', donde 'html_for_shipping' será el nuevo valor de configuración del sistema para el formato de la dirección de envío.
sandip
De repente no está funcionando. no mostrarme los detalles de SMS en orden. ¿alguna idea?
Magento2 Devloper
Probé este @ sandip ... Pero no se muestra ... Por favor
ayúdenme
3

Si el atributo se guarda correctamente, debe agregar el atributo a las plantillas de dirección. Estos se pueden encontrar en

Tiendas -> Configuración -> Clientes -> Configuración del cliente -> Plantillas de direcciones

Puede agregar al final algo como:

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

Dependiendo del tipo de plantilla, puede usar <br/>para crear nuevas líneas.

Langley
fuente
¿Quiero mostrar solo la dirección de envío y cómo puedo administrar también en la página de vista de pedido?
Magento2 Devloper
Estas plantillas se usan en todas partes. Frontend, backend, pdf, correos electrónicos ... Si el atributo se guarda solo en la dirección de envío, entonces solo se mostrará allí
Langley
ok, déjame comprobarlo
Magento2 Devloper
No funciona. No se muestra en ningún lado. - nimb.ws/9cnpHW
Magento2 Devloper
Hola @Langley Gracias por la respuesta, estoy recibiendo esto solo en la dirección de facturación que no se muestra en la dirección de envío, quiero mostrarlo en ambos lugares.
shivashankar m
2

Haría eso así: agréguelo a quotey sales_ordery trabaje los datos desde allí use el siguiente código (también intente usar los scripts UpgradeSchema si necesita actualizar la tabla de base de datos existente, InstallSchema debe usarse para nuevas tablas de base de datos)

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

ACTUALIZAR

Cree un mixin js de la siguiente manera:

en requirejs-config.js

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

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

También debe tener una extension_attributes.xmlen Your_Module/etc/la siguiente 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>

realice cambios donde sea necesario (código de atributo, tipo, etc.) esto agregará su atributo personalizado a la información de envío

Vlad Patru
fuente
pero cómo guardar estos datos de campo en la tabla, ¿puede compartir el código? gracias
Magento2 Devloper
¿me puede mostrar cómo definió su complemento en el di.xmlarchivo?
Vlad Patru
compruebo que actualicé guardar el código de campo y que funciona bien, pero ¿cómo mostrarlo en el área de dirección de envío del pedido?
Magento2 Devloper
gracias por la actualización pero mira mi pregunta anterior. guarde las tareas realizadas pero no las muestre en la vista de pedidos y la plantilla de correo electrónico. gracias
Magento2 Devloper
los campos que se muestran con la getShippingAddress()función que establece todos los campos en la dirección en sí, es por eso que agregué este código, debería agregar su atributo a la dirección de envío en sí misma
Vlad Patru