Page.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Cms\Helper;
  7. use Magento\Framework\App\Action\Action;
  8. /**
  9. * CMS Page Helper
  10. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  11. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  12. * @SuppressWarnings(PHPMD.NPathComplexity)
  13. */
  14. class Page extends \Magento\Framework\App\Helper\AbstractHelper
  15. {
  16. /**
  17. * CMS no-route config path
  18. */
  19. const XML_PATH_NO_ROUTE_PAGE = 'web/default/cms_no_route';
  20. /**
  21. * CMS no cookies config path
  22. */
  23. const XML_PATH_NO_COOKIES_PAGE = 'web/default/cms_no_cookies';
  24. /**
  25. * CMS home page config path
  26. */
  27. const XML_PATH_HOME_PAGE = 'web/default/cms_home_page';
  28. /**
  29. * Design package instance
  30. *
  31. * @var \Magento\Framework\View\DesignInterface
  32. */
  33. protected $_design;
  34. /**
  35. * @var \Magento\Cms\Model\Page
  36. */
  37. protected $_page;
  38. /**
  39. * @var \Magento\Framework\Message\ManagerInterface
  40. */
  41. protected $messageManager;
  42. /**
  43. * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface
  44. */
  45. protected $_localeDate;
  46. /**
  47. * Store manager
  48. *
  49. * @var \Magento\Store\Model\StoreManagerInterface
  50. */
  51. protected $_storeManager;
  52. /**
  53. * Page factory
  54. *
  55. * @var \Magento\Cms\Model\PageFactory
  56. */
  57. protected $_pageFactory;
  58. /**
  59. * @var \Magento\Framework\Escaper
  60. */
  61. protected $_escaper;
  62. /**
  63. * @var \Magento\Framework\View\Result\PageFactory
  64. */
  65. protected $resultPageFactory;
  66. /**
  67. * Constructor
  68. *
  69. * @param \Magento\Framework\App\Helper\Context $context
  70. * @param \Magento\Framework\Message\ManagerInterface $messageManager
  71. * @param \Magento\Cms\Model\Page $page
  72. * @param \Magento\Framework\View\DesignInterface $design
  73. * @param \Magento\Cms\Model\PageFactory $pageFactory
  74. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  75. * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
  76. * @param \Magento\Framework\Escaper $escaper
  77. * @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
  78. * @SuppressWarnings(PHPMD.ExcessiveParameterList)
  79. */
  80. public function __construct(
  81. \Magento\Framework\App\Helper\Context $context,
  82. \Magento\Framework\Message\ManagerInterface $messageManager,
  83. \Magento\Cms\Model\Page $page,
  84. \Magento\Framework\View\DesignInterface $design,
  85. \Magento\Cms\Model\PageFactory $pageFactory,
  86. \Magento\Store\Model\StoreManagerInterface $storeManager,
  87. \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
  88. \Magento\Framework\Escaper $escaper,
  89. \Magento\Framework\View\Result\PageFactory $resultPageFactory
  90. ) {
  91. $this->messageManager = $messageManager;
  92. $this->_page = $page;
  93. $this->_design = $design;
  94. $this->_pageFactory = $pageFactory;
  95. $this->_storeManager = $storeManager;
  96. $this->_localeDate = $localeDate;
  97. $this->_escaper = $escaper;
  98. $this->resultPageFactory = $resultPageFactory;
  99. parent::__construct($context);
  100. }
  101. /**
  102. * Return result CMS page
  103. *
  104. * @param Action $action
  105. * @param int $pageId
  106. * @return \Magento\Framework\View\Result\Page|bool
  107. */
  108. public function prepareResultPage(Action $action, $pageId = null)
  109. {
  110. if ($pageId !== null && $pageId !== $this->_page->getId()) {
  111. $delimiterPosition = strrpos($pageId, '|');
  112. if ($delimiterPosition) {
  113. $pageId = substr($pageId, 0, $delimiterPosition);
  114. }
  115. $this->_page->setStoreId($this->_storeManager->getStore()->getId());
  116. if (!$this->_page->load($pageId)) {
  117. return false;
  118. }
  119. }
  120. if (!$this->_page->getId()) {
  121. return false;
  122. }
  123. $inRange = $this->_localeDate->isScopeDateInInterval(
  124. null,
  125. $this->_page->getCustomThemeFrom(),
  126. $this->_page->getCustomThemeTo()
  127. );
  128. if ($this->_page->getCustomTheme()) {
  129. if ($inRange) {
  130. $this->_design->setDesignTheme($this->_page->getCustomTheme());
  131. }
  132. }
  133. /** @var \Magento\Framework\View\Result\Page $resultPage */
  134. $resultPage = $this->resultPageFactory->create();
  135. $this->setLayoutType($inRange, $resultPage);
  136. $resultPage->addHandle('cms_page_view');
  137. $resultPage->addPageLayoutHandles(['id' => str_replace('/', '_', $this->_page->getIdentifier())]);
  138. $this->_eventManager->dispatch(
  139. 'cms_page_render',
  140. ['page' => $this->_page, 'controller_action' => $action, 'request' => $this->_getRequest()]
  141. );
  142. if ($this->_page->getCustomLayoutUpdateXml() && $inRange) {
  143. $layoutUpdate = $this->_page->getCustomLayoutUpdateXml();
  144. } else {
  145. $layoutUpdate = $this->_page->getLayoutUpdateXml();
  146. }
  147. if (!empty($layoutUpdate)) {
  148. $resultPage->getLayout()->getUpdate()->addUpdate($layoutUpdate);
  149. }
  150. $contentHeadingBlock = $resultPage->getLayout()->getBlock('page_content_heading');
  151. if ($contentHeadingBlock) {
  152. $contentHeading = $this->_escaper->escapeHtml($this->_page->getContentHeading());
  153. $contentHeadingBlock->setContentHeading($contentHeading);
  154. }
  155. return $resultPage;
  156. }
  157. /**
  158. * Retrieve page direct URL
  159. *
  160. * @param string $pageId
  161. * @return string
  162. */
  163. public function getPageUrl($pageId = null)
  164. {
  165. /** @var \Magento\Cms\Model\Page $page */
  166. $page = $this->_pageFactory->create();
  167. if ($pageId !== null && $pageId !== $page->getId()) {
  168. $page->setStoreId($this->_storeManager->getStore()->getId());
  169. $page->load($pageId);
  170. }
  171. if (!$page->getId()) {
  172. return null;
  173. }
  174. return $this->_urlBuilder->getUrl(null, ['_direct' => $page->getIdentifier()]);
  175. }
  176. /**
  177. * Set layout type
  178. *
  179. * @param bool $inRange
  180. * @param \Magento\Framework\View\Result\Page $resultPage
  181. * @return \Magento\Framework\View\Result\Page
  182. */
  183. protected function setLayoutType($inRange, $resultPage)
  184. {
  185. if ($this->_page->getPageLayout()) {
  186. if ($this->_page->getCustomPageLayout()
  187. && $this->_page->getCustomPageLayout() != 'empty'
  188. && $inRange
  189. ) {
  190. $handle = $this->_page->getCustomPageLayout();
  191. } else {
  192. $handle = $this->_page->getPageLayout();
  193. }
  194. $resultPage->getConfig()->setPageLayout($handle);
  195. }
  196. return $resultPage;
  197. }
  198. }