| Current Path : /var/www/clients/client3/web2/web/vendor/magento/module-customer/Controller/Address/ |
| Current File : /var/www/clients/client3/web2/web/vendor/magento/module-customer/Controller/Address/FormPost.php |
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Customer\Controller\Address;
use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
use Magento\Customer\Api\AddressRepositoryInterface;
use Magento\Customer\Api\Data\AddressInterfaceFactory;
use Magento\Customer\Api\Data\RegionInterface;
use Magento\Customer\Api\Data\RegionInterfaceFactory;
use Magento\Customer\Model\Address\Mapper;
use Magento\Customer\Model\Metadata\FormFactory;
use Magento\Customer\Model\Session;
use Magento\Directory\Helper\Data as HelperData;
use Magento\Directory\Model\RegionFactory;
use Magento\Framework\Api\DataObjectHelper;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Controller\Result\ForwardFactory;
use Magento\Framework\Data\Form\FormKey\Validator as FormKeyValidator;
use Magento\Framework\Exception\InputException;
use Magento\Framework\Reflection\DataObjectProcessor;
use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\Filesystem;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Exception\NotFoundException;
/**
* Customer Address Form Post Controller
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class FormPost extends \Magento\Customer\Controller\Address implements HttpPostActionInterface
{
/**
* @var RegionFactory
*/
protected $regionFactory;
/**
* @var HelperData
*/
protected $helperData;
/**
* @var Mapper
*/
private $customerAddressMapper;
/**
* @var Filesystem
*/
private $filesystem;
/**
* @param Context $context
* @param Session $customerSession
* @param FormKeyValidator $formKeyValidator
* @param FormFactory $formFactory
* @param AddressRepositoryInterface $addressRepository
* @param AddressInterfaceFactory $addressDataFactory
* @param RegionInterfaceFactory $regionDataFactory
* @param DataObjectProcessor $dataProcessor
* @param DataObjectHelper $dataObjectHelper
* @param ForwardFactory $resultForwardFactory
* @param PageFactory $resultPageFactory
* @param RegionFactory $regionFactory
* @param HelperData $helperData
* @param Filesystem $filesystem
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Context $context,
Session $customerSession,
FormKeyValidator $formKeyValidator,
FormFactory $formFactory,
AddressRepositoryInterface $addressRepository,
AddressInterfaceFactory $addressDataFactory,
RegionInterfaceFactory $regionDataFactory,
DataObjectProcessor $dataProcessor,
DataObjectHelper $dataObjectHelper,
ForwardFactory $resultForwardFactory,
PageFactory $resultPageFactory,
RegionFactory $regionFactory,
HelperData $helperData,
Filesystem $filesystem = null
) {
$this->regionFactory = $regionFactory;
$this->helperData = $helperData;
$this->filesystem = $filesystem ?: ObjectManager::getInstance()->get(Filesystem::class);
parent::__construct(
$context,
$customerSession,
$formKeyValidator,
$formFactory,
$addressRepository,
$addressDataFactory,
$regionDataFactory,
$dataProcessor,
$dataObjectHelper,
$resultForwardFactory,
$resultPageFactory
);
}
/**
* Extract address from request
*
* @return \Magento\Customer\Api\Data\AddressInterface
*/
protected function _extractAddress()
{
$existingAddressData = $this->getExistingAddressData();
/** @var \Magento\Customer\Model\Metadata\Form $addressForm */
$addressForm = $this->_formFactory->create(
'customer_address',
'customer_address_edit',
$existingAddressData
);
$addressData = $addressForm->extractData($this->getRequest());
$attributeValues = $addressForm->compactData($addressData);
$this->updateRegionData($attributeValues);
$addressDataObject = $this->addressDataFactory->create();
$this->dataObjectHelper->populateWithArray(
$addressDataObject,
array_merge($existingAddressData, $attributeValues),
\Magento\Customer\Api\Data\AddressInterface::class
);
$addressDataObject->setCustomerId($this->_getSession()->getCustomerId())
->setIsDefaultBilling(
$this->getRequest()->getParam(
'default_billing',
isset($existingAddressData['default_billing']) ? $existingAddressData['default_billing'] : false
)
)
->setIsDefaultShipping(
$this->getRequest()->getParam(
'default_shipping',
isset($existingAddressData['default_shipping']) ? $existingAddressData['default_shipping'] : false
)
);
return $addressDataObject;
}
/**
* Retrieve existing address data
*
* @return array
* @throws \Exception
*/
protected function getExistingAddressData()
{
$existingAddressData = [];
if ($addressId = $this->getRequest()->getParam('id')) {
$existingAddress = $this->_addressRepository->getById($addressId);
if ($existingAddress->getCustomerId() !== $this->_getSession()->getCustomerId()) {
throw new NotFoundException(__('Address not found.'));
}
$existingAddressData = $this->getCustomerAddressMapper()->toFlatArray($existingAddress);
}
return $existingAddressData;
}
/**
* Update region data
*
* @param array $attributeValues
* @return void
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
protected function updateRegionData(&$attributeValues)
{
if (!empty($attributeValues['region_id'])) {
$newRegion = $this->regionFactory->create()->load($attributeValues['region_id']);
$attributeValues['region_code'] = $newRegion->getCode();
$attributeValues['region'] = $newRegion->getDefaultName();
}
$regionData = [
RegionInterface::REGION_ID => !empty($attributeValues['region_id']) ? $attributeValues['region_id'] : null,
RegionInterface::REGION => !empty($attributeValues['region']) ? $attributeValues['region'] : null,
RegionInterface::REGION_CODE => !empty($attributeValues['region_code'])
? $attributeValues['region_code']
: null,
];
$region = $this->regionDataFactory->create();
$this->dataObjectHelper->populateWithArray(
$region,
$regionData,
\Magento\Customer\Api\Data\RegionInterface::class
);
$attributeValues['region'] = $region;
}
/**
* Process address form save
*
* @return \Magento\Framework\Controller\Result\Redirect
*/
public function execute()
{
$redirectUrl = null;
if (!$this->_formKeyValidator->validate($this->getRequest())) {
return $this->resultRedirectFactory->create()->setPath('*/*/');
}
if (!$this->getRequest()->isPost()) {
$this->_getSession()->setAddressFormData($this->getRequest()->getPostValue());
return $this->resultRedirectFactory->create()->setUrl(
$this->_redirect->error($this->_buildUrl('*/*/edit'))
);
}
try {
$address = $this->_extractAddress();
if ($this->_request->getParam('delete_attribute_value')) {
$address = $this->deleteAddressFileAttribute($address);
}
$this->_addressRepository->save($address);
$this->messageManager->addSuccessMessage(__('You saved the address.'));
$url = $this->_buildUrl('*/*/index', ['_secure' => true]);
return $this->resultRedirectFactory->create()->setUrl($this->_redirect->success($url));
} catch (InputException $e) {
$this->messageManager->addErrorMessage($e->getMessage());
foreach ($e->getErrors() as $error) {
$this->messageManager->addErrorMessage($error->getMessage());
}
} catch (\Exception $e) {
$redirectUrl = $this->_buildUrl('*/*/index');
$this->messageManager->addExceptionMessage($e, __('We can\'t save the address.'));
}
$url = $redirectUrl;
if (!$redirectUrl) {
$this->_getSession()->setAddressFormData($this->getRequest()->getPostValue());
$url = $this->_buildUrl('*/*/edit', ['id' => $this->getRequest()->getParam('id')]);
}
return $this->resultRedirectFactory->create()->setUrl($this->_redirect->error($url));
}
/**
* Get Customer Address Mapper instance
*
* @return Mapper
*
* @deprecated 100.1.3
*/
private function getCustomerAddressMapper()
{
if ($this->customerAddressMapper === null) {
$this->customerAddressMapper = ObjectManager::getInstance()->get(
\Magento\Customer\Model\Address\Mapper::class
);
}
return $this->customerAddressMapper;
}
/**
* Removes file attribute from customer address and file from filesystem
*
* @param \Magento\Customer\Api\Data\AddressInterface $address
* @return mixed
*/
private function deleteAddressFileAttribute($address)
{
$attributeValue = $address->getCustomAttribute($this->_request->getParam('delete_attribute_value'));
if ($attributeValue!== null) {
if ($attributeValue->getValue() !== '') {
$mediaDirectory = $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA);
$fileName = $attributeValue->getValue();
$path = $mediaDirectory->getAbsolutePath('customer_address' . $fileName);
if ($fileName && $mediaDirectory->isFile($path)) {
$mediaDirectory->delete($path);
}
$address->setCustomAttribute(
$this->_request->getParam('delete_attribute_value'),
''
);
}
}
return $address;
}
}