Setup/UpgradeData.php (207 lines of code) (raw):
<?php
/**
* Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved
*/
namespace Facebook\BusinessExtension\Setup;
use Exception;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Setup\CategorySetupFactory;
use Magento\Eav\Model\Entity\Attribute\SetFactory;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface;
use Facebook\BusinessExtension\Logger\Logger;
use Facebook\BusinessExtension\Model\Config\ProductAttributes;
use Facebook\BusinessExtension\Helper\FBEHelper;
use Magento\Framework\Setup\UpgradeDataInterface;
class UpgradeData implements UpgradeDataInterface
{
/**
* EAV setup factory
*
* @var EavSetupFactory
*/
private $eavSetupFactory;
/**
* Category setup factory
*
* @var CategorySetupFactory
*/
private $categorySetupFactory;
/**
* Attribute set factory
*
* @var SetFactory
*/
private $attributeSetFactory;
/**
* contains fb attribute config
*
* @var ProductAttributes
*/
private $attributeConfig;
/**
* @var FBEHelper
*/
private $helper;
/**
* @var Logger
*/
private $logger;
/**
* Constructor
*
* @param EavSetupFactory $eavSetupFactory
* @param CategorySetupFactory $categorySetupFactory
* @param SetFactory $attributeSetFactory
* @param ProductAttributes $attributeConfig
* @param FBEHelper $helper
* @param Logger $logger
*/
public function __construct(
EavSetupFactory $eavSetupFactory,
CategorySetupFactory $categorySetupFactory,
SetFactory $attributeSetFactory,
ProductAttributes $attributeConfig,
FBEHelper $helper,
Logger $logger
) {
$this->eavSetupFactory = $eavSetupFactory;
$this->categorySetupFactory = $categorySetupFactory;
$this->attributeSetFactory = $attributeSetFactory;
$this->attributeConfig = $attributeConfig;
$this->helper = $helper;
$this->logger = $logger;
}
/**
* Retrieve the min Attribute Group Sort order, and plus one, we want to put fb attribute group the second place.
* method stolen from Magento\Eav\Setup\EavSetup::getAttributeGroupSortOrder()
*
* @param EavSetup $eavSetup
* @param int|string $entityTypeId
* @param int|string $setId
* @return int
* @throws LocalizedException
*/
private function getMinAttributeGroupSortOrder(EavSetup $eavSetup, $entityTypeId, $setId)
{
$bind = ['attribute_set_id' => $eavSetup->getAttributeSetId($entityTypeId, $setId)];
$select = $eavSetup->getSetup()->getConnection()->select()->from(
$eavSetup->getSetup()->getTable('eav_attribute_group'),
'MIN(sort_order)'
)->where(
'attribute_set_id = :attribute_set_id'
);
$sortOrder = $eavSetup->getSetup()->getConnection()->fetchOne($select, $bind) + 1;
return $sortOrder;
}
/**
* {@inheritdoc}
* @throws LocalizedException|\Zend_Validate_Exception
*/
public function upgrade(
ModuleDataSetupInterface $setup,
ModuleContextInterface $context
) {
$setup->startSetup();
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
$categorySetup = $this->categorySetupFactory->create(['setup' => $setup]);
$this->helper->log("getVersion" . $context->getVersion());
// introducing google product category in 1.2.2
if (version_compare($context->getVersion(), '1.2.2') < 0) {
$attrCode = 'google_product_category';
if (!$eavSetup->getAttributeId(Product::ENTITY, $attrCode)) {
try {
$eavSetup->addAttribute(Product::ENTITY, $attrCode, [
'group' => 'General',
'type' => 'varchar',
'label' => 'Google Product Category',
'input' => 'select',
'source' => 'Facebook\BusinessExtension\Model\Config\Source\Product\GoogleProductCategory',
'required' => false,
'sort_order' => 10,
'global' => ScopedAttributeInterface::SCOPE_GLOBAL,
'is_used_in_grid' => true,
'is_visible_in_grid' => true,
'is_filterable_in_grid' => true,
'visible' => true,
'is_html_allowed_on_front' => false,
'visible_on_front' => false
]);
} catch (Exception $e) {
$this->logger->critical($e);
}
}
}
if (version_compare($context->getVersion(), '1.2.0') < 0) {
$attributeConfig = $this->attributeConfig->getAttributesConfig();
foreach ($attributeConfig as $attrCode => $config) {
// verify if already installed before
if (!$eavSetup->getAttributeId(Product::ENTITY, $attrCode)) {
//Create the attribute
// $this->helper->log($attrCode . " not exist before, process it");
// attribute does not exist
// add a new attribute
// and assign it to the "FacebookAttributeSet" attribute set
$eavSetup->addAttribute(
Product::ENTITY,
$attrCode,
[
'type' => $config['type'],
'label' => $config['label'],
'input' => $config['input'],
'source' => $config['source'],
'note' => $config['note'],
'global' => ScopedAttributeInterface::SCOPE_GLOBAL,
'required' => false,
'user_defined' => true,
'is_used_in_grid' => true,
'is_visible_in_grid' => true,
'is_filterable_in_grid' => true,
'visible' => true,
'is_html_allowed_on_front' => false,
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => false,
'used_in_product_listing' => true,
'unique' => false,
'attribute_set' => 'FacebookAttributeSet'
]
);
} else {
$this->helper->log($attrCode . " already installed, skip");
}
}
/**
* Create a custom attribute group in all attribute sets
* And, Add attribute to that attribute group for all attribute sets
*/
$attributeGroupName = $this->attributeConfig->getAttributeGroupName();
// get the catalog_product entity type id/code
$entityTypeId = $categorySetup->getEntityTypeId(Product::ENTITY);
// get the attribute set ids of all the attribute sets present in your Magento store
$attributeSetIds = $eavSetup->getAllAttributeSetIds($entityTypeId);
foreach ($attributeSetIds as $attributeSetId) {
$attr_group_sort_order = $this->getMinAttributeGroupSortOrder(
$eavSetup,
$entityTypeId,
$attributeSetId
);
$eavSetup->addAttributeGroup(
$entityTypeId,
$attributeSetId,
$attributeGroupName,
$attr_group_sort_order // sort order
);
foreach ($attributeConfig as $attributeCode => $config) {
// get the newly create attribute group id
$attributeGroupId = $eavSetup->getAttributeGroupId(
$entityTypeId,
$attributeSetId,
$attributeGroupName
);
// add attribute to group
$categorySetup->addAttributeToGroup(
$entityTypeId,
$attributeSetId,
$attributeGroupName, // attribute group
$attributeCode,
$config['sort_order']
);
}
}
}
// change attribute code facebook_software_system_requirements -> facebook_system_requirements
// due to 30 length limit
if (version_compare($context->getVersion(), '1.2.5') < 0) {
$oldAttrCode = 'facebook_software_system_requirements';
$newAttrCode = 'facebook_system_requirements';
$oldAttrId = $eavSetup->getAttributeId(Product::ENTITY, $oldAttrCode);
if ($oldAttrId) {
$eavSetup->updateAttribute(
\Magento\Catalog\Model\Product::ENTITY,
$oldAttrId,
[
'attribute_code' => $newAttrCode,
]
);
}
}
// user can config if they want to sync a category or not
if (version_compare($context->getVersion(), '1.4.2') < 0) {
$attrCode = "sync_to_facebook_catalog";
$eavSetup->removeAttribute(Product::ENTITY, $attrCode);
if (!$eavSetup->getAttributeId(Product::ENTITY, $attrCode)) {
$eavSetup->addAttribute(
\Magento\Catalog\Model\Category::ENTITY,
$attrCode,
[
'type' => 'int',
'input' => 'boolean',
'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean',
'visible' => true,
'default' => "1",
'required' => false,
'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
'group' => 'Display Settings',
]
);
}
}
// remove FB attributes from products admin grid
if (version_compare($context->getVersion(), '1.4.3') < 0) {
$removeAttributeFromGrid = function ($attrCode) use ($eavSetup) {
$attrId = $eavSetup->getAttributeId(Product::ENTITY, $attrCode);
if ($attrId) {
$eavSetup->updateAttribute(
\Magento\Catalog\Model\Product::ENTITY,
$attrId,
[
'is_used_in_grid' => false,
'is_visible_in_grid' => false,
'is_filterable_in_grid' => false,
]
);
}
};
$attributeConfig = $this->attributeConfig->getAttributesConfig();
foreach ($attributeConfig as $attrCode => $config) {
$removeAttributeFromGrid($attrCode);
}
$removeAttributeFromGrid('google_product_category');
}
$setup->endSetup();
}
}