Chooser.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Cms\Block\Adminhtml\Page\Widget;
  7. /**
  8. * CMS page chooser for Wysiwyg CMS widget
  9. *
  10. * @author Magento Core Team <core@magentocommerce.com>
  11. */
  12. class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
  13. {
  14. /**
  15. * @var \Magento\Cms\Model\Page
  16. */
  17. protected $_cmsPage;
  18. /**
  19. * @var \Magento\Cms\Model\PageFactory
  20. */
  21. protected $_pageFactory;
  22. /**
  23. * @var \Magento\Cms\Model\ResourceModel\Page\CollectionFactory
  24. */
  25. protected $_collectionFactory;
  26. /**
  27. * @var \Magento\Framework\View\Model\PageLayout\Config\BuilderInterface
  28. */
  29. protected $pageLayoutBuilder;
  30. /**
  31. * @param \Magento\Backend\Block\Template\Context $context
  32. * @param \Magento\Backend\Helper\Data $backendHelper
  33. * @param \Magento\Cms\Model\Page $cmsPage
  34. * @param \Magento\Cms\Model\PageFactory $pageFactory
  35. * @param \Magento\Cms\Model\ResourceModel\Page\CollectionFactory $collectionFactory
  36. * @param \Magento\Framework\View\Model\PageLayout\Config\BuilderInterface $pageLayoutBuilder
  37. * @param array $data
  38. */
  39. public function __construct(
  40. \Magento\Backend\Block\Template\Context $context,
  41. \Magento\Backend\Helper\Data $backendHelper,
  42. \Magento\Cms\Model\Page $cmsPage,
  43. \Magento\Cms\Model\PageFactory $pageFactory,
  44. \Magento\Cms\Model\ResourceModel\Page\CollectionFactory $collectionFactory,
  45. \Magento\Framework\View\Model\PageLayout\Config\BuilderInterface $pageLayoutBuilder,
  46. array $data = []
  47. ) {
  48. $this->pageLayoutBuilder = $pageLayoutBuilder;
  49. $this->_cmsPage = $cmsPage;
  50. $this->_pageFactory = $pageFactory;
  51. $this->_collectionFactory = $collectionFactory;
  52. parent::__construct($context, $backendHelper, $data);
  53. }
  54. /**
  55. * Block construction, prepare grid params
  56. *
  57. * @return void
  58. */
  59. protected function _construct()
  60. {
  61. parent::_construct();
  62. //$this->setDefaultSort('name');
  63. $this->setUseAjax(true);
  64. $this->setDefaultFilter(['chooser_is_active' => '1']);
  65. }
  66. /**
  67. * Prepare chooser element HTML
  68. *
  69. * @param \Magento\Framework\Data\Form\Element\AbstractElement $element Form Element
  70. * @return \Magento\Framework\Data\Form\Element\AbstractElement
  71. */
  72. public function prepareElementHtml(\Magento\Framework\Data\Form\Element\AbstractElement $element)
  73. {
  74. $uniqId = $this->mathRandom->getUniqueHash($element->getId());
  75. $sourceUrl = $this->getUrl('cms/page_widget/chooser', ['uniq_id' => $uniqId]);
  76. $chooser = $this->getLayout()->createBlock(
  77. \Magento\Widget\Block\Adminhtml\Widget\Chooser::class
  78. )->setElement(
  79. $element
  80. )->setConfig(
  81. $this->getConfig()
  82. )->setFieldsetId(
  83. $this->getFieldsetId()
  84. )->setSourceUrl(
  85. $sourceUrl
  86. )->setUniqId(
  87. $uniqId
  88. );
  89. if ($element->getValue()) {
  90. $page = $this->_pageFactory->create()->load((int)$element->getValue());
  91. if ($page->getId()) {
  92. $chooser->setLabel($this->escapeHtml($page->getTitle()));
  93. }
  94. }
  95. $element->setData('after_element_html', $chooser->toHtml());
  96. return $element;
  97. }
  98. /**
  99. * Grid Row JS Callback
  100. *
  101. * @return string
  102. */
  103. public function getRowClickCallback()
  104. {
  105. $chooserJsObject = $this->getId();
  106. $js = '
  107. function (grid, event) {
  108. var trElement = Event.findElement(event, "tr");
  109. var pageTitle = trElement.down("td").next().innerHTML;
  110. var pageId = trElement.down("td").innerHTML.replace(/^\s+|\s+$/g,"");
  111. ' .
  112. $chooserJsObject .
  113. '.setElementValue(pageId);
  114. ' .
  115. $chooserJsObject .
  116. '.setElementLabel(pageTitle);
  117. ' .
  118. $chooserJsObject .
  119. '.close();
  120. }
  121. ';
  122. return $js;
  123. }
  124. /**
  125. * Prepare pages collection
  126. *
  127. * @return \Magento\Backend\Block\Widget\Grid\Extended
  128. */
  129. protected function _prepareCollection()
  130. {
  131. $collection = $this->_collectionFactory->create();
  132. /* @var $collection \Magento\Cms\Model\ResourceModel\Page\CollectionFactory */
  133. $collection->setFirstStoreFlag(true);
  134. $this->setCollection($collection);
  135. return parent::_prepareCollection();
  136. }
  137. /**
  138. * Prepare columns for pages grid
  139. *
  140. * @return $this
  141. */
  142. protected function _prepareColumns()
  143. {
  144. $this->addColumn(
  145. 'chooser_id',
  146. [
  147. 'header' => __('ID'),
  148. 'index' => 'page_id',
  149. 'header_css_class' => 'col-id',
  150. 'column_css_class' => 'col-id'
  151. ]
  152. );
  153. $this->addColumn(
  154. 'chooser_title',
  155. [
  156. 'header' => __('Title'),
  157. 'index' => 'title',
  158. 'header_css_class' => 'col-title',
  159. 'column_css_class' => 'col-title'
  160. ]
  161. );
  162. $this->addColumn(
  163. 'chooser_identifier',
  164. [
  165. 'header' => __('URL Key'),
  166. 'index' => 'identifier',
  167. 'header_css_class' => 'col-url',
  168. 'column_css_class' => 'col-url'
  169. ]
  170. );
  171. $this->addColumn(
  172. 'chooser_page_layout',
  173. [
  174. 'header' => __('Layout'),
  175. 'index' => 'page_layout',
  176. 'type' => 'options',
  177. 'options' => $this->pageLayoutBuilder->getPageLayoutsConfig()->getOptions(),
  178. 'header_css_class' => 'col-layout',
  179. 'column_css_class' => 'col-layout'
  180. ]
  181. );
  182. $this->addColumn(
  183. 'chooser_is_active',
  184. [
  185. 'header' => __('Status'),
  186. 'index' => 'is_active',
  187. 'type' => 'options',
  188. 'options' => $this->_cmsPage->getAvailableStatuses(),
  189. 'header_css_class' => 'col-status',
  190. 'column_css_class' => 'col-status'
  191. ]
  192. );
  193. return parent::_prepareColumns();
  194. }
  195. /**
  196. * Get grid url
  197. *
  198. * @return string
  199. */
  200. public function getGridUrl()
  201. {
  202. return $this->getUrl('cms/page_widget/chooser', ['_current' => true]);
  203. }
  204. }