<?php declare(strict_types=1);
namespace ProxaNavigationMenu;
use Shopware\Core\Content\Category\CategoryDefinition;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\IdSearchResult;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\ActivateContext;
use Shopware\Core\Framework\Plugin\Context\UpdateContext;
use Shopware\Core\System\CustomField\CustomFieldTypes;
class ProxaNavigationMenu extends Plugin
{
const PREFIX = 'proxa_menu';
public function activate(ActivateContext $activateContext): void
{
$this->makeCustomFields();
}
public function update(UpdateContext $updateContext): void
{
$this->makeCustomFields();
}
private function makeCustomFields()
{
$this->removeCustomFields();
foreach ($this->getFields() as $key => $fields) {
$setName = self::PREFIX . '__' . $key;
$fieldsSet = $this->getCustomFieldSet($setName, $fields);
$this->container->get('custom_field_set.repository')->upsert([$fieldsSet], Context::createDefaultContext());
}
}
private function getFields(): array
{
return [
CategoryDefinition::ENTITY_NAME => [
'relations' => [
['entityName' => CategoryDefinition::ENTITY_NAME]
],
'customFields' => [
[
'id' => md5(self::PREFIX . '_slider_media'),
'name' => self::PREFIX . '_slider_media',
'type' => CustomFieldTypes::TEXT,
'config' => [
'customFieldType' => CustomFieldTypes::MEDIA,
'componentName' => 'sw-media-field',
'label' => [
'de-DE' => 'Slider Image',
'en-GB' => 'Slider Image',
],
]
],
[
'id' => md5(self::PREFIX . '_slider_sub'),
'name' => self::PREFIX . '_slider_sub',
'type' => CustomFieldTypes::SELECT,
'config' => [
'customFieldType' => CustomFieldTypes::ENTITY,
'componentName' => 'sw-entity-multi-id-select',
'entity' => CategoryDefinition::ENTITY_NAME,
'label' => [
'de-DE' => 'Slider Categories',
'en-GB' => 'Slider Categories',
],
]
],
[
'id' => md5(self::PREFIX . '_slider_desc'),
'name' => self::PREFIX . '_slider_desc',
'type' => CustomFieldTypes::TEXT,
'config' => [
'customFieldType' => CustomFieldTypes::TEXT,
'label' => [
'de-DE' => 'Slider Description',
'en-GB' => 'Slider Description',
],
]
],
[
'id' => md5(self::PREFIX . '_category_icon_media'),
'name' => self::PREFIX . '_category_icon_media',
'type' => CustomFieldTypes::TEXT,
'config' => [
'customFieldType' => CustomFieldTypes::MEDIA,
'componentName' => 'sw-media-field',
'label' => [
'de-DE' => 'Category Icon',
'en-GB' => 'Category Icon',
],
]
],
]
],
];
}
private function removeCustomFields()
{
foreach ($this->getFields() as $key => $fields) {
$criteria = (new Criteria())->addFilter(new ContainsFilter('name', self::PREFIX . '__' . $key));
$customFieldRepo = $this->container->get('custom_field_set.repository');
/** @var IdSearchResult $customField */
$customFieldIds = $customFieldRepo->searchIds($criteria, Context::createDefaultContext());
$ids = array_map(static function ($id) {
return ['id' => $id];
}, $customFieldIds->getIds());
if (!empty($ids)) {
$customFieldRepo->delete($ids, Context::createDefaultContext());
}
}
}
private function getCustomFieldSet(string $setName, array $fields): array
{
return array_merge([
'id' => md5($setName),
'name' => $setName,
'active' => true,
'config' => [
'label' => [
'de-DE' => 'Navigation Menu',
'en-GB' => 'Navigation Menu'
]
]
], $fields);
}
}