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: