Guest User

Untitled

a guest
Nov 16th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.21 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Vendor\Module\Setup;
  4.  
  5. use Magento\Framework\Setup;
  6. use Magento\Eav\Setup\EavSetup;
  7. use Magento\Eav\Setup\EavSetupFactory;
  8. use Magento\Catalog\Model\Product\Type;
  9. use Magento\Framework\Setup\ModuleContextInterface;
  10. use Magento\Framework\Setup\ModuleDataSetupInterface;
  11. use Magento\Framework\Setup\InstallDataInterface;
  12. use Magento\Catalog\Model\ResourceModel\Eav\Attribute as eavAttribute;
  13.  
  14. class InstallData implements InstallDataInterface
  15. {
  16. /**
  17. * @var EavSetupFactory
  18. */
  19. protected $eavSetupFactory;
  20.  
  21. protected $attrOptionCollectionFactory;
  22. protected $eavConfig;
  23. protected $logger;
  24.  
  25.  
  26. protected $optionCollection = [];
  27.  
  28.  
  29. public function __construct(
  30. EavSetupFactory $eavSetupFactory,
  31. \Magento\Eav\Model\Config $eavConfig,
  32. \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\CollectionFactory $attrOptionCollectionFactory,
  33. \Psr\Log\LoggerInterface $logger
  34. )
  35. {
  36. $this->eavConfig = $eavConfig;
  37. $this->eavSetupFactory = $eavSetupFactory;
  38. $this->attrOptionCollectionFactory = $attrOptionCollectionFactory;
  39. $this->logger = $logger;
  40. }
  41.  
  42. /**
  43. * {@inheritdoc}
  44. */
  45. public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
  46. {
  47. $setup->startSetup();
  48.  
  49. if (version_compare($context->getVersion(), '1.0.0', '<')) {
  50. /** @var \Magento\Eav\Setup\EavSetup $eavSetup */
  51. $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
  52.  
  53. $this->installSwatches($eavSetup, $setup);
  54. }
  55.  
  56. $setup->endSetup();
  57. }
  58.  
  59.  
  60. /**
  61. * @param EavSetup $eavSetup
  62. * @param ModuleDataSetupInterface $setup
  63. * @throws \Exception
  64. */
  65. private function installSwatches(
  66. \Magento\Eav\Setup\EavSetup $eavSetup,
  67. ModuleDataSetupInterface $setup
  68. ) {
  69.  
  70. try {
  71.  
  72. $productTypes = [
  73. \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
  74. \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
  75. \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE,
  76. \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE,
  77. ];
  78. $productTypes = join(',', $productTypes);
  79.  
  80. $eavSetup->addAttribute(
  81. \Magento\Catalog\Model\Product::ENTITY,
  82. 'test_text_swatch',
  83. [
  84. 'type' => 'int',
  85. 'label' => 'Test Text Swatch',
  86. 'input' => 'select',
  87. 'required' => false,
  88. 'user_defined' => true,
  89. 'searchable' => true,
  90. 'filterable' => true,
  91. 'comparable' => true,
  92. 'visible_in_advanced_search' => true,
  93. 'apply_to' => $productTypes,
  94. 'is_used_in_grid' => true,
  95. 'is_visible_in_grid' => false,
  96. 'option' => [
  97. 'values' => [
  98. 'Test'
  99. ]
  100. ]
  101. ]
  102. );
  103.  
  104. $this->eavConfig->clear();
  105.  
  106. $this->convertAttributeToSwatches();
  107.  
  108. } catch (\Exception $e) {
  109. $this->logger->critical($e);
  110.  
  111. }
  112.  
  113. }
  114.  
  115. public function convertAttributeToSwatches() {
  116. $attribute = $this->eavConfig->getAttribute('catalog_product', 'test_text_swatch');
  117. if (!$attribute) {
  118. return;
  119. }
  120.  
  121. $attributeData['option'] = $this->addExistingOptions($attribute);
  122. $attributeData['frontend_input'] = 'select';
  123. $attributeData['swatch_input_type'] = 'text';
  124. $attributeData['update_product_preview_image'] = 1;
  125. $attributeData['use_product_image_for_swatch'] = 0;
  126. $attributeData['optiontext'] = $this->getOptionSwatch($attributeData);
  127. $attributeData['defaulttext'] = $this->getOptionDefaultText($attributeData);
  128. $attributeData['swatchtext'] = $this->getOptionSwatchText($attributeData);
  129. $this->logger->log(100, print_r($attributeData, true));
  130. $attribute->addData($attributeData);
  131. $attribute->save();
  132. }
  133.  
  134. protected function getOptionSwatch(array $attributeData)
  135. {
  136. $optionSwatch = ['order' => [], 'value' => [], 'delete' => []];
  137. $i = 0;
  138. foreach ($attributeData['option'] as $optionKey => $optionValue) {
  139. $optionSwatch['delete'][$optionKey] = '';
  140. $optionSwatch['order'][$optionKey] = (string)$i++;
  141. $optionSwatch['value']['option_' . $optionKey] = [$optionValue, ''];
  142. }
  143. return $optionSwatch;
  144. }
  145.  
  146. /**
  147. * @param array $attributeData
  148. * @return array
  149. */
  150. private function getOptionSwatchText(array $attributeData)
  151. {
  152. $optionSwatch = ['value' => []];
  153. foreach ($attributeData['option'] as $optionKey => $optionValue) {
  154. $optionSwatch['value'][$optionKey] = [$optionValue, ''];
  155. }
  156. return $optionSwatch;
  157. }
  158.  
  159. /**
  160. * @param array $attributeData
  161. * @return array
  162. */
  163. private function getOptionDefaultText(array $attributeData)
  164. {
  165. $optionSwatch = $this->getOptionSwatchText($attributeData);
  166. return [array_keys($optionSwatch['value'])[0]];
  167. }
  168.  
  169. /**
  170. * @param $attributeId
  171. * @return void
  172. */
  173. private function loadOptionCollection($attributeId)
  174. {
  175. if (empty($this->optionCollection[$attributeId])) {
  176. $this->optionCollection[$attributeId] = $this->attrOptionCollectionFactory->create()
  177. ->setAttributeFilter($attributeId)
  178. ->setPositionOrder('asc', true)
  179. ->load();
  180. }
  181. }
  182.  
  183. /**
  184. * @param eavAttribute $attribute
  185. * @return array
  186. */
  187. private function addExistingOptions(eavAttribute $attribute)
  188. {
  189. $options = [];
  190. $attributeId = $attribute->getId();
  191. if ($attributeId) {
  192. $this->loadOptionCollection($attributeId);
  193. /** @var \Magento\Eav\Model\Entity\Attribute\Option $option */
  194. foreach ($this->optionCollection[$attributeId] as $option) {
  195. $options[$option->getId()] = $option->getValue();
  196. }
  197. }
  198. return $options;
  199. }
  200. }
Add Comment
Please, Sign In to add comment