mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 17:27:36 +00:00
201 lines
6.8 KiB
PHP
201 lines
6.8 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
namespace Magento\Customer\Controller\Adminhtml\Address;
|
|
|
|
use Magento\Backend\App\Action;
|
|
use Magento\Customer\Model\CustomerRegistry;
|
|
use Magento\Framework\App\Action\HttpPostActionInterface;
|
|
use Magento\Framework\App\ObjectManager;
|
|
use Magento\Framework\Controller\Result\Json;
|
|
use Magento\Framework\Controller\Result\JsonFactory;
|
|
use Magento\Framework\Exception\LocalizedException;
|
|
use Magento\Framework\Exception\NoSuchEntityException;
|
|
use Magento\Store\Model\StoreManagerInterface;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
/**
|
|
* Class for saving of customer address
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class Save extends Action implements HttpPostActionInterface
|
|
{
|
|
/**
|
|
* Authorization level of a basic admin session
|
|
*
|
|
* @see _isAllowed()
|
|
*/
|
|
public const ADMIN_RESOURCE = 'Magento_Customer::manage';
|
|
|
|
/**
|
|
* @var \Magento\Customer\Api\AddressRepositoryInterface
|
|
*/
|
|
private $addressRepository;
|
|
|
|
/**
|
|
* @var \Magento\Customer\Model\Metadata\FormFactory
|
|
*/
|
|
private $formFactory;
|
|
|
|
/**
|
|
* @var \Magento\Customer\Api\CustomerRepositoryInterface
|
|
*/
|
|
private $customerRepository;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Api\DataObjectHelper
|
|
*/
|
|
private $dataObjectHelper;
|
|
|
|
/**
|
|
* @var \Magento\Customer\Api\Data\AddressInterfaceFactory
|
|
*/
|
|
private $addressDataFactory;
|
|
|
|
/**
|
|
* @var LoggerInterface
|
|
*/
|
|
private $logger;
|
|
|
|
/**
|
|
* @var JsonFactory
|
|
*/
|
|
private $resultJsonFactory;
|
|
|
|
/**
|
|
* @var StoreManagerInterface
|
|
*/
|
|
private $storeManager;
|
|
|
|
/**
|
|
* @var CustomerRegistry
|
|
*/
|
|
private $customerRegistry;
|
|
|
|
/**
|
|
* @param Action\Context $context
|
|
* @param \Magento\Customer\Api\AddressRepositoryInterface $addressRepository
|
|
* @param \Magento\Customer\Model\Metadata\FormFactory $formFactory
|
|
* @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
|
|
* @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
|
|
* @param \Magento\Customer\Api\Data\AddressInterfaceFactory $addressDataFactory
|
|
* @param LoggerInterface $logger
|
|
* @param JsonFactory $resultJsonFactory
|
|
* @param StoreManagerInterface|null $storeManager
|
|
* @param CustomerRegistry|null $customerRegistry
|
|
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
|
|
*/
|
|
public function __construct(
|
|
Action\Context $context,
|
|
\Magento\Customer\Api\AddressRepositoryInterface $addressRepository,
|
|
\Magento\Customer\Model\Metadata\FormFactory $formFactory,
|
|
\Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
|
|
\Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
|
|
\Magento\Customer\Api\Data\AddressInterfaceFactory $addressDataFactory,
|
|
LoggerInterface $logger,
|
|
JsonFactory $resultJsonFactory,
|
|
?StoreManagerInterface $storeManager = null,
|
|
?CustomerRegistry $customerRegistry = null
|
|
) {
|
|
parent::__construct($context);
|
|
$this->addressRepository = $addressRepository;
|
|
$this->formFactory = $formFactory;
|
|
$this->customerRepository = $customerRepository;
|
|
$this->dataObjectHelper = $dataObjectHelper;
|
|
$this->addressDataFactory = $addressDataFactory;
|
|
$this->logger = $logger;
|
|
$this->resultJsonFactory = $resultJsonFactory;
|
|
$this->storeManager = $storeManager
|
|
?? ObjectManager::getInstance()->get(StoreManagerInterface::class);
|
|
$this->customerRegistry = $customerRegistry
|
|
?? ObjectManager::getInstance()->get(CustomerRegistry::class);
|
|
}
|
|
|
|
/**
|
|
* Save customer address action
|
|
*
|
|
* @return Json
|
|
*/
|
|
public function execute(): Json
|
|
{
|
|
$customerId = $this->getRequest()->getParam('parent_id', false);
|
|
$addressId = $this->getRequest()->getParam('entity_id', false);
|
|
|
|
$error = false;
|
|
try {
|
|
$customerModel = $this->customerRegistry->retrieve($customerId);
|
|
if ($customerModel->getStoreId()) {
|
|
$this->storeManager->setCurrentStore($customerModel->getStoreId());
|
|
}
|
|
/** @var \Magento\Customer\Api\Data\CustomerInterface $customer */
|
|
$customer = $this->customerRepository->getById($customerId);
|
|
|
|
$addressForm = $this->formFactory->create(
|
|
'customer_address',
|
|
'adminhtml_customer_address',
|
|
[],
|
|
false,
|
|
false
|
|
);
|
|
$addressData = $addressForm->extractData($this->getRequest());
|
|
$addressData = $addressForm->compactData($addressData);
|
|
|
|
$addressData['region'] = [
|
|
'region' => $addressData['region'] ?? null,
|
|
'region_id' => $addressData['region_id'] ?? null,
|
|
];
|
|
$addressToSave = $this->addressDataFactory->create();
|
|
$this->dataObjectHelper->populateWithArray(
|
|
$addressToSave,
|
|
$addressData,
|
|
\Magento\Customer\Api\Data\AddressInterface::class
|
|
);
|
|
$addressToSave->setCustomerId($customer->getId());
|
|
$addressToSave->setIsDefaultBilling(
|
|
(bool)$this->getRequest()->getParam('default_billing', false)
|
|
);
|
|
$addressToSave->setIsDefaultShipping(
|
|
(bool)$this->getRequest()->getParam('default_shipping', false)
|
|
);
|
|
if ($addressId) {
|
|
$addressToSave->setId($addressId);
|
|
$message = __('Customer address has been updated.');
|
|
} else {
|
|
$addressToSave->setId(null);
|
|
$message = __('New customer address has been added.');
|
|
}
|
|
$savedAddress = $this->addressRepository->save($addressToSave);
|
|
$addressId = $savedAddress->getId();
|
|
} catch (NoSuchEntityException $e) {
|
|
$this->logger->critical($e);
|
|
$error = true;
|
|
$message = __('There is no customer with such id.');
|
|
} catch (LocalizedException $e) {
|
|
$error = true;
|
|
$message = __($e->getMessage());
|
|
$this->logger->critical($e);
|
|
} catch (\Exception $e) {
|
|
$error = true;
|
|
$message = __('We can\'t change customer address right now.');
|
|
$this->logger->critical($e);
|
|
}
|
|
|
|
$addressId = empty($addressId) ? null : $addressId;
|
|
$resultJson = $this->resultJsonFactory->create();
|
|
$resultJson->setData(
|
|
[
|
|
'messages' => $message,
|
|
'error' => $error,
|
|
'data' => [
|
|
'entity_id' => $addressId
|
|
]
|
|
]
|
|
);
|
|
|
|
return $resultJson;
|
|
}
|
|
}
|