Magento 2 Override Private method
-
30-01-2021 - |
Domanda
I am working with the Magento2, as per my requirement i want to override the private function.
In Magento\Checkout\Model\DefaultConfigProvider
has a method "getCustomerData()" as private one, this function is called as follows
public function getConfig()
{
....
$output['customerData'] = $this->getCustomerData();
...
}
so, now i override this module using preference method
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Checkout\Model\DefaultConfigProvider" type="Vendor\Checkout\Model\DefaultConfigProvider" />
</config>
In My extended class instead of override the private function i just add "Custom" word to the end of the private function, now the function name in my extended class "getCustomerDataCustom()"
Then in my extended class i called that function as follows
public function getConfig()
{
....
$output['customerData'] = $this->getCustomerDataCustom();
...
}
The issue is the core & extended class are not working. The module is in enable stage and there is no errors in system and exception log. May i know what is an issue. Kindly check and share your ideas. Thanks in advance
Herewith i have added my whole extended class, In this extended class i have override all the private functions
namespace Vendor\Checkout\Model;
use Magento\Catalog\Helper\Product\ConfigurationPool;
use Magento\Checkout\Helper\Data as CheckoutHelper;
use Magento\Checkout\Model\Session as CheckoutSession;
use Magento\Customer\Api\CustomerRepositoryInterface as CustomerRepository;
use Magento\Customer\Model\Context as CustomerContext;
use Magento\Customer\Model\Session as CustomerSession;
use Magento\Customer\Model\Url as CustomerUrlManager;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Http\Context as HttpContext;
use Magento\Framework\Data\Form\FormKey;
use Magento\Framework\Locale\FormatInterface as LocaleFormat;
use Magento\Framework\UrlInterface;
use Magento\Quote\Api\CartItemRepositoryInterface as QuoteItemRepository;
use Magento\Quote\Api\CartTotalRepositoryInterface;
use Magento\Quote\Api\ShippingMethodManagementInterface as ShippingMethodManager;
use Magento\Quote\Model\QuoteIdMaskFactory;
use Magento\Store\Model\ScopeInterface;
/**
* Onepage checkout block
* @api
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class DefaultConfigProvider extends \Magento\Checkout\Model\DefaultConfigProvider
{
/**
* @var CheckoutHelper
*/
private $checkoutHelper;
/**
* @var CheckoutSession
*/
private $checkoutSession;
/**
* @var CustomerRepository
*/
private $customerRepositoryCustom;
/**
* @var CustomerSession
*/
private $customerSessionCustom;
/**
* @var CustomerUrlManager
*/
private $customerUrlManager;
/**
* @var HttpContext
*/
private $httpContext;
/**
* @var \Magento\Quote\Api\CartRepositoryInterface
*/
private $quoteRepository;
/**
* @var QuoteItemRepository
*/
private $quoteItemRepository;
/**
* @var ShippingMethodManager
*/
private $shippingMethodManager;
/**
* @var ConfigurationPool
*/
private $configurationPool;
/**
* @param QuoteIdMaskFactory
*/
protected $quoteIdMaskFactory;
/**
* @var LocaleFormat
*/
protected $localeFormat;
/**
* @var \Magento\Customer\Model\Address\Mapper
*/
protected $addressMapper;
/**
* @var \Magento\Customer\Model\Address\Config
*/
protected $addressConfig;
/**
* @var FormKey
*/
protected $formKey;
/**
* @var \Magento\Catalog\Helper\Image
*/
protected $imageHelper;
/**
* @var \Magento\Framework\View\ConfigInterface
*/
protected $viewConfig;
/**
* @var \Magento\Directory\Model\Country\Postcode\ConfigInterface
*/
protected $postCodesConfig;
/**
* @var \Magento\Directory\Helper\Data
*/
protected $directoryHelper;
/**
* @var Cart\ImageProvider
*/
protected $imageProvider;
/**
* @var CartTotalRepositoryInterface
*/
protected $cartTotalRepository;
/**
* @var ScopeConfigInterface
*/
protected $scopeConfig;
/**
* @var \Magento\Shipping\Model\Config
*/
protected $shippingMethodConfig;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Quote\Api\PaymentMethodManagementInterface
*/
protected $paymentMethodManagement;
/**
* @var UrlInterface
*/
protected $urlBuilder;
/**
* @param CheckoutHelper $checkoutHelper
* @param Session $checkoutSession
* @param CustomerRepository $customerRepository
* @param CustomerSession $customerSession
* @param CustomerUrlManager $customerUrlManager
* @param HttpContext $httpContext
* @param \Magento\Quote\Api\CartRepositoryInterface $quoteRepository
* @param QuoteItemRepository $quoteItemRepository
* @param ShippingMethodManager $shippingMethodManager
* @param ConfigurationPool $configurationPool
* @param QuoteIdMaskFactory $quoteIdMaskFactory
* @param LocaleFormat $localeFormat
* @param \Magento\Customer\Model\Address\Mapper $addressMapper
* @param \Magento\Customer\Model\Address\Config $addressConfig
* @param FormKey $formKey
* @param \Magento\Catalog\Helper\Image $imageHelper
* @param \Magento\Framework\View\ConfigInterface $viewConfig
* @param \Magento\Directory\Model\Country\Postcode\ConfigInterface $postCodesConfig
* @param Cart\ImageProvider $imageProvider
* @param \Magento\Directory\Helper\Data $directoryHelper
* @param CartTotalRepositoryInterface $cartTotalRepository
* @param ScopeConfigInterface $scopeConfig
* @param \Magento\Shipping\Model\Config $shippingMethodConfig
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Quote\Api\PaymentMethodManagementInterface $paymentMethodManagement
* @param UrlInterface $urlBuilder
* @codeCoverageIgnore
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
CheckoutHelper $checkoutHelper,
CheckoutSession $checkoutSession,
CustomerRepository $customerRepository,
CustomerSession $customerSession,
CustomerUrlManager $customerUrlManager,
HttpContext $httpContext,
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
QuoteItemRepository $quoteItemRepository,
ShippingMethodManager $shippingMethodManager,
ConfigurationPool $configurationPool,
QuoteIdMaskFactory $quoteIdMaskFactory,
LocaleFormat $localeFormat,
\Magento\Customer\Model\Address\Mapper $addressMapper,
\Magento\Customer\Model\Address\Config $addressConfig,
FormKey $formKey,
\Magento\Catalog\Helper\Image $imageHelper,
\Magento\Framework\View\ConfigInterface $viewConfig,
\Magento\Directory\Model\Country\Postcode\ConfigInterface $postCodesConfig,
Cart\ImageProvider $imageProvider,
\Magento\Directory\Helper\Data $directoryHelper,
CartTotalRepositoryInterface $cartTotalRepository,
ScopeConfigInterface $scopeConfig,
\Magento\Shipping\Model\Config $shippingMethodConfig,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Quote\Api\PaymentMethodManagementInterface $paymentMethodManagement,
UrlInterface $urlBuilder
) {
$this->checkoutHelper = $checkoutHelper;
$this->checkoutSession = $checkoutSession;
$this->customerRepositoryCustom = $customerRepository;
$this->customerSessionCustom = $customerSession;
$this->customerUrlManager = $customerUrlManager;
$this->httpContext = $httpContext;
$this->quoteRepository = $quoteRepository;
$this->quoteItemRepository = $quoteItemRepository;
$this->shippingMethodManager = $shippingMethodManager;
$this->configurationPool = $configurationPool;
$this->quoteIdMaskFactory = $quoteIdMaskFactory;
$this->localeFormat = $localeFormat;
$this->addressMapper = $addressMapper;
$this->addressConfig = $addressConfig;
$this->formKey = $formKey;
$this->imageHelper = $imageHelper;
$this->viewConfig = $viewConfig;
$this->postCodesConfig = $postCodesConfig;
$this->imageProvider = $imageProvider;
$this->directoryHelper = $directoryHelper;
$this->cartTotalRepository = $cartTotalRepository;
$this->scopeConfig = $scopeConfig;
$this->shippingMethodConfig = $shippingMethodConfig;
$this->storeManager = $storeManager;
$this->paymentMethodManagement = $paymentMethodManagement;
$this->urlBuilder = $urlBuilder;
$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/templog_contruct.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
$logger->info("Info i get in extended constructor");
}
/**
* {@inheritdoc}
*/
public function getConfig()
{
$quoteId = $this->checkoutSession->getQuote()->getId();
$output['formKey'] = $this->formKey->getFormKey();
$output['customerData'] = $this->getCustomerDataCustom();
$output['quoteData'] = $this->getQuoteDataCustom();
$output['quoteItemData'] = $this->getQuoteItemDataCustom();
$output['isCustomerLoggedIn'] = $this->isCustomerLoggedInCustom();
$output['selectedShippingMethod'] = $this->getSelectedShippingMethodCustom();
$output['storeCode'] = $this->getStoreCodeCustom();
$output['isGuestCheckoutAllowed'] = $this->isGuestCheckoutAllowedCustom();
$output['registerUrl'] = $this->getRegisterUrl();
$output['checkoutUrl'] = $this->getCheckoutUrl();
$output['defaultSuccessPageUrl'] = $this->getDefaultSuccessPageUrl();
$output['pageNotFoundUrl'] = $this->pageNotFoundUrl();
$output['forgotPasswordUrl'] = $this->getForgotPasswordUrlCustom();
$output['staticBaseUrl'] = $this->getStaticBaseUrl();
$output['priceFormat'] = $this->localeFormat->getPriceFormat(
null,
$this->checkoutSession->getQuote()->getQuoteCurrencyCode()
);
$output['basePriceFormat'] = $this->localeFormat->getPriceFormat(
null,
$this->checkoutSession->getQuote()->getBaseCurrencyCode()
);
$output['postCodes'] = $this->postCodesConfig->getPostCodes();
$output['imageData'] = $this->imageProvider->getImages($quoteId);
$output['totalsData'] = $this->getTotalsDataCustom();
$output['shippingPolicy'] = [
'isEnabled' => $this->scopeConfig->isSetFlag(
'shipping/shipping_policy/enable_shipping_policy',
ScopeInterface::SCOPE_STORE
),
'shippingPolicyContent' => nl2br(
$this->scopeConfig->getValue(
'shipping/shipping_policy/shipping_policy_content',
ScopeInterface::SCOPE_STORE
)
)
];
$output['activeCarriers'] = $this->getActiveCarriersCustom();
$output['originCountryCode'] = $this->getOriginCountryCodeCustom();
$output['paymentMethods'] = $this->getPaymentMethodsCustom();
$output['autocomplete'] = $this->isAutocompleteEnabledCustom();
$output['displayBillingOnPaymentMethod'] = $this->checkoutHelper->isDisplayBillingOnPaymentMethodAvailable();
return $output;
}
/**
* Is autocomplete enabled for storefront
*
* @return string
* @codeCoverageIgnore
*/
private function isAutocompleteEnabledCustom()
{
return $this->scopeConfig->getValue(
\Magento\Customer\Model\Form::XML_PATH_ENABLE_AUTOCOMPLETE,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
) ? 'on' : 'off';
}
/**
* Retrieve customer data
*
* @return array
*/
private function getCustomerDataCustom()
{
$customerData = [];
if ($this->isCustomerLoggedIn()) {
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerObj = $objectManager->create('Magento\Customer\Model\Customer')->load($this->customerSessionCustom->getCustomerId());
$customerMasterId = $customerObj->getMasterId();
/*$customer = $this->customerRepository->getById($this->customerSession->getCustomerId()); */
$customer = $this->customerRepositoryCustom->getById($customerMasterId);
$customerData = $customer->__toArray();
foreach ($customer->getAddresses() as $key => $address) {
$customerData['addresses'][$key]['inline'] = $this->getCustomerAddressInline($address);
}
}
$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/templog.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
$logger->info(print_r($customerData,1));
return $customerData;
}
/**
* Set additional customer address data
*
* @param \Magento\Customer\Api\Data\AddressInterface $address
* @return string
*/
private function getCustomerAddressInlineCustom($address)
{
$builtOutputAddressData = $this->addressMapper->toFlatArray($address);
return $this->addressConfig
->getFormatByCode(\Magento\Customer\Model\Address\Config::DEFAULT_ADDRESS_FORMAT)
->getRenderer()
->renderArray($builtOutputAddressData);
}
/**
* Retrieve quote data
*
* @return array
*/
private function getQuoteDataCustom()
{
$quoteData = [];
if ($this->checkoutSession->getQuote()->getId()) {
$quote = $this->quoteRepository->get($this->checkoutSession->getQuote()->getId());
$quoteData = $quote->toArray();
$quoteData['is_virtual'] = $quote->getIsVirtual();
if (!$quote->getCustomer()->getId()) {
/** @var $quoteIdMask \Magento\Quote\Model\QuoteIdMask */
$quoteIdMask = $this->quoteIdMaskFactory->create();
$quoteData['entity_id'] = $quoteIdMask->load(
$this->checkoutSession->getQuote()->getId(),
'quote_id'
)->getMaskedId();
}
}
return $quoteData;
}
/**
* Retrieve quote item data
*
* @return array
*/
private function getQuoteItemDataCustom()
{
$quoteItemData = [];
$quoteId = $this->checkoutSession->getQuote()->getId();
if ($quoteId) {
$quoteItems = $this->quoteItemRepository->getList($quoteId);
foreach ($quoteItems as $index => $quoteItem) {
$quoteItemData[$index] = $quoteItem->toArray();
$quoteItemData[$index]['options'] = $this->getFormattedOptionValue($quoteItem);
$quoteItemData[$index]['thumbnail'] = $this->imageHelper->init(
$quoteItem->getProduct(),
'product_thumbnail_image'
)->getUrl();
}
}
return $quoteItemData;
}
/**
* Retrieve selected shipping method
*
* @return array|null
*/
private function getSelectedShippingMethodCustom()
{
$shippingMethodData = null;
try {
$quoteId = $this->checkoutSession->getQuote()->getId();
$shippingMethod = $this->shippingMethodManager->get($quoteId);
if ($shippingMethod) {
$shippingMethodData = $shippingMethod->__toArray();
}
} catch (\Exception $exception) {
$shippingMethodData = null;
}
return $shippingMethodData;
}
/**
* Retrieve store code
*
* @return string
* @codeCoverageIgnore
*/
private function getStoreCodeCustom()
{
return $this->checkoutSession->getQuote()->getStore()->getCode();
}
/**
* Check if guest checkout is allowed
*
* @return bool
* @codeCoverageIgnore
*/
private function isGuestCheckoutAllowedCustom()
{
return $this->checkoutHelper->isAllowedGuestCheckout($this->checkoutSession->getQuote());
}
/**
* Check if customer is logged in
*
* @return bool
* @codeCoverageIgnore
*/
private function isCustomerLoggedInCustom()
{
return (bool)$this->httpContext->getValue(CustomerContext::CONTEXT_AUTH);
}
/**
* Return forgot password URL
*
* @return string
* @codeCoverageIgnore
*/
private function getForgotPasswordUrlCustom()
{
return $this->customerUrlManager->getForgotPasswordUrl();
}
/**
* Return quote totals data
* @return array
*/
private function getTotalsDataCustom()
{
/** @var \Magento\Quote\Api\Data\TotalsInterface $totals */
$totals = $this->cartTotalRepository->get($this->checkoutSession->getQuote()->getId());
$items = [];
/** @var \Magento\Quote\Model\Cart\Totals\Item $item */
foreach ($totals->getItems() as $item) {
$items[] = $item->__toArray();
}
$totalSegmentsData = [];
/** @var \Magento\Quote\Model\Cart\TotalSegment $totalSegment */
foreach ($totals->getTotalSegments() as $totalSegment) {
$totalSegmentArray = $totalSegment->toArray();
if (is_object($totalSegment->getExtensionAttributes())) {
$totalSegmentArray['extension_attributes'] = $totalSegment->getExtensionAttributes()->__toArray();
}
$totalSegmentsData[] = $totalSegmentArray;
}
$totals->setItems($items);
$totals->setTotalSegments($totalSegmentsData);
$totalsArray = $totals->toArray();
if (is_object($totals->getExtensionAttributes())) {
$totalsArray['extension_attributes'] = $totals->getExtensionAttributes()->__toArray();
}
return $totalsArray;
}
/**
* Returns active carriers codes
* @return array
*/
private function getActiveCarriersCustom()
{
$activeCarriers = [];
foreach ($this->shippingMethodConfig->getActiveCarriers() as $carrier) {
$activeCarriers[] = $carrier->getCarrierCode();
}
return $activeCarriers;
}
/**
* Returns origin country code
* @return string
*/
private function getOriginCountryCodeCustom()
{
return $this->scopeConfig->getValue(
\Magento\Shipping\Model\Config::XML_PATH_ORIGIN_COUNTRY_ID,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
$this->storeManager->getStore()
);
}
/**
* Returns array of payment methods
* @return array
*/
private function getPaymentMethodsCustom()
{
$paymentMethods = [];
$quote = $this->checkoutSession->getQuote();
if ($quote->getIsVirtual()) {
foreach ($this->paymentMethodManagement->getList($quote->getId()) as $paymentMethod) {
$paymentMethods[] = [
'code' => $paymentMethod->getCode(),
'title' => $paymentMethod->getTitle()
];
}
}
return $paymentMethods;
}
}
Soluzione
You need to override those private members as well. I can see that function getCustomerData() use customerRepository and customerSession which are defined as private members in parent class.
Let me know if you still face any issue.