Magento – Magento 2 – How to Override Checkout LayoutProcessor

magento-2.1magento2onepage-checkout

I wanted to customize a private method of

\Block\Checkout\Layoutprocessor.php

private function getAddressAttributes()
{
    // My code here
}

To do that I have created a custom module and did with di.xml. Now issue is if I copy COMPLETE code of core "\Block\Checkout\Layoutprocessor.php" file into my module "\Block\Checkout\Layoutprocessor.php" it works fine, but if I remove all other methods and just leave desired method (where I have made changes) it doesn't work.

So I need help how I can customize layout processor individual method instead of copying complete file code and make my changes :

Here is my code :

di.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
     <preference for="Magento\Checkout\Block\Checkout\LayoutProcessor" type="Vendor\Module\Block\Checkout\LayoutProcessor" />
</config>

LayoutProcessor.php

<?php

namespace Vendor\Module\Block\Checkout;

use Magento\Framework\App\ObjectManager;
use Magento\Checkout\Block\Checkout\AttributeMerger;

class LayoutProcessor extends \Magento\Checkout\Block\Checkout\LayoutProcessor
{
/**
 * @var \Magento\Customer\Model\AttributeMetadataDataProvider
 */
private $attributeMetadataDataProvider;

/**
 * @var \Magento\Ui\Component\Form\AttributeMapper
 */
protected $attributeMapper;

/**
 * @var AttributeMerger
 */
protected $merger;

/**
 * @var \Magento\Customer\Model\Options
 */
private $options;

/**
 * @param \Magento\Customer\Model\AttributeMetadataDataProvider $attributeMetadataDataProvider
 * @param \Magento\Ui\Component\Form\AttributeMapper $attributeMapper
 * @param AttributeMerger $merger
 */
public function __construct(
    \Magento\Customer\Model\AttributeMetadataDataProvider $attributeMetadataDataProvider,
    \Magento\Ui\Component\Form\AttributeMapper $attributeMapper,
    AttributeMerger $merger
) {
    $this->attributeMetadataDataProvider = $attributeMetadataDataProvider;
    $this->attributeMapper = $attributeMapper;
    $this->merger = $merger;
}

/**
 * @deprecated
 * @return \Magento\Customer\Model\Options
 */
private function getOptions()
{
   // Core method code
}

/**
 * @return array
 */
private function getAddressAttributes()
{
   /* my custom code will go here */
}

/**
 * Convert elements(like prefix and suffix) from inputs to selects when necessary
 *
 * @param array $elements address attributes
 * @param array $attributesToConvert fields and their callbacks
 * @return array
 */
private function convertElementsToSelect($elements, $attributesToConvert)
{
    // Core method code
}

/**
 * Process js Layout of block
 *
 * @param array $jsLayout
 * @return array
 */
public function process($jsLayout)
{
    // Core method code
}

/**
 * Inject billing address component into every payment component
 *
 * @param array $configuration list of payment components
 * @param array $elements attributes that must be displayed in address form
 * @return array
 */
private function processPaymentConfiguration(array &$configuration, array $elements)
{
    // Core method code
}
}

Help will be highly appreciated.

Best Answer

The error you are getting is basically because you have been using private parent methods in your own class, so you need a copy of your own for private methods. I have done something similar by creating overriding block class as below:

<?php

namespace Vendor\Module\Block\Checkout;

use Magento\Framework\App\ObjectManager;
use Magento\Checkout\Block\Checkout\AttributeMerger;

class LayoutProcessor extends \Magento\Checkout\Block\Checkout\LayoutProcessor
{
/**
 * @var \Magento\Customer\Model\AttributeMetadataDataProvider
 */
private $attributeMetadataDataProvider;

/**
 * @var \Magento\Ui\Component\Form\AttributeMapper
 */
private $options;

/**
 * @param \Magento\Customer\Model\AttributeMetadataDataProvider $attributeMetadataDataProvider
 * @param \Magento\Ui\Component\Form\AttributeMapper $attributeMapper
 * @param AttributeMerger $merger
 */
public function __construct(
    \Magento\Customer\Model\AttributeMetadataDataProvider $attributeMetadataDataProvider,
    \Magento\Ui\Component\Form\AttributeMapper $attributeMapper,
    AttributeMerger $merger
) {
    $this->attributeMetadataDataProvider = $attributeMetadataDataProvider;

    parent::__construct($this->attributeMetadataDataProvider,
    $attributeMapper, $merger)
}

/**
 * @deprecated
 * @return \Magento\Customer\Model\Options
 */
private function getOptions()
{
   // Core method code
}

/**
 * @return array
 */
private function getAddressAttributes()
{
   /* my custom code will go here */
}

/**
 * Convert elements(like prefix and suffix) from inputs to selects when necessary
 *
 * @param array $elements address attributes
 * @param array $attributesToConvert fields and their callbacks
 * @return array
 */
private function convertElementsToSelect($elements, $attributesToConvert)
{
    // Core method code
}

/**
 * Inject billing address component into every payment component
 *
 * @param array $configuration list of payment components
 * @param array $elements attributes that must be displayed in address form
 * @return array
 */
private function processPaymentConfiguration(array &$configuration, array $elements)
{
    // Core method code
}
}
Related Topic