<?php
declare(strict_types=1);
namespace Ew\GrecoAdministration;
use Doctrine\DBAL\Connection;
use Ew\GrecoAdministration\Service\CustomFieldService;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\System\CustomField\CustomFieldTypes;
class EwGrecoAdministration extends Plugin
{
public function install(InstallContext $installContext): void
{
$this->createCustomFields($installContext->getContext());
$customFieldService = new CustomFieldService(
$this->container->get('custom_field_set.repository')
);
$customFieldService->createCustomFields($installContext->getContext());
}
public function uninstall(UninstallContext $uninstallContext): void
{
parent::uninstall($uninstallContext);
if ($uninstallContext->keepUserData()) {
return;
}
$this->removeCustomFields($uninstallContext->getContext());
$connection = $this->container->get(Connection::class);
if ($connection->executeQuery("SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'customer' AND column_name = 'dc_code';")->fetchColumn()) {
$connection->executeUpdate('ALTER TABLE `customer` DROP COLUMN `dc_code`');
}
if ($connection->executeQuery("SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'promotion' AND column_name = 'dc_customer_id';")->fetchColumn()) {
$connection->executeUpdate('ALTER TABLE `promotion` DROP CONSTRAINT `fk.promotion.dc_customer_id`;');
$connection->executeUpdate('ALTER TABLE `promotion` DROP COLUMN `dc_customer_id`');
}
}
private function createCustomFields($context){
$customFields = [
[
'name' => 'greco_administration',
'active' => true,
'global' => true,
'config' => [
'label' => [
'en-GB' => 'Greco Administration Fields',
'de-DE' => 'Greco Administration Fields'
],
],
'customFields' => [
[
'name' => 'greco_hide_modal',
'type' => CustomFieldTypes::SWITCH,
'config' => [
'bordered' => false,
'label' => [
'en-GB' => 'Hide DC code modal',
'de-DE' => 'Hide DC code modal',
],
'customFieldPosition' => 1
]
]
],
'relations' => [
['entityName' => 'category']
]
],
[
'name' => 'greco_administration_order',
'active' => true,
'global' => true,
'config' => [
'label' => [
'en-GB' => 'EW Order Fields',
'de-DE' => 'EW Order Fields'
],
],
'customFields' => [
[
'name' => 'dc_code',
'type' => CustomFieldTypes::TEXT,
'config' => [
'label' => [
'de-DE' => 'DC Code',
'en-GB' => 'DC Code'
],
'placeholder' => [
'de-DE' => 'M12US',
'en-GB' => 'M12US'
],
'customFieldPosition' => 1
]
]
],
'relations' => [
[
'entityName' => 'order'
]
]
]
];
$repo = $this->container->get('custom_field_set.repository');
$customFieldSetEntry = $repo->search((new Criteria())->addFilter(new EqualsFilter('name', 'greco_administration')), $context)->first();
if(!$customFieldSetEntry) {
foreach ($customFields as $customFieldSet) {
$repo->upsert([$customFieldSet], $context);
}
}
}
private function removeCustomFields($context): void
{
foreach (['greco_administration', 'greco_administration_order'] as $customFieldSetName) {
/** @var EntityRepository $customFieldRepo */
$customFieldRepo = $this->container->get('custom_field.repository');
$result = $customFieldRepo->search(
(new Criteria())->addFilter(new ContainsFilter('name', $customFieldSetName)),
$context
);
$deleteIds = [];
foreach ($result->getIds() as $id) {
$deleteIds[] = ['id' => $id];
}
$customFieldRepo->delete($deleteIds, $context);
/** @var EntityRepository $customFieldsetRepo */
$customFieldsetRepo = $this->container->get('custom_field_set.repository');
$findByName = new Criteria();
$findByName->addFilter(new EqualsFilter('name', $customFieldSetName));
$result = $customFieldsetRepo->searchIds($findByName, $context);
$deleteIds = [];
foreach ($result->getIds() as $id) {
$deleteIds[] = ['id' => $id];
}
$customFieldsetRepo->delete($deleteIds, $context);
}
}
}