<?php declare(strict_types=1);
namespace LoyxxRichBreadcrumb;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
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\Framework\Plugin\Context\UpdateContext;
use Shopware\Core\System\CustomField\Aggregate\CustomFieldSet\CustomFieldSetEntity;
use Shopware\Core\System\CustomField\CustomFieldEntity;
use Shopware\Core\System\CustomField\CustomFieldTypes;
class LoyxxRichBreadcrumb extends Plugin
{
public const CUSTOM_FIELD_PREFIX = 'loyxx_rich_breadcrumb';
public function install(InstallContext $installContext): void
{
parent::install($installContext);
$this->createCustomFieldSystem($installContext);
}
public function update(UpdateContext $updateContext): void
{
parent::update($updateContext);
$this->updateCustomFieldSystem($updateContext);
}
public function uninstall(UninstallContext $uninstallContext): void
{
parent::uninstall($uninstallContext);
if ($uninstallContext->keepUserData()) {
return;
}
$this->removeCustomFieldSystem($uninstallContext);
}
private function createCustomFieldSystem(InstallContext $installContext)
{
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$context = $installContext->getContext();
//check if the custom field set is defined
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('name', static::CUSTOM_FIELD_PREFIX));
$customFieldSetEntity = $customFieldSetRepository->searchIds($criteria, $context);
if (!$customFieldSetEntity->getTotal()) {
$customFieldSetRepository->create(
[
[
'name' => static::CUSTOM_FIELD_PREFIX,
'customFields' => $this->_getCustomFields(),
'relations' => [
['entityName' => 'category']
],
'config' => [
'description' => [
'en-GB' => 'Rich Breadcrumb Configuration',
'de-DE' => 'Rich-Breadcrumb-Konfiguration'
],
'label' => [
'en-GB' => 'Rich Breadcrumb Configuration',
'de-DE' => 'Rich-Breadcrumb-Konfiguration'
],
'translated' => true
]
]
],
$context
);
}
}
private function updateCustomFieldSystem(UpdateContext $updateContext)
{
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$context = $updateContext->getContext();
//check if the custom field set is defined
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('name', static::CUSTOM_FIELD_PREFIX));
$criteria->addAssociation('customFields');
/** @var CustomFieldSetEntity $customFieldSetEntity */
$customFieldSetEntity = $customFieldSetRepository->search($criteria, $context)->first();
$customFields = $this->_getCustomFields();
$relation = [];
if ($customFieldSetEntity) {
/** @var CustomFieldEntity $item */
foreach ($customFieldSetEntity->getCustomFields() as $item) {
$key = array_search($item->getName(), array_column($customFields, 'name'));
if ($key !== FALSE) {
$customFields[$key]['id'] = $item->getId();
}
}
} else {
$relation = [
'relations' => [
['entityName' => 'category']
],
'config' => [
'description' => [
'en-GB' => 'Rich Breadcrumb Configuration',
'de-DE' => 'Rich-Breadcrumb-Konfiguration'
],
'label' => [
'en-GB' => 'Rich Breadcrumb Configuration',
'de-DE' => 'Rich-Breadcrumb-Konfiguration'
],
'translated' => true
]
];
}
$customFieldSetRepository->upsert(
[
array_merge([
'id' => $customFieldSetEntity ? $customFieldSetEntity->getId() : NULL,
'name' => static::CUSTOM_FIELD_PREFIX,
'customFields' => $customFields
], $relation)
],
$context
);
}
private function removeCustomFieldSystem(UninstallContext $uninstallContext)
{
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$context = $uninstallContext->getContext();
//check if the custom field set is defined
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('name', static::CUSTOM_FIELD_PREFIX));
$customFieldSetEntity = $customFieldSetRepository->searchIds($criteria, $context);
if ($customFieldSetEntity->getTotal()) {
$customFieldSetRepository->delete(array_values($customFieldSetEntity->getData()), $context);
}
}
private function _getCustomFields()
{
return [
[
'name' => static::CUSTOM_FIELD_PREFIX . '_disabled',
'type' => CustomFieldTypes::BOOL,
'config' => [
'type' => 'switch',
'label' => [
'en-GB' => 'Hide breadcrumb for this category',
'de-DE' => 'Breadcrumb für diese Kategorie ausblenden'
],
'componentName' => 'sw-field',
'customFieldType' => 'switch',
'customFieldPosition' => 1,
'helpText' => [
'en-GB' => 'After enabling this option, the breadcrumb will no longer shown inside this category page',
'de-DE' => 'Nachdem Sie diese Option aktiviert haben, wird die Breadcrumb innerhalb dieser Kategorieseite nicht mehr angezeigt.'
],
'translated' => true
]
]
];
}
}