diff --git a/app/code/Magento/Catalog/Helper/Product/View.php b/app/code/Magento/Catalog/Helper/Product/View.php index 4ccea0436f2d8..90027ffb65a58 100644 --- a/app/code/Magento/Catalog/Helper/Product/View.php +++ b/app/code/Magento/Catalog/Helper/Product/View.php @@ -113,10 +113,9 @@ private function preparePageMetadata(ResultPage $resultPage, $product) { $pageConfig = $resultPage->getConfig(); - $title = $product->getMetaTitle(); - if ($title) { - $pageConfig->getTitle()->set($title); - } + $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 e3ea9a58661f2..6f7a1c1c5fbb2 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 */ @@ -244,7 +254,7 @@ public function getMetadata() */ public function setContentType($contentType) { - $this->setMetadata('content_type', $contentType); + $this->setMetadata(self::META_CONTENT_TYPE, $contentType); } /** @@ -255,10 +265,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]; } /** @@ -267,7 +277,7 @@ public function getContentType() */ public function setMediaType($mediaType) { - $this->setMetadata('media_type', $mediaType); + $this->setMetadata(self::META_MEDIA_TYPE, $mediaType); } /** @@ -278,13 +288,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]; } /** @@ -293,7 +303,7 @@ public function getMediaType() */ public function setCharset($charset) { - $this->setMetadata('charset', $charset); + $this->setMetadata(self::META_CHARSET, $charset); } /** @@ -304,13 +314,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]; } /** @@ -319,7 +329,7 @@ public function getCharset() */ public function setDescription($description) { - $this->setMetadata('description', $description); + $this->setMetadata(self::META_DESCRIPTION, $description); } /** @@ -330,13 +340,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]; } /** @@ -345,7 +378,7 @@ public function getDescription() */ public function setKeywords($keywords) { - $this->setMetadata('keywords', $keywords); + $this->setMetadata(self::META_KEYWORDS, $keywords); } /** @@ -356,13 +389,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]; } /** @@ -371,27 +404,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 9563cbfbcc532..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,15 +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 (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; } /** @@ -153,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; @@ -352,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')