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)