Page.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Cms\Block;
  7. use Magento\Store\Model\ScopeInterface;
  8. /**
  9. * Cms page content block
  10. *
  11. * @api
  12. * @since 100.0.2
  13. */
  14. class Page extends \Magento\Framework\View\Element\AbstractBlock implements
  15. \Magento\Framework\DataObject\IdentityInterface
  16. {
  17. /**
  18. * @var \Magento\Cms\Model\Template\FilterProvider
  19. */
  20. protected $_filterProvider;
  21. /**
  22. * @var \Magento\Cms\Model\Page
  23. */
  24. protected $_page;
  25. /**
  26. * Store manager
  27. *
  28. * @var \Magento\Store\Model\StoreManagerInterface
  29. */
  30. protected $_storeManager;
  31. /**
  32. * Page factory
  33. *
  34. * @var \Magento\Cms\Model\PageFactory
  35. */
  36. protected $_pageFactory;
  37. /**
  38. * @var \Magento\Framework\View\Page\Config
  39. */
  40. protected $pageConfig;
  41. /**
  42. * Construct
  43. *
  44. * @param \Magento\Framework\View\Element\Context $context
  45. * @param \Magento\Cms\Model\Page $page
  46. * @param \Magento\Cms\Model\Template\FilterProvider $filterProvider
  47. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  48. * @param \Magento\Cms\Model\PageFactory $pageFactory
  49. * @param \Magento\Framework\View\Page\Config $pageConfig
  50. * @param array $data
  51. */
  52. public function __construct(
  53. \Magento\Framework\View\Element\Context $context,
  54. \Magento\Cms\Model\Page $page,
  55. \Magento\Cms\Model\Template\FilterProvider $filterProvider,
  56. \Magento\Store\Model\StoreManagerInterface $storeManager,
  57. \Magento\Cms\Model\PageFactory $pageFactory,
  58. \Magento\Framework\View\Page\Config $pageConfig,
  59. array $data = []
  60. ) {
  61. parent::__construct($context, $data);
  62. // used singleton (instead factory) because there exist dependencies on \Magento\Cms\Helper\Page
  63. $this->_page = $page;
  64. $this->_filterProvider = $filterProvider;
  65. $this->_storeManager = $storeManager;
  66. $this->_pageFactory = $pageFactory;
  67. $this->pageConfig = $pageConfig;
  68. }
  69. /**
  70. * Retrieve Page instance
  71. *
  72. * @return \Magento\Cms\Model\Page
  73. */
  74. public function getPage()
  75. {
  76. if (!$this->hasData('page')) {
  77. if ($this->getPageId()) {
  78. /** @var \Magento\Cms\Model\Page $page */
  79. $page = $this->_pageFactory->create();
  80. $page->setStoreId($this->_storeManager->getStore()->getId())->load($this->getPageId(), 'identifier');
  81. } else {
  82. $page = $this->_page;
  83. }
  84. $this->setData('page', $page);
  85. }
  86. return $this->getData('page');
  87. }
  88. /**
  89. * Prepare global layout
  90. *
  91. * @return $this
  92. */
  93. protected function _prepareLayout()
  94. {
  95. $page = $this->getPage();
  96. $this->_addBreadcrumbs($page);
  97. $this->pageConfig->addBodyClass('cms-' . $page->getIdentifier());
  98. $metaTitle = $page->getMetaTitle();
  99. $this->pageConfig->getTitle()->set($metaTitle ? $metaTitle : $page->getTitle());
  100. $this->pageConfig->setKeywords($page->getMetaKeywords());
  101. $this->pageConfig->setDescription($page->getMetaDescription());
  102. $pageMainTitle = $this->getLayout()->getBlock('page.main.title');
  103. if ($pageMainTitle) {
  104. // Setting empty page title if content heading is absent
  105. $cmsTitle = $page->getContentHeading() ?: ' ';
  106. $pageMainTitle->setPageTitle($this->escapeHtml($cmsTitle));
  107. }
  108. return parent::_prepareLayout();
  109. }
  110. /**
  111. * Prepare breadcrumbs
  112. *
  113. * @param \Magento\Cms\Model\Page $page
  114. * @throws \Magento\Framework\Exception\LocalizedException
  115. * @return void
  116. */
  117. protected function _addBreadcrumbs(\Magento\Cms\Model\Page $page)
  118. {
  119. $homePageIdentifier = $this->_scopeConfig->getValue(
  120. 'web/default/cms_home_page',
  121. ScopeInterface::SCOPE_STORE
  122. );
  123. $homePageDelimiterPosition = strrpos($homePageIdentifier, '|');
  124. if ($homePageDelimiterPosition) {
  125. $homePageIdentifier = substr($homePageIdentifier, 0, $homePageDelimiterPosition);
  126. }
  127. $noRouteIdentifier = $this->_scopeConfig->getValue(
  128. 'web/default/cms_no_route',
  129. ScopeInterface::SCOPE_STORE
  130. );
  131. $noRouteDelimiterPosition = strrpos($noRouteIdentifier, '|');
  132. if ($noRouteDelimiterPosition) {
  133. $noRouteIdentifier = substr($noRouteIdentifier, 0, $noRouteDelimiterPosition);
  134. }
  135. if ($this->_scopeConfig->getValue('web/default/show_cms_breadcrumbs', ScopeInterface::SCOPE_STORE)
  136. && ($breadcrumbsBlock = $this->getLayout()->getBlock('breadcrumbs'))
  137. && $page->getIdentifier() !== $homePageIdentifier
  138. && $page->getIdentifier() !== $noRouteIdentifier
  139. ) {
  140. $breadcrumbsBlock->addCrumb(
  141. 'home',
  142. [
  143. 'label' => __('Home'),
  144. 'title' => __('Go to Home Page'),
  145. 'link' => $this->_storeManager->getStore()->getBaseUrl()
  146. ]
  147. );
  148. $breadcrumbsBlock->addCrumb('cms_page', ['label' => $page->getTitle(), 'title' => $page->getTitle()]);
  149. }
  150. }
  151. /**
  152. * Prepare HTML content
  153. *
  154. * @return string
  155. */
  156. protected function _toHtml()
  157. {
  158. $html = $this->_filterProvider->getPageFilter()->filter($this->getPage()->getContent());
  159. return $html;
  160. }
  161. /**
  162. * Return identifiers for produced content
  163. *
  164. * @return array
  165. */
  166. public function getIdentities()
  167. {
  168. return [\Magento\Cms\Model\Page::CACHE_TAG . '_' . $this->getPage()->getId()];
  169. }
  170. }