<?php declare(strict_types=1);
namespace Appflix\Studygood;
use MoorlFoundation\Core\Service\DataService;
use MoorlFoundation\MoorlFoundation;
use Appflix\Studygood\Core\Defaults;
use Doctrine\DBAL\Connection;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\ActivateContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\Framework\Plugin\Context\UpdateContext;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class AppflixStudygood extends Plugin
{
public const PLUGIN_TABLES = [
'studygood_media',
'studygood_tutor',
'studygood_tutor_translation',
'studygood_course',
'studygood_course_translation',
'studygood_rating',
'studygood_chapter',
'studygood_chapter_translation',
'studygood_lesson',
'studygood_lesson_translation',
'studygood_lesson_media',
'studygood_board',
'studygood_test_question',
'studygood_test_question_translation',
'studygood_test_answer',
'studygood_test_answer_translation',
'studygood_certificate',
'studygood_certificate_translation',
'studygood_esd',
'studygood_course_product',
'studygood_product_meta'
];
public const SHOPWARE_TABLES = [
'media_folder',
'product_manufacturer',
'cms_page',
'cms_page_translation',
'cms_section',
'cms_block',
'category',
'category_translation',
'product',
'product_translation',
'product_category',
'product_visibility',
'product_stream',
'product_cross_selling',
'custom_field_set',
'document_type',
'theme',
'theme_sales_channel'
];
public const INHERITANCES = [
'product' => ['studygoodCourses']
];
public function build(ContainerBuilder $container): void
{
if (class_exists(MoorlFoundation::class)) {
parent::build($container);
}
}
public function activate(ActivateContext $activateContext): void
{
parent::activate($activateContext);
/* @var $dataService DataService */
$dataService = $this->container->get(DataService::class);
$dataService->install(Defaults::NAME);
/* Migration to MoorlFoundation */
$connection = $this->container->get(Connection::class);
$connection->executeStatement("UPDATE `cms_slot` SET `slot` = 'slot-a' WHERE `slot` = 'one' AND `type` = 'appflix-search-hero';");
$connection->executeStatement("UPDATE `cms_slot` SET `slot` = 'slot-a' WHERE `slot` = 'one' AND `type` = 'appflix-usp';");
$connection->executeStatement("UPDATE `cms_slot` SET `slot` = 'slot-b' WHERE `slot` = 'two' AND `type` = 'appflix-usp';");
$connection->executeStatement("UPDATE `cms_slot` SET `slot` = 'slot-c' WHERE `slot` = 'three' AND `type` = 'appflix-usp';");
$connection->executeStatement("UPDATE `cms_slot` SET `slot` = 'slot-a' WHERE `slot` = 'one' AND `type` = 'appflix-newsletter';");
$connection->executeStatement("UPDATE `cms_slot` SET `slot` = 'slot-b' WHERE `slot` = 'two' AND `type` = 'appflix-newsletter';");
$connection->executeStatement("UPDATE `cms_slot` SET `type` = REPLACE(`type`, 'appflix', 'moorl');");
$connection->executeStatement("UPDATE `cms_block` SET `custom_fields` = REPLACE(`custom_fields`, 'appflix', 'moorl');");
$connection->executeStatement("UPDATE `cms_block` SET `type` = REPLACE(`type`, 'appflix-usp', 'appflix-column-layout-1-1-1');");
$connection->executeStatement("UPDATE `cms_block` SET `type` = REPLACE(`type`, 'appflix-newsletter', 'appflix-column-layout-1-1');");
$connection->executeStatement("UPDATE `cms_block` SET `type` = REPLACE(`type`, 'appflix-search-hero', 'appflix-column-layout-1');");
$connection->executeStatement("UPDATE `cms_block` SET `type` = REPLACE(`type`, 'appflix', 'moorl');");
$connection->executeStatement("UPDATE `cms_section` SET `custom_fields` = REPLACE(`custom_fields`, 'appflix_section', 'moorl_section_config');");
$connection->executeStatement("UPDATE `cms_section` SET `custom_fields` = REPLACE(`custom_fields`, 'appflix', 'moorl');");
}
public function uninstall(UninstallContext $uninstallContext): void
{
parent::uninstall($uninstallContext);
if ($uninstallContext->keepUserData()) {
return;
}
$this->uninstallTrait();
}
private function uninstallTrait(): void
{
$connection = $this->container->get(Connection::class);
foreach (self::PLUGIN_TABLES as $table) {
$sql = sprintf('SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `%s`;', $table);
$connection->executeStatement($sql);
}
foreach (array_reverse(self::SHOPWARE_TABLES) as $table) {
$sql = sprintf("SET FOREIGN_KEY_CHECKS=0; DELETE FROM `%s` WHERE `created_at` = '%s';", $table, Defaults::DATA_CREATED_AT);
try {
$connection->executeStatement($sql);
} catch (\Exception $exception) {
continue;
}
}
foreach (self::INHERITANCES as $table => $propertyNames) {
foreach ($propertyNames as $propertyName) {
$sql = sprintf("ALTER TABLE `%s` DROP `%s`;", $table, $propertyName);
try {
$connection->executeStatement($sql);
} catch (\Exception $exception) {
continue;
}
}
}
}
}