![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/app/code/Cnc/Customer/Preference/Controller/Account/ |
<?php /** * Copyright (c) 2020 Kaliop Digital Commerce (https://digitalcommerce.kaliop.com) All Rights Reserved. * https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * Cnc * Radosław Stępień <[email protected]> <[email protected]> */ namespace Cnc\Customer\Preference\Controller\Account; use Magento\Customer\Api\AccountManagementInterface; use Magento\Customer\Api\CustomerRepositoryInterface; use Magento\Customer\Api\Data\CustomerInterface; use Magento\Customer\Controller\Account\EditPost as OriginalEditPost; use Magento\Customer\Model\AddressRegistry; use Magento\Customer\Model\AuthenticationInterface; use Magento\Customer\Model\Customer\Mapper; use Magento\Customer\Model\CustomerExtractor; use Magento\Customer\Model\EmailNotificationInterface; use Magento\Customer\Model\Session; use Magento\Framework\App\Action\Context; use Magento\Framework\App\ObjectManager; use Magento\Framework\App\Request\InvalidRequestException; use Magento\Framework\App\RequestInterface; use Magento\Framework\Controller\Result\Redirect; use Magento\Framework\Data\Form\FormKey\Validator; use Magento\Framework\Escaper; use Magento\Framework\Exception\InputException; use Magento\Framework\Exception\InvalidEmailOrPasswordException; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Exception\State\UserLockedException; use Magento\Framework\Phrase; class EditPost extends OriginalEditPost { const CNC_CONTACT_ATTRIBUTES = [ 'cnc_purchasing_department_email', 'cnc_purchasing_department_phone', 'cnc_accounts_department_email', 'cnc_accounts_department_phone', 'cnc_technical_service_phone' ]; /** * Form code for data extractor */ const FORM_DATA_EXTRACTOR_CODE = 'customer_account_edit'; /** * @var AccountManagementInterface */ protected $customerAccountManagement; /** * @var CustomerRepositoryInterface */ protected $customerRepository; /** * @var Validator */ protected $formKeyValidator; /** * @var CustomerExtractor */ protected $customerExtractor; /** * @var Session */ protected $session; /** * @var \Magento\Customer\Model\EmailNotificationInterface */ private $emailNotification; /** * @var AuthenticationInterface */ private $authentication; /** * @var Mapper */ private $customerMapper; /** * @var Escaper */ private $escaper; /** * @var AddressRegistry */ private $addressRegistry; /** * EditPost constructor. * @param Context $context * @param Session $customerSession * @param AccountManagementInterface $customerAccountManagement * @param CustomerRepositoryInterface $customerRepository * @param Validator $formKeyValidator * @param CustomerExtractor $customerExtractor * @param Escaper|null $escaper * @param AddressRegistry|null $addressRegistry */ public function __construct( Context $context, Session $customerSession, AccountManagementInterface $customerAccountManagement, CustomerRepositoryInterface $customerRepository, Validator $formKeyValidator, CustomerExtractor $customerExtractor, ?Escaper $escaper = null, AddressRegistry $addressRegistry = null ) { parent::__construct( $context, $customerSession, $customerAccountManagement, $customerRepository, $formKeyValidator, $customerExtractor, $escaper, $addressRegistry ); $this->session = $customerSession; $this->customerAccountManagement = $customerAccountManagement; $this->customerRepository = $customerRepository; $this->formKeyValidator = $formKeyValidator; $this->customerExtractor = $customerExtractor; $this->escaper = $escaper ?: ObjectManager::getInstance()->get(Escaper::class); $this->addressRegistry = $addressRegistry ?: ObjectManager::getInstance()->get(AddressRegistry::class); } /** * Get authentication * * @return AuthenticationInterface */ private function getAuthentication() { if (!($this->authentication instanceof AuthenticationInterface)) { return ObjectManager::getInstance()->get( \Magento\Customer\Model\AuthenticationInterface::class ); } else { return $this->authentication; } } /** * Get email notification * * @return EmailNotificationInterface * @deprecated 100.1.0 */ private function getEmailNotification() { if (!($this->emailNotification instanceof EmailNotificationInterface)) { return ObjectManager::getInstance()->get( EmailNotificationInterface::class ); } else { return $this->emailNotification; } } /** * @inheritDoc */ public function createCsrfValidationException( RequestInterface $request ): ?InvalidRequestException { /** @var Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); $resultRedirect->setPath('*/*/edit'); return new InvalidRequestException( $resultRedirect, [new Phrase('Invalid Form Key. Please refresh the page.')] ); } /** * @inheritDoc */ public function validateForCsrf(RequestInterface $request): ?bool { return null; } public function execute() { /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); $validFormKey = $this->formKeyValidator->validate($this->getRequest()); if ($validFormKey && $this->getRequest()->isPost()) { $currentCustomerDataObject = $this->getCustomerDataObject($this->session->getCustomerId()); $customerCandidateDataObject = $this->populateNewCustomerDataObject( $this->_request, $currentCustomerDataObject ); try { // whether a customer enabled change email option $this->processChangeEmailRequest($currentCustomerDataObject); // whether a customer enabled change password option $isPasswordChanged = $this->changeCustomerPassword($currentCustomerDataObject->getEmail()); // No need to validate customer address while editing customer profile $this->disableAddressValidation($customerCandidateDataObject); //Fill already set prefix field to fix required field problem in custom edit forms if (!$customerCandidateDataObject->getPrefix()) { $customerCandidateDataObject->setPrefix($currentCustomerDataObject->getPrefix()); } $this->customerRepository->save($customerCandidateDataObject); $this->getEmailNotification()->credentialsChanged( $customerCandidateDataObject, $currentCustomerDataObject->getEmail(), $isPasswordChanged ); $this->dispatchSuccessEvent($customerCandidateDataObject); $this->messageManager->addSuccess(__('You saved the account information.')); return $resultRedirect->setPath('customer/account'); } catch (InvalidEmailOrPasswordException $e) { $this->messageManager->addErrorMessage($this->escaper->escapeHtml($e->getMessage())); } catch (UserLockedException $e) { $message = __( 'The account sign-in was incorrect or your account is disabled temporarily. ' . 'Please wait and try again later.' ); $this->session->logout(); $this->session->start(); $this->messageManager->addError($message); return $resultRedirect->setPath('customer/account/login'); } catch (InputException $e) { $this->messageManager->addErrorMessage($this->escaper->escapeHtml($e->getMessage())); foreach ($e->getErrors() as $error) { $this->messageManager->addErrorMessage($this->escaper->escapeHtml($error->getMessage())); } } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addException($e, __('We can\'t save the customer.')); } $this->session->setCustomerFormData($this->getRequest()->getPostValue()); } /** @var Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); $resultRedirect->setPath('*/*/edit'); return $resultRedirect; } /** * Account editing action completed successfully event * * @param \Magento\Customer\Api\Data\CustomerInterface $customerCandidateDataObject * @return void */ private function dispatchSuccessEvent(\Magento\Customer\Api\Data\CustomerInterface $customerCandidateDataObject) { $this->_eventManager->dispatch( 'customer_account_edited', ['email' => $customerCandidateDataObject->getEmail()] ); } /** * Get customer data object * * @param int $customerId * * @return \Magento\Customer\Api\Data\CustomerInterface */ private function getCustomerDataObject($customerId) { return $this->customerRepository->getById($customerId); } /** * Create Data Transfer Object of customer candidate * * @param \Magento\Framework\App\RequestInterface $inputData * @param \Magento\Customer\Api\Data\CustomerInterface $currentCustomerData * @return \Magento\Customer\Api\Data\CustomerInterface */ private function populateNewCustomerDataObject( \Magento\Framework\App\RequestInterface $inputData, \Magento\Customer\Api\Data\CustomerInterface $currentCustomerData ) { $attributeValues = $this->getCustomerMapper()->toFlatArray($currentCustomerData); $customerDto = $this->customerExtractor->extract( self::FORM_DATA_EXTRACTOR_CODE, $inputData, $attributeValues ); $customerDto->setId($currentCustomerData->getId()); if (!$customerDto->getAddresses()) { $customerDto->setAddresses($currentCustomerData->getAddresses()); } //KDC modification start: //1. need to change the phone on customer information page requires this override //2. keep old values for cnc attributes when no change request was called for them $addresses = $customerDto->getAddresses(); if ($inputData->getParam('change_telephone') && $addresses) { foreach ($addresses as $address) { if ($address->getId() == $customerDto->getDefaultBilling()) { $address->setTelephone($inputData->getParam('telephone')); } } $customerDto->setAddresses($addresses); } foreach (self::CNC_CONTACT_ATTRIBUTES as $attributeCode) { if (!$inputData->getParam($attributeCode . '_edit') && $currentCustomerData->getCustomAttribute($attributeCode)) { $customerDto->setCustomAttribute( $attributeCode, $currentCustomerData->getCustomAttribute($attributeCode)->getValue() ); } } //KDC modification ends if (!$inputData->getParam('change_email')) { $customerDto->setEmail($currentCustomerData->getEmail()); } return $customerDto; } /** * Change customer password * * @param string $email * @return boolean * @throws InvalidEmailOrPasswordException|InputException */ protected function changeCustomerPassword($email) { $isPasswordChanged = false; if ($this->getRequest()->getParam('change_password')) { $currPass = $this->getRequest()->getPost('current_password'); $newPass = $this->getRequest()->getPost('password'); $confPass = $this->getRequest()->getPost('password_confirmation'); if ($newPass != $confPass) { throw new InputException(__('Password confirmation doesn\'t match entered password.')); } $isPasswordChanged = $this->customerAccountManagement->changePassword($email, $currPass, $newPass); } return $isPasswordChanged; } /** * Process change email request * * @param \Magento\Customer\Api\Data\CustomerInterface $currentCustomerDataObject * @return void * @throws InvalidEmailOrPasswordException * @throws UserLockedException */ private function processChangeEmailRequest(\Magento\Customer\Api\Data\CustomerInterface $currentCustomerDataObject) { if ($this->getRequest()->getParam('change_email')) { // authenticate user for changing email try { $this->getAuthentication()->authenticate( $currentCustomerDataObject->getId(), $this->getRequest()->getPost('current_password') ); } catch (InvalidEmailOrPasswordException $e) { throw new InvalidEmailOrPasswordException( __("The password doesn't match this account. Verify the password and try again.") ); } } } /** * Get Customer Mapper instance * * @return Mapper * * @deprecated 100.1.3 */ private function getCustomerMapper() { if ($this->customerMapper === null) { $this->customerMapper = ObjectManager::getInstance()->get(\Magento\Customer\Model\Customer\Mapper::class); } return $this->customerMapper; } /** * Disable Customer Address Validation * * @param CustomerInterface $customer * @throws NoSuchEntityException */ private function disableAddressValidation($customer) { foreach ($customer->getAddresses() as $address) { $addressModel = $this->addressRegistry->retrieve($address->getId()); $addressModel->setShouldIgnoreValidation(true); } } }