文章彙整

Magento2 取消結帳頁必填欄位限制

By Astral Web 1 week agoNo Comments
首頁  /  Magento  /  Magento後台管理  /  Magento2 取消結帳頁必填欄位限制

適用版本: Magento2.0.X~2.3.X

 

本篇將介紹如何在Magento2的結帳頁面,取消原本需要必填的地址欄位,讓您可以因應不同的需求去限制使用者該填寫的欄位。

 

筆者認為Magento2的地址欄位設計比較是基於歐美國家設計的,所以當台灣的商家要使用Magento2當作EC平台時候,常會有不需要的必填地址欄位,而Magento2原本就有設計許多欄位可以依照後台設定去決定它該不該顯示、必填,設定的路徑為:Stores->Configuration->Customers->Customers Configuration->Name and Address Options

但是除了這些可以設定的欄位外,還是會有無法藉由後台設定,卻需要移除和取消必填的欄位,這些欄位就必須要修改程式碼來達成,筆者比較常遇到的是first name和last name,只需要留一個來填寫姓名就好,所以我們就用移除last name這個欄位來示範該如何去做。

 

  • 因為2.3版本的驗證程式和2.2版的有些區別,在此會先列出適用2.3版本的程式碼,2.2版前適用的版本將會附上連結提供示範原始碼。

 

app/code/AstralWeb/ModifyAddress/etc/module.xml

######程式碼######
<?xml version=”1.0″?>

<config xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:noNamespaceSchemaLocation=”urn:magento:framework:Module/etc/module.xsd”>

   <module name=”AstralWeb_ModifyAddress” setup_version=”1.0.0″>

       <sequence>

           <module name=”Magento_Checkout”/>

           <module name=”Magento_Customer”/>

       </sequence>

   </module>

</config>

######程式碼######

 

app/code/AstralWeb/ModifyAddress/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 name=”eslite_checkout_layout_processor” type=”AstralWeb\ModifyAddress\Plugin\Block\LayoutProcessor” sortOrder=”1″/>

   </type>

   <preference for=”Magento\Customer\Model\Address\Validator\General” type=”AstralWeb\ModifyAddress\Model\Address\Validator\General” />

</config>

######程式碼######

 

此檔案執行移除結帳頁地址欄位

app/code/AstralWeb/ModifyAddress/Plugin/Block/LayoutProcessor.php

######程式碼######

<?php

 

namespace AstralWeb\ModifyAddress\Plugin\Block;

 

use Magento\Checkout\Model\Session as CheckoutSession;

 

class LayoutProcessor

{

   /**

    * @var CheckoutSession

    */

   public $checkoutSession;

/**

    * @var null

    */

   public $quote = null;

   /**

    * LayoutProcessor constructor.

    * @param CheckoutSession $checkoutSession

    */

   public function __construct(

       CheckoutSession $checkoutSession

   ) {

       $this->checkoutSession = $checkoutSession;

   }

 

   /**

    * Get Quote

    *

    * @return \Magento\Quote\Model\Quote|null

    */

   public function getQuote()

   {

       if (null === $this->quote) {

           $this->quote = $this->checkoutSession->getQuote();

       }

 

       return $this->quote;

   }

 

   /**

    * @param \Magento\Checkout\Block\Checkout\LayoutProcessor $subject

    * @param array $jsLayout

    * @return array

    */

   public function aroundProcess(

       \Magento\Checkout\Block\Checkout\LayoutProcessor $subject,

       \Closure $proceed,

       array $jsLayout

   ) {

       $jsLayoutResult = $proceed($jsLayout);

 

       if ($this->getQuote()->isVirtual()) {

           return $jsLayoutResult;

       }

       //remove shipping address lastname

       unset($jsLayoutResult[‘components’][‘checkout’][‘children’][‘steps’][‘children’][‘shipping-step’][‘children’][‘shippingAddress’][‘children’][‘shipping-address-fieldset’][‘children’][‘lastname’]);

 

       //remove billing address lastname

       unset($jsLayoutResult[‘components’][‘checkout’][‘children’][‘steps’][‘children’][‘billing-step’][‘children’][‘payment’][‘children’][‘afterMethods’][‘children’][‘billing-address-form’][‘children’][‘form-fields’][‘children’][‘lastname’]);

 

       $configuration = $jsLayout[‘components’][‘checkout’][‘children’][‘steps’][‘children’][‘billing-step’][‘children’][‘payment’][‘children’][‘renders’][‘children’];

 

       foreach ($configuration as $paymentGroup => $groupConfig) {

           foreach ($groupConfig[‘methods’] as $paymentCode => $paymentComponent) {

               unset($jsLayoutResult[‘components’][‘checkout’][‘children’][‘steps’][‘children’][‘billing-step’][‘children’][‘payment’][‘children’][‘payments-list’][‘children’][$paymentCode . ‘-form’][‘children’][‘form-fields’][‘children’][‘lastname’]);

           }

       }

       return $jsLayoutResult;

   }

}

 

######程式碼######

 

此檔案執行移除Server端地址欄位驗證

app/code/AstralWeb/ModifyAddress/Model/Address/Validator/General.php

######程式碼######

<?php

 

namespace AstralWeb\ModifyAddress\Model\Address\Validator;

 

use Magento\Customer\Model\Address\AbstractAddress;

 

/**

* Address general fields validator.

*/

class General

