Come mostrare un attributo personalizzato nella casella Indirizzo di spedizione dell'amministratore?


13

Ho aggiunto il campo personalizzato a discesa nella pagina di pagamento con valori personalizzati. Funziona bene anche salvare i valori degli attributi nel database ma non visualizzati nell'indirizzo di spedizione dell'ordine. Qualche idea su come mostrarlo?

inserisci qui la descrizione dell'immagine

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

Collegare

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

inserisci qui la descrizione dell'immagine

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

    }
}

inserisci qui la descrizione dell'immagine Estensione Refe

Il plugin sopra funziona bene e salva i valori nella tabella quote_address. Voglio visualizzare l'attributo personalizzato anche nella pagina di visualizzazione dell'ordine e nel modello di posta elettronica. Qualcuno ha un'idea di cosa non va nel codice. Grazie in anticipo



il tuo esempio non funziona in magento2.2.3
— Jigs Parmar,

condividi il tuo problema in modo che io possa verificarlo
— Magento2 Devloper,

come posso ottenere l'ID e-mail quando è abilitato il checkout degli ospiti
— Ketan Borada,

preventivo e ordine oggetto restituirlo
— Magento2 Devloper

Risposte:


4

Passare a Configurazione del sistema

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

Dai modelli di indirizzo, trova la sezione HTML, deseleziona il valore di sistema della casella di controllo, aggiungi il seguente codice. è possibile modificare un codice di attributo, se necessario.

Per il modello e-mail, funzionerà lo stesso formato di indirizzo [Formato indirizzo HTML].

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

Esegui php bin/magento cache:cleanse non mostra.

Un attributo verrà mostrato nella pagina di visualizzazione dell'ordine e ordinerà anche l'e-mail.

sopra viene visualizzato in entrambi gli indirizzi, ma se si desidera mostrare solo nella spedizione, è necessario inserire solo il valore SMS nella tabella degli indirizzi di spedizione ( sales_order_address and quote_address) senza fatturare, funziona correttamente. Godere

Vista tabella -

inserisci qui la descrizione dell'immagine

Risultato -

inserisci qui la descrizione dell'immagine


come posso salvare solo nell'indirizzo di spedizione?
— Magento2 Devloper

devi aggiungere l'evento. o questo potrebbe essere utile - magento.stackexchange.com/questions/138902/…
— Japs M2 Developer

In realtà non funziona nel mio caso, non capisco come una variabile possa riferirsi all'estensione attrbute che era già stata salvata nella tabella quote_address & sales_order_address. Sembra che debba sovrascrivere i due template
— info.phtml

4

Prova con il mio approccio. Prendendo in considerazione il modulo come descritto nella domanda.

  1. Usato lo stesso modulo mostrato nella domanda. nessun cambiamento

  2. Estensione di riferimento installata a cui si fa riferimento (estensione SMS)

Passare a Configurazione del sistema

Negozi -> Configurazione -> Clienti -> Configurazione cliente -> Modelli indirizzo

Dai modelli di indirizzo, trova la sezione HTML, deseleziona il valore di sistema della casella di controllo, aggiungi il seguente codice. è possibile modificare un codice di attributo, se necessario.

Per i modelli di email, funzionerà lo stesso formato di indirizzo [Formato indirizzo HTML].

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

inserisci qui la descrizione dell'immagine

potrebbe essere necessario cancellare la cache.

Esegui php bin/magento cache:cleanse non mostra

Un attributo verrà mostrato nella pagina di visualizzazione dell'ordine e ordinerà anche l'e-mail.

inserisci qui la descrizione dell'immagine


La ringrazio per la risposta. come gestiamo la visualizzazione solo nell'area degli indirizzi di spedizione?
— Magento2 Devloper

potrebbe essere necessario creare più configurazioni di sistema, solo per l'indirizzo di spedizione html_for_shipping. Magento/sales/view/adminhtml/templates/order/view/info.phtml, trova sotto la riga $block->getFormattedAddress( $order->getShippingAddress() );modifica in $block->getFormattedShippingAddress( $order->getShippingAddress() );In info.phpfile, puoi creare un nuovo metodo solo per la formattazione dell'indirizzo di spedizione. Puoi modificare il parametro del metodo di formato 'html' in 'html_for_shipping', dove 'html_for_shipping' sarà il tuo nuovo valore di configurazione del sistema per il formato dell'indirizzo di spedizione.
— Sandip

improvvisamente non funziona. non visualizzarmi sopra i dettagli degli SMS in ordine. qualche idea?
— Magento2 Devloper

Ho provato questo @ sandip..ma non viene visualizzato .... Per favore aiutatemi
— Vishali Mariappan,

3

Se l'attributo viene salvato correttamente, è necessario aggiungere l'attributo ai modelli di indirizzo. Questi possono essere trovati in

Negozi -> Configurazione -> Clienti -> Configurazione cliente -> Modelli indirizzo

Puoi aggiungere alla fine qualcosa come:

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

A seconda del tipo di modello, è possibile utilizzare <br/>per creare nuove linee.


Voglio visualizzare solo l'indirizzo di spedizione e come posso gestirlo anche nella pagina di visualizzazione dell'ordine?
— Magento2 Devloper

Questi modelli sono usati ovunque. Frontend, backend, pdf, e-mail ... Se l'attributo viene salvato solo nell'indirizzo di spedizione, verrà visualizzato solo lì
— Langley

ok, fammi controllare
— Magento2 Devloper

Non funziona. non visualizzare da nessuna parte. - nimb.ws/9cnpHW
— Magento2 Devloper

Ciao @Langley Grazie per la risposta, iam ricevendo questo solo nell'indirizzo di fatturazione non visualizzandolo nell'indirizzo di spedizione, voglio visualizzarlo in entrambi i luoghi.
— shivashankar m

2

Io farei così: aggiungerlo alla quotee sales_ordere lavorare i dati da lì utilizzare il seguente codice (provate anche utilizzando script upgradeSchema se è necessario aggiornare la tabella DB esistente, InstallSchema dovrebbe essere utilizzato per le nuove tabelle del 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();
    }
}

AGGIORNARE

Crea un mixin js come segue:

nel requirejs-config.js

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

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

Inoltre dovresti avere un extension_attributes.xmlin Your_Module/etc/con il seguente codice

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

apportare modifiche ove necessario (codice attributo, tipo, ecc. ciò aggiungerà il tuo attributo personalizzato alle informazioni di spedizione


ma come salvare i dati di questo campo nella tabella puoi condividere il codice? grazie
— Magento2 Devloper

puoi mostrarmi come hai definito il tuo plugin nel di.xmlfile?
— Vlad Patru,

controlla che ho aggiornato il codice di salvataggio e che funzioni correttamente ma come visualizzare l'area dell'indirizzo di spedizione dell'ordine?
— Magento2 Devloper

grazie per l'aggiornamento ma guarda la mia domanda sopra. salvare le cose fatte ma non visualizzate nella vista dell'ordine e nel modello e-mail. grazie
— Magento2 Devloper

i campi sono presenti con la getShippingAddress()funzione che ottiene tutti i campi impostati sull'indirizzo stesso, ecco perché ho aggiunto questo codice, dovrebbe aggiungere il tuo attributo all'indirizzo di spedizione stesso
— Vlad Patru
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.