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:
| Klasse | Typ | getValue()-Signatur |
|---|---|---|
AbstractContextDataField | context | getValue(SalesChannelContext): ?string |
AbstractCustomizedProductDataField | customized_product | getValue(LineItem, Context): ?string |
AbstractLineItemDataField | line_item | getValue(LineItem, Context): ?string |
AbstractProductDataField | product | getValue(ProductEntity, Context): ?string |
AbstractProductCustomFieldDataField | product | getValue(ProductEntity, string $customField, Context): ?string |
AbstractShippingDataField | shipping | getValue(ShippingMethodEntity, Cart): ?string |
AbstractSystemField | system | getValue(ConnectorSystemEntity): ?string |
AbstractTransmissionField | session | getValue(ConnectorSession): ?string |
AbstractProductCustomFieldDataField ist speziell für Shopware Custom Fields gedacht – es stellt neben dem ProductEntity auch den konfigurierten Custom-Field-Key ($customField) direkt bereit.