regionFactory = $regionFactory ?: ObjectManager::getInstance()->get(RegionFactory::class); $this->orderAddressRepository = $orderAddressRepository ?: ObjectManager::getInstance() ->get(OrderAddressRepositoryInterface::class); parent::__construct( $context, $coreRegistry, $fileFactory, $translateInline, $resultPageFactory, $resultJsonFactory, $resultLayoutFactory, $resultRawFactory, $orderManagement, $orderRepository, $logger ); $this->attributeMetadataDataProvider = $attributeMetadataDataProvider ?: ObjectManager::getInstance() ->get(AttributeMetadataDataProvider::class); } /** * Save order address * * @return Redirect */ public function execute() { $addressId = $this->getRequest()->getParam('address_id'); /** @var $address OrderAddressInterface|AddressModel */ $address = $this->_objectManager->create( OrderAddressInterface::class )->load($addressId); $data = $this->getRequest()->getPostValue(); $data = $this->truncateCustomFileAttributes($data); $data = $this->updateRegionData($data); $resultRedirect = $this->resultRedirectFactory->create(); if ($data && $address->getId()) { $address->addData($data); try { $this->orderAddressRepository->save($address); $this->_eventManager->dispatch( 'admin_sales_order_address_update', [ 'order_id' => $address->getParentId() ] ); $this->messageManager->addSuccessMessage(__('You updated the order address.')); return $resultRedirect->setPath('sales/*/view', ['order_id' => $address->getParentId()]); } catch (LocalizedException $e) { $this->messageManager->addErrorMessage($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addExceptionMessage($e, __('We can\'t update the order address right now.')); } return $resultRedirect->setPath('sales/*/address', ['address_id' => $address->getId()]); } else { return $resultRedirect->setPath('sales/*/'); } } /** * Update region data * * @param array $attributeValues * @return array */ private 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(); } return $attributeValues; } /** * Truncates custom file attributes from a request. * * As custom file type attributes are not working workaround is introduced. * * @param array $data * @return array */ private function truncateCustomFileAttributes(array $data): array { $foundArrays = []; foreach ($data as $value) { if (is_array($value)) { $foundArrays = $value; } } if (empty($foundArrays)) { return $data; } $attributesList = $this->attributeMetadataDataProvider->loadAttributesCollection( 'customer_address', 'adminhtml_customer_address' ); $attributesList->addFieldToFilter('is_user_defined', 1); $attributesList->addFieldToFilter('frontend_input', 'file'); foreach ($attributesList as $customFileAttribute) { unset($data[$customFileAttribute->getAttributeCode()]); } return $data; } }