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.