diff --git a/app/code/Magento/Catalog/Helper/Product/View.php b/app/code/Magento/Catalog/Helper/Product/View.php index 5753910c125d2..1509e489aee3b 100644 --- a/app/code/Magento/Catalog/Helper/Product/View.php +++ b/app/code/Magento/Catalog/Helper/Product/View.php @@ -112,12 +112,9 @@ private function preparePageMetadata(ResultPage $resultPage, $product) $pageLayout = $resultPage->getLayout(); $pageConfig = $resultPage->getConfig(); - $title = $product->getMetaTitle(); - if ($title) { - $pageConfig->getTitle()->set($title); - } else { - $pageConfig->getTitle()->set($product->getName()); - } + $metaTitle = $product->getMetaTitle(); + $pageConfig->setMetaTitle($metaTitle); + $pageConfig->getTitle()->set($metaTitle ?: $product->getName()); $keyword = $product->getMetaKeyword(); $currentCategory = $this->_coreRegistry->registry('current_category'); diff --git a/lib/internal/Magento/Framework/View/Page/Config.php b/lib/internal/Magento/Framework/View/Page/Config.php index d42d30e35cc5b..b9f72e49b28a7 100644 --- a/lib/internal/Magento/Framework/View/Page/Config.php +++ b/lib/internal/Magento/Framework/View/Page/Config.php @@ -7,6 +7,7 @@ namespace Magento\Framework\View\Page; use Magento\Framework\App; +use Magento\Framework\App\Area; use Magento\Framework\View; /** @@ -34,6 +35,15 @@ class Config const ELEMENT_TYPE_HEAD = 'head'; /**#@-*/ + const META_DESCRIPTION = 'description'; + const META_CONTENT_TYPE = 'content_type'; + const META_MEDIA_TYPE = 'media_type'; + const META_CHARSET = 'charset'; + const META_TITLE = 'title'; + const META_KEYWORDS = 'keywords'; + const META_ROBOTS = 'robots'; + const META_X_UI_COMPATIBLE = 'x_ua_compatible'; + /** * Constant body attribute class */ @@ -245,7 +255,7 @@ public function getMetadata() */ public function setContentType($contentType) { - $this->setMetadata('content_type', $contentType); + $this->setMetadata(self::META_CONTENT_TYPE, $contentType); } /** @@ -256,10 +266,10 @@ public function setContentType($contentType) public function getContentType() { $this->build(); - if (strtolower($this->metadata['content_type']) === 'auto') { - $this->metadata['content_type'] = $this->getMediaType() . '; charset=' . $this->getCharset(); + if (strtolower($this->metadata[self::META_CONTENT_TYPE]) === 'auto') { + $this->metadata[self::META_CONTENT_TYPE] = $this->getMediaType() . '; charset=' . $this->getCharset(); } - return $this->metadata['content_type']; + return $this->metadata[self::META_CONTENT_TYPE]; } /** @@ -268,7 +278,7 @@ public function getContentType() */ public function setMediaType($mediaType) { - $this->setMetadata('media_type', $mediaType); + $this->setMetadata(self::META_MEDIA_TYPE, $mediaType); } /** @@ -279,13 +289,13 @@ public function setMediaType($mediaType) public function getMediaType() { $this->build(); - if (empty($this->metadata['media_type'])) { - $this->metadata['media_type'] = $this->scopeConfig->getValue( + if (empty($this->metadata[self::META_MEDIA_TYPE])) { + $this->metadata[self::META_MEDIA_TYPE] = $this->scopeConfig->getValue( 'design/head/default_media_type', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); } - return $this->metadata['media_type']; + return $this->metadata[self::META_MEDIA_TYPE]; } /** @@ -294,7 +304,7 @@ public function getMediaType() */ public function setCharset($charset) { - $this->setMetadata('charset', $charset); + $this->setMetadata(self::META_CHARSET, $charset); } /** @@ -305,13 +315,13 @@ public function setCharset($charset) public function getCharset() { $this->build(); - if (empty($this->metadata['charset'])) { - $this->metadata['charset'] = $this->scopeConfig->getValue( + if (empty($this->metadata[self::META_CHARSET])) { + $this->metadata[self::META_CHARSET] = $this->scopeConfig->getValue( 'design/head/default_charset', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); } - return $this->metadata['charset']; + return $this->metadata[self::META_CHARSET]; } /** @@ -320,7 +330,7 @@ public function getCharset() */ public function setDescription($description) { - $this->setMetadata('description', $description); + $this->setMetadata(self::META_DESCRIPTION, $description); } /** @@ -331,13 +341,36 @@ public function setDescription($description) public function getDescription() { $this->build(); - if (empty($this->metadata['description'])) { - $this->metadata['description'] = $this->scopeConfig->getValue( + if (empty($this->metadata[self::META_DESCRIPTION])) { + $this->metadata[self::META_DESCRIPTION] = $this->scopeConfig->getValue( 'design/head/default_description', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); } - return $this->metadata['description']; + return $this->metadata[self::META_DESCRIPTION]; + } + + /** + * @param string $title + */ + public function setMetaTitle($title) + { + $this->setMetadata(self::META_TITLE, $title); + } + + /** + * Retrieve meta title + * + * @return string + */ + public function getMetaTitle() + { + $this->build(); + if (empty($this->metadata[self::META_TITLE])) { + return ''; + } + + return $this->metadata[self::META_TITLE]; } /** @@ -346,7 +379,7 @@ public function getDescription() */ public function setKeywords($keywords) { - $this->setMetadata('keywords', $keywords); + $this->setMetadata(self::META_KEYWORDS, $keywords); } /** @@ -357,13 +390,13 @@ public function setKeywords($keywords) public function getKeywords() { $this->build(); - if (empty($this->metadata['keywords'])) { - $this->metadata['keywords'] = $this->scopeConfig->getValue( + if (empty($this->metadata[self::META_KEYWORDS])) { + $this->metadata[self::META_KEYWORDS] = $this->scopeConfig->getValue( 'design/head/default_keywords', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); } - return $this->metadata['keywords']; + return $this->metadata[self::META_KEYWORDS]; } /** @@ -372,27 +405,28 @@ public function getKeywords() */ public function setRobots($robots) { - $this->setMetadata('robots', $robots); + $this->setMetadata(self::META_ROBOTS, $robots); } /** * Retrieve URL to robots file * * @return string + * @throws \Magento\Framework\Exception\LocalizedException */ public function getRobots() { - if ($this->getAreaResolver()->getAreaCode() !== 'frontend') { + if ($this->getAreaResolver()->getAreaCode() !== Area::AREA_FRONTEND) { return 'NOINDEX,NOFOLLOW'; } $this->build(); - if (empty($this->metadata['robots'])) { - $this->metadata['robots'] = $this->scopeConfig->getValue( + if (empty($this->metadata[self::META_ROBOTS])) { + $this->metadata[self::META_ROBOTS] = $this->scopeConfig->getValue( 'design/search_engine_robots/default_robots', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); } - return $this->metadata['robots']; + return $this->metadata[self::META_ROBOTS]; } /** diff --git a/lib/internal/Magento/Framework/View/Page/Config/Renderer.php b/lib/internal/Magento/Framework/View/Page/Config/Renderer.php index 93c8c5c338627..183f8d34ee41f 100644 --- a/lib/internal/Magento/Framework/View/Page/Config/Renderer.php +++ b/lib/internal/Magento/Framework/View/Page/Config/Renderer.php @@ -3,8 +3,10 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ + namespace Magento\Framework\View\Page\Config; +use Magento\Framework\Exception\LocalizedException; use Magento\Framework\View\Asset\GroupedCollection; use Magento\Framework\View\Page\Config; @@ -21,7 +23,7 @@ class Renderer implements RendererInterface protected $assetTypeOrder = ['css', 'ico', 'js']; /** - * @var \Magento\Framework\View\Page\Config + * @var Config */ protected $pageConfig; @@ -51,7 +53,7 @@ class Renderer implements RendererInterface protected $urlBuilder; /** - * @param \Magento\Framework\View\Page\Config $pageConfig + * @param Config $pageConfig * @param \Magento\Framework\View\Asset\MergeService $assetMergeService * @param \Magento\Framework\UrlInterface $urlBuilder * @param \Magento\Framework\Escaper $escaper @@ -131,21 +133,35 @@ public function renderMetadata() /** * @param string $name * @param string $content - * @return mixed + * @return string */ protected function processMetadataContent($name, $content) { - $method = 'get' . $this->string->upperCaseWords($name, '_', ''); - if ($name === 'title') { - if (!$content) { - $content = $this->escaper->escapeHtml($this->pageConfig->$method()->get()); - } - return $content; - } - if (method_exists($this->pageConfig, $method)) { - $content = $this->pageConfig->$method(); + switch ($name) { + case Config::META_DESCRIPTION: + return $this->pageConfig->getDescription(); + + case Config::META_CONTENT_TYPE: + return $this->pageConfig->getContentType(); + + case Config::META_MEDIA_TYPE: + return $this->pageConfig->getMediaType(); + + case Config::META_CHARSET: + return $this->pageConfig->getCharset(); + + case Config::META_KEYWORDS: + return $this->pageConfig->getKeywords(); + + case Config::META_ROBOTS: + return $this->pageConfig->getRobots(); + + case Config::META_TITLE: + return $this->pageConfig->getMetaTitle(); + + default: + return $content; } - return $content; } /** @@ -159,19 +175,19 @@ protected function getMetadataTemplate($name) } switch ($name) { - case 'charset': + case Config::META_CHARSET: $metadataTemplate = '' . "\n"; break; - case 'content_type': + case Config::META_CONTENT_TYPE: $metadataTemplate = '' . "\n"; break; - case 'x_ua_compatible': + case Config::META_X_UI_COMPATIBLE: $metadataTemplate = '' . "\n"; break; - case 'media_type': + case Config::META_MEDIA_TYPE: $metadataTemplate = false; break; @@ -358,7 +374,7 @@ protected function renderAssetHtml(\Magento\Framework\View\Asset\PropertyGroup $ ); $result .= sprintf($template, $asset->getUrl()); } - } catch (\Magento\Framework\Exception\LocalizedException $e) { + } catch (LocalizedException $e) { $this->logger->critical($e); $result .= sprintf($template, $this->urlBuilder->getUrl('', ['_direct' => 'core/index/notFound'])); } diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/RendererTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/RendererTest.php index 1f110a9ec19b5..adb7c4f4ddd86 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/RendererTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/RendererTest.php @@ -157,15 +157,14 @@ public function testRenderMetadata() . '' . "\n" . '' . "\n"; - $this->stringMock->expects($this->at(0)) - ->method('upperCaseWords') - ->with('charset', '_', '') - ->willReturn('Charset'); - $this->pageConfigMock->expects($this->once()) ->method('getCharset') ->willReturn($metadataValueCharset); + $this->pageConfigMock->expects($this->once()) + ->method('getContentType') + ->willReturn('content_type_value'); + $this->pageConfigMock ->expects($this->once()) ->method('getMetadata')