Mapping anpassen
Wichtige Hinweise zum Mapping!
Diese Dokumentation des Mappings wird nicht offiziell unterstützt. Wir möchten hiermit die eigenständige Einarbeitung erleichtern. Sofern Fragen zu individuellen Mappings bestehen und von uns supported werden sollen, rechnen wir dies laut Preisliste nach Aufwand ab.
Events
Folgende Events können zum Mapping verwendet werden:
Eingabedaten verändern
Eingabedaten zu einem Datensatz lesen und bearbeiten.
MappingFields ändern
MappingFields hinzufügen, bearbeiten, entfernen.
Filterung mit $event->getMappingType() möglich.
Beispiele:
Produktdaten:
if ($event->getMappingType() === \LenzPlatformPlentyConnector\Sync\DataSync\ProcessProductService::class) {
// Your mapping manipulation here.
Kategoriedaten:
if ($event->getMappingType() === \LenzPlatformPlentyConnector\Sync\DataSync\ProcessCategoryService::class) {
// Your mapping manipulation here.
Beispiel zur Veränderung des Mappings:
<?php
namespace LenzPlatformPlentyConnectorCustomization\Subscriber;
use LenzPlatformPlentyConnector\Feature\DataService\Mapping\Converter\MappingValueConverter;
use LenzPlatformPlentyConnector\Feature\DataService\Mapping\DataStore\DataStore;
use LenzPlatformPlentyConnector\Sync\DataSync\Mapping\MappingCreatedEvent;
use LenzPlatformPlentyConnector\Sync\DataSync\Mapping\MappingField;
use LenzPlatformPlentyConnector\Sync\DataSync\ProcessProductService;
use Shopware\Core\System\Language\LanguageEntity;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MappingSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly MappingValueConverter $mappingValueConverter,
) {
}
public static function getSubscribedEvents(): array
{
return [
MappingCreatedEvent::class => 'onMappingCreated'
];
}
public function onMappingCreated(MappingCreatedEvent $event): void
{
if ($event->getMappingType() === ProcessProductService::class) {
$this->onProductMappingCreatedEvent($event);
}
}
private function onProductMappingCreatedEvent(MappingCreatedEvent $event): void
{
$mapping = $event->getMapping();
// These fields will be removed.
$mappingFieldsToRemove = [
'active',
'variantListingConfig',
];
foreach ($mapping as $mappingKey => $mappingField) {
/** @var MappingField $value */
if (in_array($mappingField->getSwFieldName(), $mappingFieldsToRemove)) {
unset($mapping[$mappingKey]);
}
}
$mapping[] = new MappingField(
'active',
MappingField::TYPE_BOOLEAN,
['.'],
function (mixed $value, string $accessPath, LanguageEntity $language, DataStore $dataStore) {
if (!isset($value['variation']['base'])) {
return null;
}
$variationCount = (int) $value['variation']['base']['item']['variationCount'];
if ($variationCount > 1 && $value['variation']['base']['isMain'] === true) {
return true;
}
return $this->mappingValueConverter->convert($value, 'variation.base.isActive', $language);
}
);
// Display parent for all parents.
$mapping[] = (new MappingField(
'variantListingConfig',
MappingField::TYPE_ARRAY,
['.'],
function (mixed $value, string $accessPath, LanguageEntity $language, DataStore $dataStore) {
if (!isset($value['variation']['base'])) {
return null;
}
$variationCount = (int) $value['variation']['base']['item']['variationCount'];
if ($variationCount > 1 && $value['variation']['base']['isMain'] === true) {
return [
'displayParent' => true,
'mainVariantId' => null,
'configuratorGroupConfig' => null,
];
}
return [
'displayParent' => null,
'mainVariantId' => null,
'configuratorGroupConfig' => null,
];
}
))
->setDefaultValue(null)
;
$event->setMapping($mapping);
}
}
Konvertierte Daten ändern
Hier können die konvertierten Daten der Entität direkt vor dem Schreiben verändert werden.
Criteria erweitern
Verändere/Ergänze das DAL-Criteria für einzelne Abfragen, um zusätzlich benötigte Daten hinzuzufügen. Bitte suche im Quellcode nach den Stellen, an denen das Criteria durch dieses Event veränderbar ist.
Criteria-Namen:
- data.process-product.additional-data.existing-products
- data.process-category.additional-data.existing-categories
Bestellzeilen verändern
Der Connector generiert nach eigener Logik die Bestellzeilen. Sofern man die Bestellzeilen manipulieren möchte, kann man das in diesem Event machen.
Hinweis
Das Event wird im Subscriber mit 'lenz_platform_plenty_connector.order_sync.order_line_item_converted' identifiziert, nicht über den Klassennamen.
Gesamte Bestelldaten verändern
In diesem Event ist die gesamte Bestellung enthalten, die von Shopware zu PlentyONE übertragen werden soll. Änderungen können vorgenommen werden, um zu ändern, was an PlentyONE gesendet wird.
!!! "Hinweis"
Das Event wird im Subscriber mit 'lenz_platform_plenty_connector.order_sync.before_post_order' identifiziert, nicht über den Klassennamen.
MappingField
Mit der Klasse MappingField wird definiert, wie das Mapping von Daten von PlentyONE zu Shopware für dieses Feld erfolgen soll.
Beispiel:
(new MappingField(
'metaDescription',// Shopware Feldname.
MappingField::TYPE_STRING,// Datentyp.
['variation.base.texts.0.metaDescription'],// Zugriffspfad.
function (mixed $value, string $accessPath, LanguageEntity $language, DataStore $dataStore) {
// Callback-Funktion.
if (strlen($value) > 255) {
$value = substr($value, 0, 255);
}
return $value;
}
))
->setTranslatedField(true)// Ist ein übersetzbares Feld.
->setDefaultValue('Hier könnte ein Fallback-Text stehen.')// Standard-Wert auf 'Hier könnte ein Fallback-Text stehen.' setzen.
;
Mapping-Field Argumente
1 - Shopware Feldname
Hier werden die Daten reingeschrieben.
2 - Datentyp
Mögliche Datentypen:
public const TYPE_STRING = 'string';
public const TYPE_INT = 'int';
public const TYPE_FLOAT = 'float';
public const TYPE_DATETIME = 'datetime';
public const TYPE_BOOLEAN = 'boolean';
public const TYPE_ARRAY = 'array';
3 - Zugriffspfad
Angabe als Array. Wenn ein Pfad nicht gefunden wird, wird der nächste Pfad versucht zu nutzen.
Die Angabe eines Punkts ('.') führt dazu, dass das gesamte Eingabe-Array verwendet wird. Dies kann verwendet werden, um mithilfe der Callback-Funktion auf alle Werte zuzugreifen und den Wert zu manipulieren.
4 - Callback-Funktion
Hier kann der Wert, der durch den Zugriffspfad definiert wurde, geändert werden.
Dies wird z.B. genutzt, wenn ..
- man auf mehrere Werte aus den Eingabedaten zugreifen muss.
- eine PlentyONE-ID durch eine Shopware-ID ersetzt werden muss.
Beispiel: Callback-Funktion, die keine Änderung am Wert bewirkt.
function (mixed $value, string $accessPath, LanguageEntity $language, DataStore $dataStore) {
return $value;
}
Mapping-Field-Modifikatoren
->setTranslatedField()
Alle Felder, die in Shopware übersetzbar sind, müssen hier mit ->setTranslatedField(true) markiert werden.
->setDefaultValue()
Definiert einen Standard-Wert, der genutzt wird, wenn der Wert nach Konvertierung null ist.
->setUnsetNullValue()
Wenn ->setUnsetNullValue(true) gesetzt wird und der Wert nach Konvertierung null ist, wird der Wert nicht zu Shopware geschrieben.
Beispielcode
Wir haben einen Beispielcode den du unter folgendem Link downloaden kannst. Download Beispiel-Customization