Hallo Ich habe für Produkte eine EntityExtension geschrieben:
class ProductExtension extends EntityExtension
{
public function extendFields(FieldCollection $collection): void
{
$collection->add(
(new ManyToManyAssociationField(
'bonoAccessoires',
ProductDefinition::class,
ProductAccessoireDefinition::class,
'product_id',
'accessoire_id')
)->addFlags(new CascadeDelete(), new Inherited())
);
$collection->add(
(new ManyToManyAssociationField(
'bonoMainProducts',
ProductDefinition::class,
ProductAccessoireDefinition::class,
'accessoire_id',
'product_id')
)->addFlags(new CascadeDelete(), new ReverseInherited('bonoAccessoires'))
);
}
public function getDefinitionClass(): string
{
return ProductDefinition::class;
}
}
Die Definition ist wie folgt aufgebaut:
class ProductAccessoireDefinition extends MappingEntityDefinition
{
public const ENTITY_NAME = 'bono_product_accessoire';
public function getEntityName(): string
{
return self::ENTITY_NAME;
}
protected function defineFields(): FieldCollection
{
return new FieldCollection([
(new FkField('product_id', 'productId', ProductDefinition::class))->addFlags(new PrimaryKey(), new Required()),
(new ReferenceVersionField(ProductDefinition::class,'product_version_id'))->addFlags(new PrimaryKey(), new Required()),
(new FkField('accessoire_id', 'accessoireId', ProductDefinition::class))->addFlags(new PrimaryKey(), new Required()),
(new ReferenceVersionField(ProductDefinition::class,'accessoire_version_id'))->addFlags(new PrimaryKey(), new Required()),
new ManyToOneAssociationField('bonoProduct', 'product_id', ProductDefinition::class, 'id', false),
new ManyToOneAssociationField('bonoAccessoire', 'accessoire_id', ProductDefinition::class, 'id', false),
new CreatedAtField(),
]);
}
}
Als Subscripber hab ich das ProductLoaderCriteriaEvent und onProductPageLoaded registriert.
class ProductPageSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
ProductLoaderCriteriaEvent::class => 'onProductCriteriaLoaded',
ProductPageLoadedEvent::class => 'onProductPageLoaded'
];
}
public function onProductCriteriaLoaded(ProductLoaderCriteriaEvent $event): void
{
$event->getCriteria()->addAssociations(['bonoAccessoires.cover','bonoAccessoires.deliveryTime']);
$event->getCriteria()->getAssociation('bonoAccessoires');
$event->getCriteria()->addAssociations(['bonoMainProducts.cover','bonoMainProducts.deliveryTime']);
$event->getCriteria()->getAssociation('bonoMainProducts');
}
public function onProductPageLoaded(ProductPageLoadedEvent $event):void
{
if($event->getPage() && $event->getPage()->getProduct() && $bonoAccessoires = $event->getPage()->getProduct()->getExtension('bonoAccessoires')) {
$bonoAccessoires->getElements();
}
if($event->getPage() && $event->getPage()->getProduct() && $bonoMainProducts= $event->getPage()->getProduct()->getExtension('bonoMainProducts')) {
$bonoMainProducts->getElements();
}
}
}
Jetzt habe ich das Problem wenn ich auf die Rest-API zugreife über
https://meinshop.de/api/v1/product/<uuid_des_produktes></uuid_des_produktes>
Dann sehe ich zwar die Extensions “bonoAccessoires” und “bonoMainProducts” gelistet, jedoch ohne Inhalt.
Auch wenn ich auf
https://meinshop.de/api/v1/product/<uuid_des_produktes>/extensions/bonoAccessoires</uuid_des_produktes>
zugreife bekomme ich nichts angezeigt, obwohl verknüpfungen vorhanden sind.
In der Storefront kann ich jedoch auf alles zugreifen.
Und über die Produktapi mit einem PATCH-Request kann ich auch Produkte miteinander Verknüpfen…
https://meinshop.de/api/v1/product/<uuid_des_produktes></uuid_des_produktes>
Mit JSON:
{
"bonoAccessoires": [
{
"id": "c06698bdc852422e87925c9c28e64b62"
}
]
}
ich bekomme jedoch nicht die Verknüpfungen über die Api ausgelesen.
Wo liegt mein Fehler?