Comment afficher un attribut personnalisé dans la boîte d'adresse de livraison admin?


13

J'ai ajouté le champ personnalisé déroulant sur la page de paiement avec des valeurs personnalisées. Cela fonctionne bien également enregistrer les valeurs d'attribut dans la base de données mais ne pas afficher dans l'adresse de livraison de la commande. Une idée comment le montrer?

entrez la description de l'image ici

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

Brancher

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

entrez la description de l'image ici

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

    }
}

entrez la description de l'image ici Extension Refe

Le plugin ci-dessus fonctionne correctement et enregistre les valeurs dans la table quote_address. Je veux également afficher l'attribut personnalisé dans la page de vue de la commande et le modèle d'e-mail.Tout le monde a une idée du problème avec le code. Merci d'avance



votre exemple ne fonctionne pas dans magento2.2.3
Jigs Parmar

partagez votre problème afin que je puisse le vérifier
Magento2 Devloper

comment puis-je obtenir l'identifiant e-mail lorsque le paiement est activé
Ketan Borada

devis et commande renvoyez-le
Magento2 Devloper

Réponses:


4

Accédez à la configuration du système

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

Dans Modèles d'adresse, section Rechercher HTML, décochez la valeur système de la case à cocher, ajoutez le code suivant. vous pouvez changer un code d'attribut si besoin.

Pour le modèle d'e-mail, le même format d'adresse [format d'adresse HTML] fonctionnera.

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

Exécutez php bin/magento cache:cleansinon affiche.

Un attribut s'affichera également sur la page d'affichage de la commande et dans l'e-mail de commande.

ci-dessus est affiché dans les deux adresses, mais si vous ne souhaitez afficher que les frais de port, vous devez mettre uniquement la valeur SMS dans le tableau des adresses de livraison ( sales_order_address and quote_address) sans facturation, cela fonctionne correctement. Prendre plaisir

Vue de tableau -

entrez la description de l'image ici

Résultat -

entrez la description de l'image ici


comment puis-je enregistrer uniquement dans l'adresse de livraison?
Magento2 Devloper

vous devez ajouter l'événement. ou celui-ci peut être utile - magento.stackexchange.com/questions/138902/…
Japs M2 Developer

En fait, cela ne fonctionne pas pour mon cas, je ne comprends pas comment une variable peut se référer à l'extension attrbute qui a déjà été enregistrée dans la table quote_address & sales_order_address. Il semble que j'ai besoin de remplacer les deux modèles
info.phtml

4

Essayez avec mon approche. Prise en compte du module tel que décrit dans la question.

  1. Utilisé le même module affiché dans la question. pas de changement

  2. Extension de référence installée à laquelle vous faites référence (extension SMS)

Accédez à la configuration du système

Magasins -> Configuration -> Clients -> Configuration client -> Modèles d'adresses

Dans Modèles d'adresse, section Rechercher HTML, décochez la valeur système de la case à cocher, ajoutez le code suivant. vous pouvez changer un code d'attribut si besoin.

Pour le modèle d'e-mail, le même format d'adresse [format d'adresse HTML] fonctionnera.

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

entrez la description de l'image ici

peut être nécessaire pour vider le cache.

Exécuter php bin/magento cache:cleansinon affiche

Un attribut s'affichera également sur la page d'affichage de la commande et dans l'e-mail de commande.

entrez la description de l'image ici


Merci pour votre réponse. comment nous gérons l'affichage uniquement dans la zone d'adresse de livraison?
Magento2 Devloper

vous devrez peut-être créer plus de configuration système, pour l'adresse de livraison uniquement en tant que html_for_shipping. Magento/sales/view/adminhtml/templates/order/view/info.phtml, recherchez la $block->getFormattedAddress( $order->getShippingAddress() );modification de la ligne ci-dessous $block->getFormattedShippingAddress( $order->getShippingAddress() );dans info.phpFichier, vous pouvez créer une nouvelle méthode uniquement pour le formatage de l'adresse de livraison. Vous pouvez changer le paramètre de la méthode de format 'html' en 'html_for_shipping', où 'html_for_shipping' sera votre nouvelle valeur de configuration système pour le format d'adresse d'expédition.
sandip

du coup ça ne marche pas. ne pas m'afficher au-dessus des détails SMS dans l'ordre. une idée?
Magento2 Devloper

J'ai essayé ceci @ sandip..Mais il ne s'affiche pas .... Aidez-moi s'il vous plaît
Vishali Mariappan

3

Si l'attribut est enregistré correctement, vous devez ajouter l'attribut aux modèles d'adresse. Ceux-ci peuvent être trouvés dans

Magasins -> Configuration -> Clients -> Configuration client -> Modèles d'adresses

Vous pouvez ajouter à la fin quelque chose comme:

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

Selon le type de modèle, vous pouvez utiliser <br/>pour créer de nouvelles lignes.


Je souhaite afficher uniquement l'adresse de livraison et comment puis-je gérer également sur la page de visualisation des commandes?
Magento2 Devloper

Ces modèles sont utilisés partout. Frontend, backend, pdf, emails ... Si l'attribut est enregistré uniquement dans l'adresse de livraison, il ne s'affichera que là
Langley

ok, laissez-moi vérifier
Magento2 Devloper

Ca ne fonctionne pas. ne s'affiche nulle part. - nimb.ws/9cnpHW
Magento2 Devloper

Salut @Langley Merci pour la réponse, je ne reçois cela que dans l'adresse de facturation ne pas l'afficher dans l'adresse de livraison, je veux l'afficher dans les deux endroits.
shivashankar m

2

Je ferais cela comme ceci: ajoutez-le à quoteet sales_orderet travaillez les données à partir de là, utilisez le code suivant (essayez également d'utiliser des scripts UpgradeSchema si vous avez besoin de mettre à jour une table de base de données existante, InstallSchema devrait être utilisé pour de nouvelles tables de base de données)

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

MISE À JOUR

Créez un mixin js comme suit:

dans requirejs-config.js

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

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

Vous devriez également avoir un extension_attributes.xmlin Your_Module/etc/avec le code suivant

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

apporter des modifications si nécessaire (code d'attribut, type, etc. cela ajoutera votre attribut personnalisé aux informations d'expédition


mais comment enregistrer ces données de champ dans le tableau pouvez-vous s'il vous plaît partager le code? merci
Magento2 Devloper

pouvez-vous me montrer comment vous avez défini votre plugin dans le di.xmlfichier?
Vlad Patru

vérifier que j'ai mis à jour le code de champ d'enregistrement et que je fonctionne bien, mais comment afficher dans la zone d'adresse de livraison de la commande
Magento2 Devloper

merci pour la mise à jour mais regardez ma question ci-dessus. enregistrer les choses effectuées mais ne pas les afficher dans la vue des commandes et le modèle d'e-mail. merci
Magento2 Devloper

les champs sont affichés avec la getShippingAddress()fonction qui obtient tous les champs définis à l'adresse elle-même, c'est pourquoi j'ai ajouté ce code, il devrait ajouter votre attribut à l'adresse de livraison elle
Vlad Patru
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.