_elementFactory = $elementFactory; $this->_countryFactory = $countryFactory; $this->_addressMetadataService = $metadataService; $this->addressMapper = $addressMapper; parent::__construct($context, $data); $this->_isScopePrivate = true; } /** * Retrieve format type object * * @return \Magento\Framework\DataObject */ public function getType() { return $this->_type; } /** * Retrieve format type object * * @param \Magento\Framework\DataObject $type * @return $this */ public function setType(\Magento\Framework\DataObject $type) { $this->_type = $type; return $this; } /** * @param AddressModelInterface|null $address * @return string * All new code should use renderArray based on Metadata service */ public function getFormat(AddressModelInterface $address = null) { $countryFormat = $address === null ? false : $address->getCountryModel()->getFormat( $this->getType()->getCode() ); $format = $countryFormat ? $countryFormat->getFormat() : $this->getType()->getDefaultFormat(); return $format; } /** * {@inheritdoc} * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function render(AddressModelInterface $address, $format = null) { $address = $address->getDataModel(0, 0); return $this->renderArray($this->addressMapper->toFlatArray($address), $format); } /** * {@inheritdoc} */ public function getFormatArray($addressAttributes = null) { $countryFormat = false; if ($addressAttributes && isset($addressAttributes['country_id'])) { /** @var \Magento\Directory\Model\Country $country */ $country = $this->_countryFactory->create()->load($addressAttributes['country_id']); $countryFormat = $country->getFormat($this->getType()->getCode()); } $format = $countryFormat ? $countryFormat->getFormat() : $this->getType()->getDefaultFormat(); return $format; } /** * {@inheritdoc} * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function renderArray($addressAttributes, $format = null) { switch ($this->getType()->getCode()) { case 'html': $dataFormat = ElementFactory::OUTPUT_FORMAT_HTML; break; case 'pdf': $dataFormat = ElementFactory::OUTPUT_FORMAT_PDF; break; case 'oneline': $dataFormat = ElementFactory::OUTPUT_FORMAT_ONELINE; break; default: $dataFormat = ElementFactory::OUTPUT_FORMAT_TEXT; break; } $attributesMetadata = $this->_addressMetadataService->getAllAttributesMetadata(); $data = []; foreach ($attributesMetadata as $attributeMetadata) { if (!$attributeMetadata->isVisible()) { continue; } $attributeCode = $attributeMetadata->getAttributeCode(); if ($attributeCode == 'country_id' && isset($addressAttributes['country_id'])) { $data['country'] = $this->_countryFactory->create()->loadByCode( $addressAttributes['country_id'] )->getName(); } elseif ($attributeCode == 'region' && isset($addressAttributes['region'])) { $data['region'] = __($addressAttributes['region']); } elseif (isset($addressAttributes[$attributeCode])) { $value = $addressAttributes[$attributeCode]; $dataModel = $this->_elementFactory->create($attributeMetadata, $value, 'customer_address'); $value = $dataModel->outputValue($dataFormat); if ($attributeMetadata->getFrontendInput() == 'multiline') { $values = $dataModel->outputValue(ElementFactory::OUTPUT_FORMAT_ARRAY); // explode lines foreach ($values as $k => $v) { $key = sprintf('%s%d', $attributeCode, $k + 1); $data[$key] = $v; } } $data[$attributeCode] = $value; } } if ($this->getType()->getEscapeHtml()) { foreach ($data as $key => $value) { $data[$key] = $this->escapeHtml($value); } } $format = $format !== null ? $format : $this->getFormatArray($addressAttributes); return $this->filterManager->template($format, ['variables' => $data]); } }