Form.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\UrlRewrite\Block\Edit;
  7. /**
  8. * URL rewrites edit form
  9. *
  10. * @SuppressWarnings(PHPMD.DepthOfInheritance)
  11. */
  12. class Form extends \Magento\Backend\Block\Widget\Form\Generic
  13. {
  14. /**
  15. * @var array
  16. */
  17. protected $_sessionData = null;
  18. /**
  19. * @var array
  20. */
  21. protected $_allStores = null;
  22. /**
  23. * @var bool
  24. */
  25. protected $_requireStoresFilter = false;
  26. /**
  27. * @var array
  28. */
  29. protected $_formValues = [];
  30. /**
  31. * Adminhtml data
  32. *
  33. * @var \Magento\Backend\Helper\Data
  34. */
  35. protected $_adminhtmlData = null;
  36. /**
  37. * @var \Magento\Store\Model\System\Store
  38. */
  39. protected $_systemStore;
  40. /**
  41. * @var \Magento\UrlRewrite\Model\UrlRewriteFactory
  42. */
  43. protected $_rewriteFactory;
  44. /**
  45. * @var \Magento\UrlRewrite\Model\OptionProvider
  46. */
  47. protected $optionProvider;
  48. /**
  49. * @param \Magento\Backend\Block\Widget\Context $context
  50. * @param \Magento\Framework\Registry $registry
  51. * @param \Magento\Framework\Data\FormFactory $formFactory
  52. * @param \Magento\UrlRewrite\Model\OptionProvider $optionProvider
  53. * @param \Magento\UrlRewrite\Model\UrlRewriteFactory $rewriteFactory
  54. * @param \Magento\Store\Model\System\Store $systemStore
  55. * @param \Magento\Backend\Helper\Data $adminhtmlData
  56. * @param array $data
  57. */
  58. public function __construct(
  59. \Magento\Backend\Block\Widget\Context $context,
  60. \Magento\Framework\Registry $registry,
  61. \Magento\Framework\Data\FormFactory $formFactory,
  62. \Magento\UrlRewrite\Model\OptionProvider $optionProvider,
  63. \Magento\UrlRewrite\Model\UrlRewriteFactory $rewriteFactory,
  64. \Magento\Store\Model\System\Store $systemStore,
  65. \Magento\Backend\Helper\Data $adminhtmlData,
  66. array $data = []
  67. ) {
  68. $this->optionProvider = $optionProvider;
  69. $this->_rewriteFactory = $rewriteFactory;
  70. $this->_systemStore = $systemStore;
  71. $this->_adminhtmlData = $adminhtmlData;
  72. parent::__construct($context, $registry, $formFactory, $data);
  73. }
  74. /**
  75. * Set form id and title
  76. *
  77. * @return void
  78. */
  79. protected function _construct()
  80. {
  81. parent::_construct();
  82. $this->setId('urlrewrite_form');
  83. $this->setTitle(__('Block Information'));
  84. }
  85. /**
  86. * Initialize form values
  87. * Set form data either from model values or from session
  88. *
  89. * @return $this
  90. */
  91. protected function _initFormValues()
  92. {
  93. $model = $this->_getModel();
  94. $this->_formValues = [
  95. 'store_id' => $model->getStoreId(),
  96. 'entity_type' => $model->getEntityType(),
  97. 'entity_id' => $model->getEntityId(),
  98. 'request_path' => $model->getRequestPath(),
  99. 'target_path' => $model->getTargetPath(),
  100. 'redirect_type' => $model->getRedirectType(),
  101. 'description' => $model->getDescription(),
  102. ];
  103. $sessionData = $this->_getSessionData();
  104. if ($sessionData) {
  105. foreach (array_keys($this->_formValues) as $key) {
  106. if (isset($sessionData[$key])) {
  107. $this->_formValues[$key] = $sessionData[$key];
  108. }
  109. }
  110. }
  111. return $this;
  112. }
  113. /**
  114. * Prepare the form layout
  115. *
  116. * @return $this
  117. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  118. */
  119. protected function _prepareForm()
  120. {
  121. $this->_initFormValues();
  122. // Prepare form
  123. /** @var \Magento\Framework\Data\Form $form */
  124. $form = $this->_formFactory->create(
  125. ['data' => ['id' => 'edit_form', 'use_container' => true, 'method' => 'post']]
  126. );
  127. $fieldset = $form->addFieldset('base_fieldset', ['legend' => __('URL Rewrite Information')]);
  128. $fieldset->addField(
  129. 'entity_type',
  130. 'hidden',
  131. [
  132. 'name' => 'entity_type',
  133. 'value' => $this->_formValues['entity_type']
  134. ]
  135. );
  136. $fieldset->addField(
  137. 'entity_id',
  138. 'hidden',
  139. [
  140. 'name' => 'entity_id',
  141. 'value' => $this->_formValues['entity_id']
  142. ]
  143. );
  144. $this->_prepareStoreElement($fieldset);
  145. $fieldset->addField(
  146. 'request_path',
  147. 'text',
  148. [
  149. 'label' => __('Request Path'),
  150. 'title' => __('Request Path'),
  151. 'name' => 'request_path',
  152. 'required' => true,
  153. 'value' => $this->_formValues['request_path']
  154. ]
  155. );
  156. $fieldset->addField(
  157. 'target_path',
  158. 'text',
  159. [
  160. 'label' => __('Target Path'),
  161. 'title' => __('Target Path'),
  162. 'name' => 'target_path',
  163. 'required' => true,
  164. 'disabled' => false,
  165. 'value' => $this->_formValues['target_path']
  166. ]
  167. );
  168. $fieldset->addField(
  169. 'redirect_type',
  170. 'select',
  171. [
  172. 'label' => __('Redirect Type'),
  173. 'title' => __('Redirect Type'),
  174. 'name' => 'redirect_type',
  175. 'options' => $this->optionProvider->toOptionArray(),
  176. 'value' => $this->_formValues['redirect_type']
  177. ]
  178. );
  179. $fieldset->addField(
  180. 'description',
  181. 'textarea',
  182. [
  183. 'label' => __('Description'),
  184. 'title' => __('Description'),
  185. 'name' => 'description',
  186. 'cols' => 20,
  187. 'rows' => 5,
  188. 'value' => $this->_formValues['description'],
  189. 'wrap' => 'soft'
  190. ]
  191. );
  192. $this->setForm($form);
  193. $this->_formPostInit($form);
  194. return parent::_prepareForm();
  195. }
  196. /**
  197. * Prepare store element
  198. *
  199. * @param \Magento\Framework\Data\Form\Element\Fieldset $fieldset
  200. * @return void
  201. */
  202. protected function _prepareStoreElement($fieldset)
  203. {
  204. if ($this->_storeManager->isSingleStoreMode()) {
  205. $fieldset->addField(
  206. 'store_id',
  207. 'hidden',
  208. ['name' => 'store_id', 'value' => $this->_storeManager->getStore(true)->getId()]
  209. );
  210. } else {
  211. $storeElement = $fieldset->addField(
  212. 'store_id',
  213. 'select',
  214. [
  215. 'label' => __('Store'),
  216. 'title' => __('Store'),
  217. 'name' => 'store_id',
  218. 'required' => true,
  219. 'value' => $this->_formValues['store_id']
  220. ]
  221. );
  222. try {
  223. $stores = $this->_getStoresListRestrictedByEntityStores($this->_getEntityStores());
  224. } catch (\Magento\Framework\Exception\LocalizedException $e) {
  225. $stores = [];
  226. $storeElement->setAfterElementHtml($e->getMessage());
  227. }
  228. $storeElement->setValues($stores);
  229. if ($this->_getModel()->getIsAutogenerated()) {
  230. $storeElement->setReadonly(true);
  231. }
  232. /** @var $renderer \Magento\Backend\Block\Store\Switcher\Form\Renderer\Fieldset\Element */
  233. $renderer = $this->getLayout()->createBlock(
  234. \Magento\Backend\Block\Store\Switcher\Form\Renderer\Fieldset\Element::class
  235. );
  236. $storeElement->setRenderer($renderer);
  237. }
  238. }
  239. /**
  240. * Form post init
  241. *
  242. * @param \Magento\Framework\Data\Form $form
  243. * @return $this
  244. */
  245. protected function _formPostInit($form)
  246. {
  247. $form->setAction(
  248. $this->_adminhtmlData->getUrl('adminhtml/*/save', ['id' => $this->_getModel()->getId()])
  249. );
  250. return $this;
  251. }
  252. /**
  253. * Get session data
  254. *
  255. * @return array
  256. */
  257. protected function _getSessionData()
  258. {
  259. if ($this->_sessionData === null) {
  260. $this->_sessionData = $this->_backendSession->getData('url_rewrite_data', true);
  261. }
  262. return $this->_sessionData;
  263. }
  264. /**
  265. * Get URL rewrite model instance
  266. *
  267. * @return \Magento\UrlRewrite\Model\UrlRewrite
  268. */
  269. protected function _getModel()
  270. {
  271. if (!$this->hasData('url_rewrite')) {
  272. $this->setUrlRewrite($this->_rewriteFactory->create());
  273. }
  274. return $this->getUrlRewrite();
  275. }
  276. /**
  277. * Get request stores
  278. *
  279. * @return array
  280. */
  281. protected function _getAllStores()
  282. {
  283. if ($this->_allStores === null) {
  284. $this->_allStores = $this->_systemStore->getStoreValuesForForm();
  285. }
  286. return $this->_allStores;
  287. }
  288. /**
  289. * Get entity stores
  290. *
  291. * @return array
  292. */
  293. protected function _getEntityStores()
  294. {
  295. return $this->_getAllStores();
  296. }
  297. /**
  298. * Get stores list restricted by entity stores.
  299. * Stores should be filtered only if custom entity is specified.
  300. * If we use custom rewrite, all stores are accepted.
  301. *
  302. * @param array $entityStores
  303. * @return array
  304. */
  305. private function _getStoresListRestrictedByEntityStores(array $entityStores)
  306. {
  307. $stores = $this->_getAllStores();
  308. if ($this->_requireStoresFilter) {
  309. foreach ($stores as $i => $store) {
  310. if (isset($store['value']) && $store['value']) {
  311. $found = false;
  312. foreach ($store['value'] as $k => $v) {
  313. if (isset($v['value']) && in_array($v['value'], $entityStores)) {
  314. $found = true;
  315. } else {
  316. unset($stores[$i]['value'][$k]);
  317. }
  318. }
  319. if (!$found) {
  320. unset($stores[$i]);
  321. }
  322. }
  323. }
  324. }
  325. return $stores;
  326. }
  327. }