¿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



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í


¿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í


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.


¿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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.