【问题标题】:How to add new custom field to billing address section in magento2如何在 magento2 的帐单地址部分添加新的自定义字段
【发布时间】:2016-08-09 06:10:36
【问题描述】:

我尝试在 magento2 帐单地址部分添加新字段。我已按照以下链接在送货地址块中添加新字段

http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/

我已成功将新字段添加到送货地址部分。但在我的网站中,我一直在使用“虚拟产品”。所以我想将我的新自定义字段添加到计费部分。我刚刚修改了“LayoutProcessorPlugin.php”代码,如下所示

$jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']['payment']['children ']['payments-list']['children']['delivery_date']

而不是

$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['shippingAddress']['children ']['shipping-address-fieldset']['children']['delivery_date']

但它不起作用。如何将我的新自定义字段添加到 magento2 中的帐单地址块?

【问题讨论】:

    标签: magento2 billing


    【解决方案1】:

    请检查以下代码以将自定义地址属性保存在客户、结帐运输和账单表格中,并保存在订单表中。

    模块名称:Ccc_Checkout

    为地址和订单创建自定义属性的脚本

    app/code/Ccc/Checkout/Setup/UpgradeData.php

    <?php
    namespace Ccc\Checkout\Setup;
    
    use Magento\Eav\Setup\EavSetupFactory;
    use Magento\Framework\Setup\ModuleContextInterface;
    use Magento\Framework\Setup\ModuleDataSetupInterface;
    use Magento\Framework\Setup\UpgradeDataInterface;
    use Magento\Eav\Model\Config;
    use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;
    
    class UpgradeData implements UpgradeDataInterface
    {
    
        private $eavSetupFactory;
    
        /**
            * @var Config
            */
        private $eavConfig;
    
        /**
            * @var AttributeSetFactory
            */
        private $attributeSetFactory;
    
        public function __construct(
            Config $eavConfig,
            EavSetupFactory $eavSetupFactory,
            AttributeSetFactory $attributeSetFactory
        )
        {
            $this->eavSetupFactory = $eavSetupFactory;
            $this->eavConfig            = $eavConfig;
            $this->attributeSetFactory  = $attributeSetFactory;
        }
    
        /**
            * {@inheritdoc}
            */
        public function upgrade(
            ModuleDataSetupInterface $setup,
            ModuleContextInterface $context
        ) {
            $setup->startSetup();
            if (version_compare($context->getVersion(), '0.0.2','<')) { 
                $this->addUnitNumberFieldToAddress($setup);
            }
            if (version_compare($context->getVersion(), '0.0.3','<')) { 
                $this->updateUnitAttribute($setup);
            }
            $setup->endSetup();
    
    
        }
    
        /**
        * put your comment there...
        * 
        * @param mixed $setup
        */
        protected function addUnitNumberFieldToAddress($setup)
        {
            $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
            $eavSetup->addAttribute('customer_address', 'unit_number', [
                'type' => 'varchar',
                'input' => 'text',
                'label' => 'Unit Number',
                'visible' => true,
                'required' => false,
                'user_defined' => true,
                'system'=> false,
                'group'=> 'General',
                'sort_order' => 71,
                'global' => true,
                'visible_on_front' => true,
            ]);       
    
            $customAttribute = $this->eavConfig->getAttribute('customer_address', 'unit_number');
    
            $customAttribute->setData(
                'used_in_forms',
                ['adminhtml_customer_address','customer_address_edit','customer_register_address'] 
            );
            $customAttribute->save();
    
    
            $installer = $setup;
    
    
            $installer->getConnection()->addColumn(
                $installer->getTable('quote_address'),
                'unit_number',
                [
                    'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 
                    'length' => 255,
                    'comment' => 'Unit Number'
                ]
            );
    
            $installer->getConnection()->addColumn(
                $installer->getTable('sales_order_address'),
                'unit_number',
                [
                    'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 
                    'length' => 255,
                    'comment' => 'Unit Number'
                ]
            );
        }
    
        public function updateUnitAttribute($setup)
        {
            $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
            $eavSetup->updateAttribute('customer_address', 'unit_number', 'sort_order', '71');
        }
    }
    

    app/code/Ccc/Checkout/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\Block\Checkout\LayoutProcessor">
            <plugin disabled="false" name="BillingLayoutProcessor" sortOrder="99" type="Ccc\Checkout\Plugin\Block\Checkout\LayoutProcessor"/>
        </type>
        <type name="Magento\Quote\Model\BillingAddressManagement">
            <plugin disabled="false" name="Ccc_Checkout_Plugin_Magento_Quote_Model_BillingAddressManagement" sortOrder="10" type="Ccc\Checkout\Plugin\Magento\Quote\Model\BillingAddressManagement"/>
        </type>
        <type name="Magento\Quote\Model\Quote\Address\BillingAddressPersister">
            <plugin disabled="false" name="BillingAddressSave" sortOrder="10" type="Ccc\Checkout\Plugin\Magento\Quote\Model\Quote\Address\BillingAddressPersister"/>
        </type>
        <type name="Magento\Quote\Model\ShippingAddressManagement">
            <plugin disabled="false" name="Ccc_Checkout_Plugin_Magento_Quote_Model_ShippingAddressManagement" sortOrder="10" type="Ccc\Checkout\Plugin\Magento\Quote\Model\ShippingAddressManagement"/>
        </type>
    </config>
    

    app/code/Ccc/Checkout/etc/events.xml

    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
        <event name="sales_model_service_quote_submit_success">
            <observer name="custome_address_attribute_save" instance="Ccc\Checkout\Observer\SaveUnitNumberInOrder"/>
        </event>
    </config>
    

    app/code/Ccc/Checkout/etc/extension_attributes.xml

    <?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="unit_number" type="string"/>
        </extension_attributes>
    </config>
    

    创建插件以在结帐账单和运输表单中显示自定义属性

    app/code/Ccc/Checkout/Plugin/Block/Checkout/LayoutProcessor

    <?php
    namespace Ccc\Checkout\Plugin\Block\Checkout;
    use \Magento\Checkout\Block\Checkout\LayoutProcessor as MageLayoutProcessor;
    class LayoutProcessor
    {
        protected $_customAttributeCode = 'unit_number';
        public function afterProcess(MageLayoutProcessor $subject, $jsLayout)
        {
            if (isset($jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']
            ['payment']['children']['payments-list']['children'])) 
            {
                foreach ($jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']['payment']['children']['payments-list']['children'] as $key => $payment) 
                {                
                    $paymentCode = 'billingAddress'.str_replace('-form','',$key);
                    $jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']['payment']['children']['payments-list']['children'][$key]['children']['form-fields']['children'][$this->_customAttributeCode] = $this->getUnitNumberAttributeForAddress($paymentCode);                
                } 
    
            }   
    
                if(isset($jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['shippingAddress']['children']['shipping-address-fieldset'])
            ){
                $jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['shippingAddress']['children']['shipping-address-fieldset']['children'][$this->_customAttributeCode] = $this->getUnitNumberAttributeForAddress('shippingAddress');
                }
    
            return $jsLayout;     
        }   
    
        public function getUnitNumberAttributeForAddress($addressType)
        {        
            return $customField = [
                'component' => 'Magento_Ui/js/form/element/abstract',
                'config' => [                
                    'customScope' => $addressType.'.custom_attributes',
                    'customEntry' => null,
                    'template' => 'ui/form/field',
                    'elementTmpl' => 'ui/form/element/input'
                ],
                'dataScope' => $addressType.'.custom_attributes' . '.' . $this->_customAttributeCode,
                'label' => 'Unit Number',
                'provider' => 'checkoutProvider',
                'sortOrder' => 71,
                'validation' => [
                    'required-entry' => false
                ],
                'options' => [],
                'filterBy' => null,
                'customEntry' => null,
                'visible' => true,
            ];
        }    
    }
    

    在结帐时保存自定义属性

    app/code/Ccc/Checkout/Plugin/Magento/Quote/Model/ShippingAddressManagement

    <?php
    namespace Ccc\Checkout\Plugin\Magento\Quote\Model;
    
    class ShippingAddressManagement
    {
        protected $logger;
    
        public function __construct(
            \Psr\Log\LoggerInterface $logger
        ) {
            $this->logger = $logger;
        }
    
        public function beforeAssign(
            \Magento\Quote\Model\ShippingAddressManagement $subject,
            $cartId,
            \Magento\Quote\Api\Data\AddressInterface $address
        ) {
    
            $extAttributes = $address->getExtensionAttributes();        
            if (!empty($extAttributes)) {
                try {
                    $address->setUnitNumber($extAttributes->getUnitNumber());
                } catch (\Exception $e) {
                    $this->logger->critical($e->getMessage());
                }
            }
        }
    }
    

    app/code/Ccc/Checkout/Plugin/Magento/Quote/Model/BillingAddressManagement

    <?php
    namespace Ccc\Checkout\Plugin\Magento\Quote\Model;
    
    class BillingAddressManagement
    {
    
        protected $logger;
    
        public function __construct(
            \Psr\Log\LoggerInterface $logger
        ) {
            $this->logger = $logger;
        }
    
        public function beforeAssign(
            \Magento\Quote\Model\BillingAddressManagement $subject,
            $cartId,
            \Magento\Quote\Api\Data\AddressInterface $address,
            $useForShipping = false
        ) {
    
            $extAttributes = $address->getExtensionAttributes();
            if (!empty($extAttributes)) {
                try {
                    $address->setUnitNumber($extAttributes->getUnitNumber());
                } catch (\Exception $e) {
                    $this->logger->critical($e->getMessage());
                }
            }
        }
    }
    

    app/code/Ccc/Checkout/Ccc/Checkout/Plugin/Magento/Quote/Model/Quote/Address

    <?php
    namespace Ccc\Checkout\Plugin\Magento\Quote\Model\Quote\Address;
    
    class BillingAddressPersister
    {
    
        protected $logger;
    
        public function __construct(
            \Psr\Log\LoggerInterface $logger
        ) {
            $this->logger = $logger;
        }
    
        public function beforeSave(
            \Magento\Quote\Model\Quote\Address\BillingAddressPersister $subject,
            $quote,
            \Magento\Quote\Api\Data\AddressInterface $address,
            $useForShipping = false
        ) {
    
            $extAttributes = $address->getExtensionAttributes();
            if (!empty($extAttributes)) {
                try {
                    $address->setUnitNumber($extAttributes->getUnitNumber());
                } catch (\Exception $e) {
                    $this->logger->critical($e->getMessage());
                }
            }
        }
    }
    

    在扩展属性中设置自定义属性

    app/code/Ccc/Checkout/view/frontend/requirejs-config.js

    var config = {
        config: {
            mixins: {
                'Magento_Checkout/js/model/payment/method-group': {
                    'Ccc_Checkout/js/model/payment/method-group-mixin': true
                },
                    'Magento_Checkout/js/action/set-billing-address': {
                    'Ccc_Checkout/js/action/set-billing-address-mixin': true
                },
                'Magento_Checkout/js/action/set-shipping-information': {
                    'Ccc_Checkout/js/action/set-shipping-information-mixin': true
                },
                'Magento_Checkout/js/action/create-shipping-address': {
                    'Ccc_Checkout/js/action/create-shipping-address-mixin': true
                },
                'Magento_Checkout/js/action/place-order': {
                    'Ccc_Checkout/js/action/set-billing-address-mixin': true
                },
                'Magento_Checkout/js/action/create-billing-address': {
                    'Ccc_Checkout/js/action/set-billing-address-mixin': true
                }
            }
        }
    };
    

    app/code/Ccc/Checkout/view/frontend/web/js/action/create-shipping-address-mixin.js

    define([
        'jquery',
        'mage/utils/wrapper',
        'Magento_Checkout/js/model/quote'
    ], function ($, wrapper,quote) {
        'use strict';
    
        return function (setShippingInformationAction) {
            return wrapper.wrap(setShippingInformationAction, function (originalAction, messageContainer) {
    
                if (messageContainer.custom_attributes != undefined) {
                    $.each(messageContainer.custom_attributes , function( key, value ) {
                        messageContainer['custom_attributes'][key] = {'attribute_code':key,'value':value};
                    });
                }
    
                return originalAction(messageContainer);
            });
        };
    });
    

    app/code/Ccc/Checkout/view/frontend/web/js/action/set-billing-address-mixin.js

    define([
        'jquery',
        'mage/utils/wrapper',
        'Magento_Checkout/js/model/quote'
    ], function ($, wrapper,quote) {
        'use strict';
    
        return function (setBillingAddressAction) {
            return wrapper.wrap(setBillingAddressAction, function (originalAction, messageContainer) {
    
                var billingAddress = quote.billingAddress();            
                if(billingAddress != undefined) {
    
                    if (billingAddress['extension_attributes'] === undefined) {
                        billingAddress['extension_attributes'] = {};
                    }
    
                    if (billingAddress.customAttributes != undefined) {
                        $.each(billingAddress.customAttributes, function (key, value) {                        
                            if($.isPlainObject(value)){
                                value = value['value'];
                            }
    
                            billingAddress['extension_attributes'][key] = value;
                        });
                    }
    
                }
    
                return originalAction(messageContainer);
            });
        };
    });
    

    app/code/Ccc/Checkout/view/frontend/web/js/action/set-shipping-information-mixin.js

    define([
        'jquery',
        'mage/utils/wrapper',
        'Magento_Checkout/js/model/quote'
    ], function ($, wrapper,quote) {
        'use strict';
    
        return function (setShippingInformationAction) {
            return wrapper.wrap(setShippingInformationAction, function (originalAction, messageContainer) {
    
                var shippingAddress = quote.shippingAddress();
    
                if (shippingAddress['extension_attributes'] === undefined) {
                    shippingAddress['extension_attributes'] = {};
                }
    
                if (shippingAddress.customAttributes != undefined) {
                    $.each(shippingAddress.customAttributes , function( key, value ) {
    
                        if($.isPlainObject(value)){
                            value = value['value'];
                        }
                        shippingAddress['customAttributes'][key] = value;
                        shippingAddress['extension_attributes'][key] = value;
    
                    });
                }
    
                return originalAction(messageContainer);
            });
        };
    });
    

    在订单中保存自定义属性

    app/code/Ccc/Checkout/Observer/SaveUnitNumberInOrder.php

    <?php
    namespace Ccc\Checkout\Observer;
    
    class SaveUnitNumberInOrder implements \Magento\Framework\Event\ObserverInterface
    {
        public function execute(\Magento\Framework\Event\Observer $observer) {
            $order = $observer->getEvent()->getOrder();
            $quote = $observer->getEvent()->getQuote();
                if ($quote->getBillingAddress()) {
                    $order->getBillingAddress()->setUnitNumber($quote->getBillingAddress()->getExtensionAttributes()->getUnitNumber());
                }
                if (!$quote->isVirtual()) {            
                    $order->getShippingAddress()->setUnitNumber($quote->getShippingAddress()->getUnitNumber());
                }
            return $this;
        }
    }
    

    要在客户帐户中显示自定义属性,您需要将客户 edit.phtml 文件从供应商改写为您的主题,如下所示:

    app/design/frontend/custom_theme/theme_name/Magento_Customer/templates/address/edit.phtml

    <div class="field unit_number">
        <label class="label" for="unit_number"><span><?php echo $block->escapeHtml(__('Unit Number')) ?></span></label>
        <div class="control">
            <input type="text" name="unit_number"
                value="<?= $block->escapeHtmlAttr($block->getAddress()->getCustomAttribute('unit_number') ? $block->getAddress()->getCustomAttribute('unit_number')->getValue() : '') ?>"
                title="<?= $block->escapeHtmlAttr($block->getAddress()->getCustomAttribute('unit_number') ? $block->getAddress()->getCustomAttribute('unit_number')->getValue() : '') ?>"
                class="input-text <?= $block->escapeHtmlAttr($block->getAddress()->getCustomAttribute('unit_number') ? $block->getAddress()->getCustomAttribute('unit_number')->getValue() : '') ?>"
                id="unit_number">
        </div>
    </div>
    

    【讨论】:

      【解决方案2】:

      也许迟到了,无论如何:

             $jsLayout['components']
                      ['checkout']['children']
                      ['steps']['children']
                      ['billing-step']['children']
                      ['payment']['children']
                      ['afterMethods']['children']
                      ['billing-address-form']['children']
                      ['form-fields']['children']
                      [$customAttributeCode] = $customField;
      

      应该可以解决问题。 我可以通过这种方式在计费表单中显示我的字段。 无论如何,我仍在研究应该捕获哪个操作来检索此值并将其发送到服务器。

      【讨论】:

        【解决方案3】:

        Webkul 有一篇关于如何在 Magento 2 中的帐单地址表单中添加自定义字段的精彩文章,虽然它没有涵盖有关如何将此字段保存到数据库并显示在订单详细信息屏幕上的完整详细信息,但它有助于显示帐单地址的字段。

        https://webkul.com/blog/add-custom-field-billing-address-form-magento-2/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-25
          • 2016-08-18
          • 2021-06-06
          • 2018-05-01
          • 2017-08-31
          相关资源
          最近更新 更多