{

   /**

    * @var \Magento\Eav\Model\Config

    */

   private $eavConfig;

 

   /**

    * @var \Magento\Directory\Helper\Data

    */

   private $directoryData;

 

   /**

    * @param \Magento\Eav\Model\Config $eavConfig

    * @param \Magento\Directory\Helper\Data $directoryData

    */

   public function __construct(

       \Magento\Eav\Model\Config $eavConfig,

       \Magento\Directory\Helper\Data $directoryData

   ) {

       $this->eavConfig = $eavConfig;

       $this->directoryData = $directoryData;

   }

 

   /**

    * @inheritdoc

    */

   public function validate(AbstractAddress $address)

   {

       $errors = array_merge(

           $this->checkRequredFields($address),

           $this->checkOptionalFields($address)

       );

 

       return $errors;

   }

 

   /**

    * Check fields that are generally required.

    *

    * @param AbstractAddress $address

    * @return array

    * @throws \Zend_Validate_Exception

    */

   private function checkRequredFields(AbstractAddress $address)

   {

       $errors = [];

       if (!\Zend_Validate::is($address->getFirstname(), ‘NotEmpty’)) {

           $errors[] = __(‘”%fieldName” is required. Enter and try again.’, [‘fieldName’ => ‘firstname’]);

       }

 

       if (!\Zend_Validate::is($address->getStreetLine(1), ‘NotEmpty’)) {

           $errors[] = __(‘”%fieldName” is required. Enter and try again.’, [‘fieldName’ => ‘street’]);

       }

 

       if (!\Zend_Validate::is($address->getCity(), ‘NotEmpty’)) {

           $errors[] = __(‘”%fieldName” is required. Enter and try again.’, [‘fieldName’ => ‘city’]);

       }

 

       return $errors;

   }

 

   /**

    * Check fields that are conditionally required.

    *

    * @param AbstractAddress $address

    * @return array

    * @throws \Magento\Framework\Exception\LocalizedException

    * @throws \Zend_Validate_Exception

    */

   private function checkOptionalFields(AbstractAddress $address)

   {

       $errors = [];

       if ($this->isTelephoneRequired()

           && !\Zend_Validate::is($address->getTelephone(), ‘NotEmpty’)

       ) {

           $errors[] = __(‘”%fieldName” is required. Enter and try again.’, [‘fieldName’ => ‘telephone’]);

       }

 

       if ($this->isFaxRequired()

           && !\Zend_Validate::is($address->getFax(), ‘NotEmpty’)

       ) {

           $errors[] = __(‘”%fieldName” is required. Enter and try again.’, [‘fieldName’ => ‘fax’]);

       }

 

       if ($this->isCompanyRequired()

           && !\Zend_Validate::is($address->getCompany(), ‘NotEmpty’)

       ) {

           $errors[] = __(‘”%fieldName” is required. Enter and try again.’, [‘fieldName’ => ‘company’]);

       }

 

       $havingOptionalZip = $this->directoryData->getCountriesWithOptionalZip();

       if (!in_array($address->getCountryId(), $havingOptionalZip)

           && !\Zend_Validate::is($address->getPostcode(), ‘NotEmpty’)

       ) {

           $errors[] = __(‘”%fieldName” is required. Enter and try again.’, [‘fieldName’ => ‘postcode’]);

       }

 

       return $errors;

   }

 

   /**

    * Check if company field required in configuration.

    *

    * @return bool

    * @throws \Magento\Framework\Exception\LocalizedException

    */

   private function isCompanyRequired()

   {

       return $this->eavConfig->getAttribute(‘customer_address’, ‘company’)->getIsRequired();

   }

 

   /**

    * Check if telephone field required in configuration.

    *

    * @return bool

    * @throws \Magento\Framework\Exception\LocalizedException

    */

   private function isTelephoneRequired()

   {

       return $this->eavConfig->getAttribute(‘customer_address’, ‘telephone’)->getIsRequired();

   }

 

   /**

    * Check if fax field required in configuration.

    *

    * @return bool

    * @throws \Magento\Framework\Exception\LocalizedException

    */

   private function isFaxRequired()

   {

       return $this->eavConfig->getAttribute(‘customer_address’, ‘fax’)->getIsRequired();

   }

}

######程式碼######.

 

然後最後記得要建立registration.php和composer.json檔案後執行安裝指令,就大功告成囉!

php bin/magento setup:upgrade;

php bin/magento setup:di:compile;

php bin/magento setup:static-content:deploy;

 

Github source code:

https://github.com/astraleason/ModifyAddressSample

以上是針對Magento2.3.0 MSI多源庫存的文章介紹,如果有您有更多疑問可以詢問我們,未來會撰寫更多電商網站相關文章,您想知道什麼嗎?歡迎在下方留言給我們。或追蹤我們的粉絲專頁,就不錯過最新文章喔!

想學習更多Magento設定嗎?請見:Magento教學導覽

 

 

以上內容由Astralweb 歐斯瑞編寫製作

 000

推薦文章

Category:
  Magento後台管理

留下回應

你的電子郵件地址不會被公開.

取得獨家電子商務祕技

建立更好的策略靈感

跟上全球的網路趨勢

絕佳的電商解決方案

電子商務戰略全指南

每月發送電商戰略指南,只要填寫E-mail即可訂閱!

請到您的信箱確認,即可完成訂閱。