<?php declare(strict_types=1);
namespace Dmag\DmagUploadCustomImage;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
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\DeactivateContext;
use Shopware\Core\Framework\Uuid\Uuid;
use Shopware\Core\System\CustomField\CustomFieldTypes;
class DmagUploadCustomImage extends Plugin
{
public function activate(ActivateContext $activateContext): void
{
########################################
#### Create necessary custom fields ####
########################################
//Return if the custom_field allready exists.
if($this->getExistingUuidForCustomField('dmag_upload_custom_images_is_active') != null) return;
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$customFieldSetRepository->create([
[
'name' => 'dmag_upload_custom_images',
'config' => [
'label' => [
'de-DE' => 'Kundendefiniertes Bild hochladen',
'en-GB' => 'Upload custom Images'
]
],
'customFields' => [
[
'name' => 'dmag_upload_custom_images_is_active',
'type' => CustomFieldTypes::SWITCH,
'config' => [
'label' => [
'de-DE' => 'Aktivieren',
'en-GB' => 'Activate'
],
'customFieldPosition' => 1
]
],
[
'name' => 'dmag_upload_custom_images_frame',
'type' => CustomFieldTypes::MEDIA,
'config' => [
"customFieldType" => CustomFieldTypes::MEDIA,
'label' => [
'de-DE' => 'Rahmen',
'en-GB' => 'Frame'
],
'placeholder' => [
'de-DE' => 'Bitte einen Rahmen auswählen',
'en-GB' => 'Please choose a frame'
],
'customFieldPosition' => 2,
"componentName" => "sw-media-field"
]
],
[
'name' => 'dmag_upload_custom_images_placeholder',
'type' => CustomFieldTypes::MEDIA,
'config' => [
"customFieldType" => CustomFieldTypes::MEDIA,
'label' => [
'de-DE' => 'Platzhalter',
'en-GB' => 'Placeholder'
],
'placeholder' => [
'de-DE' => 'Bitte einen Platzhalter auswählen',
'en-GB' => 'Please choose a Placeholder'
],
'customFieldPosition' => 3,
"componentName" => "sw-media-field"
]
]
],
'relations' => [
[
'id' => Uuid::randomHex(),
'entityName' => 'product'
]
],
]
], $activateContext->getContext());
}
public function deactivate(DeactivateContext $deactivateContext): void
{
$this->removeCustomField($deactivateContext);
}
###############################
####### Helpers #######
###############################
/**
* Get uuid from custom_field if allrady exists.
*/
private function getExistingUuidForCustomField($name){
$customFieldRepository = $this->container->get('custom_field.repository');
$context = Context::createDefaultContext();
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('name', $name));
$customField = $customFieldRepository->search($criteria, $context)->first();
if ($customField !== null) {
return $customField->getId();
}
return null;
}
/**
* Delete a Custom-Field-Set.
*/
private function removeCustomField(DeactivateContext $deactivateContext){
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$fieldIds = $this->customFieldsExist($deactivateContext->getContext(),'dmag_upload_custom_images');
if ($fieldIds) {
$customFieldSetRepository->delete(array_values($fieldIds->getData()), $deactivateContext->getContext());
}
}
/**
* Check if an Custom-Field-Set exists and return its ID in case available.
*/
private function customFieldsExist(Context $context,string $customFieldName): ?IdSearchResult{
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$criteria = new Criteria();
$criteria->addFilter(new EqualsAnyFilter('name', [$customFieldName]));
$ids = $customFieldSetRepository->searchIds($criteria, $context);
return $ids->getTotal() > 0 ? $ids : null;
}
}