<?php declare(strict_types=1);
namespace Acris\ProductBadges;
use Doctrine\DBAL\Connection;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
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 Shopware\Core\Framework\Uuid\Uuid;
class AcrisProductBadgesCS extends Plugin
{
public function activate(ActivateContext $context): void
{
parent::activate($context);
$this->insertDefaultBadges($context->getContext());
}
public function postUpdate(UpdateContext $context): void
{
if($context->getPlugin()->isActive() === true && version_compare($context->getCurrentPluginVersion(), '1.3.0', '<')
&& version_compare($context->getUpdatePluginVersion(), '1.3.0', '>=')) {
$this->insertDefaultBadges($context->getContext());
}
if(version_compare($context->getCurrentPluginVersion(), '1.3.2', '<')
&& version_compare($context->getUpdatePluginVersion(), '1.3.2', '>=')) {
$connection = $this->container->get(Connection::class);
$connection->executeStatement("UPDATE acris_product_badge SET internal_name = 'ACRIS Bundle' WHERE internal_name = 'Acris Bundle'");
}
if(version_compare($context->getCurrentPluginVersion(), '2.1.0', '<')
&& version_compare($context->getUpdatePluginVersion(), '2.1.0', '>=') && $context->getPlugin()->isActive() === true) {
$this->insertDefaultBadges($context->getContext());
}
}
public function uninstall(UninstallContext $context): void
{
if ($context->keepUserData()) {
return;
}
$this->cleanupDatabase();
}
private function cleanupDatabase(): void
{
$connection = $this->container->get(Connection::class);
$connection->executeStatement('DROP TABLE IF EXISTS `acris_product_badge_stream`');
$connection->executeStatement('DROP TABLE IF EXISTS `acris_product_badge_rule`');
$connection->executeStatement('DROP TABLE IF EXISTS `acris_product_replace_badge_rule`');
$connection->executeStatement('DROP TABLE IF EXISTS `acris_product_badge_translation`');
$connection->executeStatement('DROP TABLE IF EXISTS `acris_product_badge`');
$connection->executeStatement('ALTER TABLE `product_stream` DROP COLUMN `acrisProductBadges`');
$connection->executeStatement('ALTER TABLE `rule` DROP COLUMN `acrisProductBadges`');
$connection->executeStatement('ALTER TABLE `rule` DROP COLUMN `acrisProductBadgesReplace`');
$connection->executeStatement('ALTER TABLE `promotion` DROP COLUMN `product_badge_id`');
$connection->executeStatement('ALTER TABLE `promotion` DROP COLUMN `productBadge`');
}
public function insertDefaultBadges(Context $context)
{
$badgeRepository = $this->container->get('acris_product_badge.repository');
$defaultSaleId = Uuid::randomHex();
$defaultTipId = Uuid::randomHex();
$defaultNewId = Uuid::randomHex();
$defaultBundleId = Uuid::randomHex();
$badges =
[
[
'id' => $defaultSaleId,
'internalName' => 'Sale',
'active' => true,
'priority' => 4,
'badgeTextColor' => '#ffffff',
'backgroundColor' => '#da1b1e',
'backgroundShape' => 'rectangular',
'foreground' => 'text',
'background' => 'color_shape',
'productListing' => 'left_top',
'productDetailPage' => 'no_display',
'isDefault' => true,
'defaultType' => 'sale',
'displayCondition' => 'replace_default_badges',
'replaceDefaultBadgeId' => $defaultSaleId,
'badgeText' => '%',
'translations' => [
'de-DE' => [
'badgeText' => '%',
],
'en-GB' => [
'badgeText' => '%',
],
],
],
[
'id' => $defaultTipId,
'internalName' => 'Tip',
'active' => true,
'priority' => 3,
'badgeTextColor' => '#ffffff',
'backgroundColor' => '#ffbd5d',
'backgroundShape' => 'rectangular',
'foreground' => 'text',
'background' => 'color_shape',
'productListing' => 'left_top',
'productDetailPage' => 'no_display',
'isDefault' => true,
'defaultType' => 'tipp',
'displayCondition' => 'replace_default_badges',
'replaceDefaultBadgeId' => $defaultTipId,
'badgeText' => 'Tip',
'translations' => [
'de-DE' => [
'badgeText' => 'Tipp',
],
'en-GB' => [
'badgeText' => 'Tip',
],
],
],
[
'id' => $defaultNewId,
'internalName' => 'New',
'active' => true,
'priority' => 2,
'badgeTextColor' => '#ffffff',
'backgroundColor' => '#30ab43',
'backgroundShape' => 'rectangular',
'foreground' => 'text',
'background' => 'color_shape',
'productListing' => 'left_top',
'productDetailPage' => 'no_display',
'isDefault' => true,
'defaultType' => 'new',
'displayCondition' => 'replace_default_badges',
'replaceDefaultBadgeId' => $defaultNewId,
'badgeText' => 'New',
'translations' => [
'de-DE' => [
'badgeText' => 'Neu',
],
'en-GB' => [
'badgeText' => 'New',
],
],
],
[
'id' => $defaultBundleId,
'internalName' => 'ACRIS Bundle',
'active' => true,
'priority' => 1,
'badgeTextColor' => '#ffffff',
'backgroundColor' => '#a6c836',
'backgroundShape' => 'rectangular',
'foreground' => 'text',
'background' => 'color_shape',
'productListing' => 'left_top',
'productDetailPage' => 'left_top',
'isDefault' => true,
'defaultType' => 'acris_bundle',
'displayCondition' => 'replace_default_badges',
'replaceDefaultBadgeId' => $defaultBundleId,
'badgeText' => 'Bundle',
'translations' => [
'de-DE' => [
'badgeText' => 'Bundle',
],
'en-GB' => [
'badgeText' => 'Bundle',
],
],
],
];
foreach ($badges as $badge) {
$this->createOrUpdateBadges($badgeRepository, [
['name' => 'defaultType', 'value' => $badge['defaultType']]
], $badge, $context);
}
}
private function createOrUpdateBadges(EntityRepositoryInterface $repository, array $equalFields, array $data, Context $context)
{
$badges = [];
foreach ($equalFields as $equalField) {
$badges[] = new EqualsFilter($equalField['name'], $equalField['value']);
}
if (sizeof($badges) > 1) {
$badge = new MultiFilter(MultiFilter::CONNECTION_OR, $badges);
} else {
$badge = array_shift($badges);
}
$searchResult = $repository->search((new Criteria())->addFilter($badge), $context);
if ($searchResult->count() == 0) {
$repository->upsert([$data], $context);
} else {
$data['id'] = $searchResult->first()->getId();
$data['displayCondition'] = 'replace_default_badges';
$data['replaceDefaultBadgeId'] = $searchResult->first()->getId();
$repository->upsert([$data], $context);
}
}
}