Config.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Theme\Model\Indexer\Design;
  7. use Magento\Framework\Indexer\ActionInterface;
  8. use Magento\Framework\Indexer\FieldsetPool;
  9. use Magento\Framework\Indexer\HandlerPool;
  10. use Magento\Theme\Model\ResourceModel\Design\Config\Scope\CollectionFactory;
  11. use Magento\Framework\Indexer\SaveHandler\IndexerInterface;
  12. use Magento\Framework\Indexer\IndexStructureInterface;
  13. use Magento\Framework\Indexer\StructureFactory;
  14. use Magento\Framework\Indexer\SaveHandlerFactory;
  15. class Config implements ActionInterface
  16. {
  17. /**
  18. * @var CollectionFactory
  19. */
  20. protected $collectionFactory;
  21. /**
  22. * @var SaveHandlerFactory
  23. */
  24. protected $saveHandlerFactory;
  25. /**
  26. * @var StructureFactory
  27. */
  28. protected $structureFactory;
  29. /**
  30. * @var IndexerInterface
  31. */
  32. protected $saveHandler;
  33. /**
  34. * @var array
  35. */
  36. protected $filterable = [];
  37. /**
  38. * @var array
  39. */
  40. protected $searchable = [];
  41. /**
  42. * @var FieldsetPool
  43. */
  44. protected $fieldsetPool;
  45. /**
  46. * @var HandlerPool
  47. */
  48. protected $handlerPool;
  49. /**
  50. * Config constructor
  51. *
  52. * @param StructureFactory $structureFactory
  53. * @param SaveHandlerFactory $saveHandlerFactory
  54. * @param FieldsetPool $fieldsetPool
  55. * @param HandlerPool $handlerPool
  56. * @param CollectionFactory $collectionFactory
  57. * @param array $data
  58. */
  59. public function __construct(
  60. StructureFactory $structureFactory,
  61. SaveHandlerFactory $saveHandlerFactory,
  62. FieldsetPool $fieldsetPool,
  63. HandlerPool $handlerPool,
  64. CollectionFactory $collectionFactory,
  65. $data = []
  66. ) {
  67. $this->structureFactory = $structureFactory;
  68. $this->saveHandlerFactory = $saveHandlerFactory;
  69. $this->fieldsetPool = $fieldsetPool;
  70. $this->handlerPool = $handlerPool;
  71. $this->collectionFactory = $collectionFactory;
  72. $this->data = $data;
  73. }
  74. /**
  75. * Execute
  76. *
  77. * @param null|int|array $ids
  78. * @return void
  79. */
  80. protected function execute(array $ids = [])
  81. {
  82. /** @var \Magento\Theme\Model\ResourceModel\Design\Config\Scope\Collection $collection */
  83. $collection = $this->collectionFactory->create();
  84. $this->prepareFields();
  85. if (!count($ids)) {
  86. $this->getSaveHandler()->cleanIndex([]);
  87. }
  88. $this->getSaveHandler()->deleteIndex([], new \ArrayObject($ids));
  89. $this->getSaveHandler()->saveIndex([], $collection);
  90. }
  91. /**
  92. * Execute full indexation
  93. *
  94. * @return void
  95. */
  96. public function executeFull()
  97. {
  98. $this->execute();
  99. }
  100. /**
  101. * Execute partial indexation by ID list
  102. *
  103. * @param int[] $ids
  104. * @return void
  105. */
  106. public function executeList(array $ids)
  107. {
  108. $this->execute($ids);
  109. }
  110. /**
  111. * Execute partial indexation by ID
  112. *
  113. * @param int $id
  114. * @return void
  115. */
  116. public function executeRow($id)
  117. {
  118. $this->execute([$id]);
  119. }
  120. /**
  121. * Return save handler
  122. *
  123. * @return IndexerInterface
  124. */
  125. protected function getSaveHandler()
  126. {
  127. if ($this->saveHandler === null) {
  128. $this->saveHandler = $this->saveHandlerFactory->create(
  129. $this->data['saveHandler'],
  130. [
  131. 'indexStructure' => $this->getStructureInstance(),
  132. 'data' => $this->data,
  133. ]
  134. );
  135. }
  136. return $this->saveHandler;
  137. }
  138. /**
  139. * Prepare configuration data
  140. *
  141. * @return void
  142. */
  143. protected function prepareFields()
  144. {
  145. foreach ($this->data['fieldsets'] as $fieldsetName => $fieldset) {
  146. $this->data['fieldsets'][$fieldsetName]['source'] = $this->collectionFactory->create();
  147. if (isset($fieldset['provider'])) {
  148. $fieldsetObject = $this->fieldsetPool->get($fieldset['provider']);
  149. $this->data['fieldsets'][$fieldsetName] =
  150. $fieldsetObject->addDynamicData($this->data['fieldsets'][$fieldsetName]);
  151. }
  152. foreach ($this->data['fieldsets'][$fieldsetName]['fields'] as $fieldName => $field) {
  153. $this->data['fieldsets'][$fieldsetName]['fields'][$fieldName]['origin'] =
  154. $this->data['fieldsets'][$fieldsetName]['fields'][$fieldName]['origin']
  155. ?: $this->data['fieldsets'][$fieldsetName]['fields'][$fieldName]['name'];
  156. if ($fieldsetName != 0) {
  157. $this->data['fieldsets'][$fieldsetName]['fields'][$fieldName]['name'] =
  158. $this->data['fieldsets'][$fieldsetName]['name'] . '_'
  159. . $this->data['fieldsets'][$fieldsetName]['fields'][$fieldName]['name'];
  160. }
  161. $this->saveFieldByType($field);
  162. $this->data['fieldsets'][$fieldsetName]['fields'][$fieldName]['handler'] =
  163. $this->handlerPool->get($field['handler']);
  164. $this->data['fieldsets'][$fieldsetName]['fields'][$fieldName]['dataType'] =
  165. isset($field['dataType']) ? $field['dataType'] : 'varchar';
  166. }
  167. }
  168. }
  169. /**
  170. * Save field by type
  171. *
  172. * @param array $field
  173. * @return void
  174. */
  175. protected function saveFieldByType($field)
  176. {
  177. switch ($field['type']) {
  178. case 'filterable':
  179. $this->filterable[] = $field;
  180. break;
  181. case 'searchable':
  182. $this->searchable[] = $field;
  183. break;
  184. }
  185. }
  186. /**
  187. * Return indexer structure instance
  188. *
  189. * @return IndexStructureInterface
  190. */
  191. protected function getStructureInstance()
  192. {
  193. if (!$this->data['structure']) {
  194. return null;
  195. }
  196. return $this->structureFactory->create($this->data['structure']);
  197. }
  198. }