Zum Hauptinhalt springen

Custom DataField anlegen

Der einfachste Weg ein eigenes DataField hinzuzufügen ist, von einer der eingebauten Abstract-Klassen zu erben. Diese übernehmen bereits die null-Prüfung im Context und stellen eine typsichere Signatur bereit.


Beispiel: Eigenes Produktfeld

Im folgenden Beispiel wird ein DataField erstellt, das das Shopware-Custom-Field my_plugin_part_number eines Produkts zurückgibt.

1. Klasse erstellen

<?php

declare(strict_types=1);

namespace MyPlugin\Connector\DataField\Field;

use AgiqonConnector\Connector\DataField\Field\Product\AbstractProductDataField;
use AgiqonConnector\Connector\System\ConnectorSystemType;
use Shopware\Core\Content\Product\ProductEntity;
use Shopware\Core\Framework\Context;

readonly class MyPartNumberField extends AbstractProductDataField
{
public function __construct()
{
parent::__construct(
'myPartNumber', // technicalName
[ConnectorSystemType::OCI, ConnectorSystemType::cXML] // verfügbar für beide Systeme
);
}

public function getValue(ProductEntity $product, Context $context): ?string
{
$customFields = $product->getCustomFields();

return $customFields['my_plugin_part_number'] ?? null;
}
}

AbstractProductDataField trägt bereits #[DataFieldTypeAttribute(DataFieldType::Product)] und prüft, ob ein ProductEntity im Context vorhanden ist. getValue() erhält direkt das Produkt.

2. In services.xml registrieren

<service id="MyPlugin\Connector\DataField\Field\MyPartNumberField">
<tag name="agiqon_connector.data_field"/>
</service>

Der Tag agiqon_connector.data_field registriert das Feld automatisch in der DataFieldRegistry. Danach ist es in der Connector-Konfiguration unter dem Namen myPartNumber auswählbar.


Verfügbare Abstract-Klassen

Für jeden eingebauten Typ existiert eine fertige Abstract-Klasse, die die null-Prüfung im Context übernimmt und eine typsichere getValue()-Signatur bereitstellt:

KlasseTypgetValue()-Signatur
AbstractContextDataFieldcontextgetValue(SalesChannelContext): ?string
AbstractCustomizedProductDataFieldcustomized_productgetValue(LineItem, Context): ?string
AbstractLineItemDataFieldline_itemgetValue(LineItem, Context): ?string
AbstractProductDataFieldproductgetValue(ProductEntity, Context): ?string
AbstractProductCustomFieldDataFieldproductgetValue(ProductEntity, string $customField, Context): ?string
AbstractShippingDataFieldshippinggetValue(ShippingMethodEntity, Cart): ?string
AbstractSystemFieldsystemgetValue(ConnectorSystemEntity): ?string
AbstractTransmissionFieldsessiongetValue(ConnectorSession): ?string
tipp

AbstractProductCustomFieldDataField ist speziell für Shopware Custom Fields gedacht – es stellt neben dem ProductEntity auch den konfigurierten Custom-Field-Key ($customField) direkt bereit.