<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Block\Adminhtml\Order\View;
use Magento\Eav\Model\AttributeDataFactory;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Sales\Model\Order\Address;
/**
* @api
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @since 100.0.2
*/
class Info extends \Magento\Sales\Block\Adminhtml\Order\AbstractOrder
{
/**
* Customer service
*
* @var \Magento\Customer\Api\CustomerMetadataInterface
*/
protected $metadata;
/**
* Group service
*
* @var \Magento\Customer\Api\GroupRepositoryInterface
*/
protected $groupRepository;
/**
* Metadata element factory
*
* @var \Magento\Customer\Model\Metadata\ElementFactory
*/
protected $_metadataElementFactory;
/**
* @var Address\Renderer
*/
protected $addressRenderer;
/**
* Constructor
*
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Sales\Helper\Admin $adminHelper
* @param \Magento\Customer\Api\GroupRepositoryInterface $groupRepository
* @param \Magento\Customer\Api\CustomerMetadataInterface $metadata
* @param \Magento\Customer\Model\Metadata\ElementFactory $elementFactory
* @param \Magento\Sales\Model\Order\Address\Renderer $addressRenderer
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Sales\Helper\Admin $adminHelper,
\Magento\Customer\Api\GroupRepositoryInterface $groupRepository,
\Magento\Customer\Api\CustomerMetadataInterface $metadata,
\Magento\Customer\Model\Metadata\ElementFactory $elementFactory,
\Magento\Sales\Model\Order\Address\Renderer $addressRenderer,
array $data = []
) {
$this->groupRepository = $groupRepository;
$this->metadata = $metadata;
$this->_metadataElementFactory = $elementFactory;
$this->addressRenderer = $addressRenderer;
parent::__construct($context, $registry, $adminHelper, $data);
}
/**
* Retrieve required options from parent
*
* @throws \Magento\Framework\Exception\LocalizedException
* @return void
*/
protected function _beforeToHtml()
{
if (!$this->getParentBlock()) {
throw new \Magento\Framework\Exception\LocalizedException(
__('Please correct the parent block for this block.')
);
}
$this->setOrder($this->getParentBlock()->getOrder());
foreach ($this->getParentBlock()->getOrderInfoData() as $key => $value) {
$this->setDataUsingMethod($key, $value);
}
parent::_beforeToHtml();
}
/**
* Get order store name
*
* @return null|string
*/
public function getOrderStoreName()
{
if ($this->getOrder()) {
$storeId = $this->getOrder()->getStoreId();
if ($storeId === null) {
$deleted = __(' [deleted]');
return nl2br($this->getOrder()->getStoreName()) . $deleted;
}
$store = $this->_storeManager->getStore($storeId);
$name = [$store->getWebsite()->getName(), $store->getGroup()->getName(), $store->getName()];
return implode('<br/>', $name);
}
return null;
}
/**
* Return name of the customer group.
*
* @return string
*/
public function getCustomerGroupName()
{
if ($this->getOrder()) {
$customerGroupId = $this->getOrder()->getCustomerGroupId();
try {
if ($customerGroupId !== null) {
return $this->groupRepository->getById($customerGroupId)->getCode();
}
} catch (NoSuchEntityException $e) {
return '';
}
}
return '';
}
/**
* Get URL to edit the customer.
*
* @return string
*/
public function getCustomerViewUrl()
{
if ($this->getOrder()->getCustomerIsGuest() || !$this->getOrder()->getCustomerId()) {
return '';
}
return $this->getUrl('customer/index/edit', ['id' => $this->getOrder()->getCustomerId()]);
}
/**
* Get order view URL.
*
* @param int $orderId
* @return string
*/
public function getViewUrl($orderId)
{
return $this->getUrl('sales/order/view', ['order_id' => $orderId]);
}
/**
* Find sort order for account data
* Sort Order used as array key
*
* @param array $data
* @param int $sortOrder
* @return int
*/
protected function _prepareAccountDataSortOrder(array $data, $sortOrder)
{
if (isset($data[$sortOrder])) {
return $this->_prepareAccountDataSortOrder($data, $sortOrder + 1);
}
return $sortOrder;
}
/**
* Return array of additional account data
* Value is option style array
*
* @return array
*/
public function getCustomerAccountData()
{
$accountData = [];
$entityType = 'customer';
/* @var \Magento\Customer\Api\Data\AttributeMetadataInterface $attribute */
foreach ($this->metadata->getAllAttributesMetadata($entityType) as $attribute) {
if (!$attribute->isVisible() || $attribute->isSystem()) {
continue;
}
$orderKey = sprintf('customer_%s', $attribute->getAttributeCode());
$orderValue = $this->getOrder()->getData($orderKey);
if ($orderValue != '') {
$metadataElement = $this->_metadataElementFactory->create($attribute, $orderValue, $entityType);
$value = $metadataElement->outputValue(AttributeDataFactory::OUTPUT_FORMAT_HTML);
$sortOrder = $attribute->getSortOrder() + $attribute->isUserDefined() ? 200 : 0;
$sortOrder = $this->_prepareAccountDataSortOrder($accountData, $sortOrder);
$accountData[$sortOrder] = [
'label' => $attribute->getFrontendLabel(),
'value' => $this->escapeHtml($value, ['br']),
];
}
}
ksort($accountData, SORT_NUMERIC);
return $accountData;
}
/**
* Get link to edit order address page
*
* @param \Magento\Sales\Model\Order\Address $address
* @param string $label
* @return string
*/
public function getAddressEditLink($address, $label = '')
{
if ($this->_authorization->isAllowed('Magento_Sales::actions_edit')) {
if (empty($label)) {
$label = __('Edit');
}
$url = $this->getUrl('sales/order/address', ['address_id' => $address->getId()]);
return '<a href="' . $this->escapeUrl($url) . '">' . $this->escapeHtml($label) . '</a>';
}
return '';
}
/**
* Whether Customer IP address should be displayed on sales documents
*
* @return bool
*/
public function shouldDisplayCustomerIp()
{
return !$this->_scopeConfig->isSetFlag(
'sales/general/hide_customer_ip',
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
$this->getOrder()->getStoreId()
);
}
/**
* Check if is single store mode
*
* @return bool
*/
public function isSingleStoreMode()
{
return $this->_storeManager->isSingleStoreMode();
}
/**
* Get object created at date affected with object store timezone
*
* @param mixed $store
* @param string $createdAt
* @return \DateTime
*/
public function getCreatedAtStoreDate($store, $createdAt)
{
return $this->_localeDate->scopeDate($store, $createdAt, true);
}
/**
* Get timezone for store
*
* @param mixed $store
* @return string
*/
public function getTimezoneForStore($store)
{
return $this->_localeDate->getConfigTimezone(
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
$store->getCode()
);
}
/**
* Get object created at date
*
* @param string $createdAt
* @return \DateTime
*/
public function getOrderAdminDate($createdAt)
{
return $this->_localeDate->date(new \DateTime($createdAt));
}
/**
* Returns string with formatted address
*
* @param Address $address
* @return null|string
*/
public function getFormattedAddress(Address $address)
{
return $this->addressRenderer->format($address, 'html');
}
/**
* @inheritdoc
* @since 101.0.0
*/
public function getChildHtml($alias = '', $useCache = true)
{
$layout = $this->getLayout();
if ($alias || !$layout) {
return parent::getChildHtml($alias, $useCache);
}
$childNames = $layout->getChildNames($this->getNameInLayout());
$outputChildNames = array_diff($childNames, ['extra_customer_info']);
$out = '';
foreach ($outputChildNames as $childName) {
$out .= $layout->renderElement($childName, $useCache);
}
return $out;
}
}
|