app/code/Vendor/Module/Setup/Patch/Data/AddBackorderCategoryProductAttribute.php
<?php namespace Vendor\Module\Setup\Patch\Data; use Magento\Catalog\Model\Product; use Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend; use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface; use Magento\Eav\Setup\EavSetup; use Magento\Eav\Setup\EavSetupFactory; use Magento\Framework\Setup\ModuleDataSetupInterface; use Magento\Framework\Setup\Patch\DataPatchInterface; use Magento\Framework\Setup\Patch\PatchRevertableInterface; use Vendor\Module\Model\Config\Source\Category; class AddBackorderCategoryProductAttribute implements DataPatchInterface, PatchRevertableInterface { const PRODUCT_ATTRIBUTE = 'backorder_category'; /** * @var ModuleDataSetupInterface */ private $moduleDataSetup; /** * @var EavSetupFactory */ private $eavSetupFactory; /** * Constructor * * @param ModuleDataSetupInterface $moduleDataSetup * @param EavSetupFactory $eavSetupFactory */ public function __construct( ModuleDataSetupInterface $moduleDataSetup, EavSetupFactory $eavSetupFactory ) { $this->moduleDataSetup = $moduleDataSetup; $this->eavSetupFactory = $eavSetupFactory; } /** * {@inheritdoc} */ public function apply() { $this->moduleDataSetup->getConnection()->startSetup(); /** @var EavSetup $eavSetup */ $eavSetup = $this->eavSetupFactory->create(['setup' => $this->moduleDataSetup]); $eavSetup->addAttribute( Product::ENTITY, self::PRODUCT_ATTRIBUTE, [ 'type' => 'int', 'label' => 'Backorder Category', 'input' => 'select', 'source' => Category::class, 'frontend' => '', 'required' => false, 'backend' => ArrayBackend::class, 'sort_order' => '30', 'global' => ScopedAttributeInterface::SCOPE_STORE, 'default' => null, 'visible' => true, 'user_defined' => true, 'searchable' => false, 'filterable' => false, 'comparable' => false, 'visible_on_front' => false, 'unique' => false, 'apply_to' => '', 'group' => 'General', 'used_in_product_listing' => true, 'is_used_in_grid' => false, 'is_visible_in_grid' => false, 'is_filterable_in_grid' => false, 'option' => '' ] ); $this->moduleDataSetup->getConnection()->endSetup(); } public function revert() { $this->moduleDataSetup->getConnection()->startSetup(); /** @var EavSetup $eavSetup */ $eavSetup = $this->eavSetupFactory->create(['setup' => $this->moduleDataSetup]); $eavSetup->removeAttribute(Product::ENTITY, self::PRODUCT_ATTRIBUTE); $this->moduleDataSetup->getConnection()->endSetup(); } /** * {@inheritdoc} */ public function getAliases() { return []; } /** * {@inheritdoc} */ public static function getDependencies() { return []; } }
app/code/Vendor/Module/Model/Config/Source/Category.php
<?php namespace Vendor\Module\Model\Config\Source; use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory as CategoryCollectionFactory; use Magento\Eav\Model\Entity\Attribute\Source\AbstractSource; use Magento\Eav\Model\Entity\Attribute\Source\SourceInterface; use Magento\Framework\Data\OptionSourceInterface; class Category extends AbstractSource implements OptionSourceInterface, SourceInterface { /** * @var CategoryCollectionFactory */ private $categoryCollectionFactory; /** * Category constructor. * @param CategoryCollectionFactory $categoryCollectionFactory */ public function __construct( CategoryCollectionFactory $categoryCollectionFactory ) { $this->categoryCollectionFactory = $categoryCollectionFactory; } /** * @return array|mixed * @throws \Magento\Framework\Exception\LocalizedException */ public function getAllOptions() { $collection = $this->categoryCollectionFactory->create(); $collection->addAttributeToSelect('*'); $collection->addIsActiveFilter(); foreach ($collection as $category) { $options[] = [ 'value' => $category->getId(), 'label' => $category->getName() . ' (ID:' . $category->getId() . ')' ]; } return $options; } }
Top comments (0)