So, war gar nicht so kompliziert wie ich dachte
Im Subscriber folgenden Event hinzufügen:
ProductEvents::PRODUCT_LOADED_EVENT => "onProductLoaded"
Die Methode sieht dann grob so aus:
public function onProductLoaded(EntityLoadedEvent $event): void
{
if ( !($event->getContext()->getSource() instanceof \Shopware\Core\Framework\Api\Context\SalesChannelApiSource) ) {
return;
}
foreach ($event->getEntities() as $productEntity) {
/** @var SalesChannelProductEntity $productEntity */
$properties = $productEntity->getProperties();
$grouped = $properties->groupByPropertyGroups();
$grouped->sortByPositions();
$grouped->sortByConfig();
$productEntity->setSortedProperties( $grouped );
}
}
Damit ist dann sortedProperties gefüllt, sortiert nach Backendeinstellung und sauber gruppiert. Zur Ausgabe kann man ohne große Änderungen den Block aus page/product-detail/properties.html.twig nehmen. Ungefähr so:
{# @var product \Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity #}
{% for group in product.sortedProperties %}
{{ group.translated.name|e }}:
{% apply spaceless %}
{% for option in group.options %}
{% set i = ( i | default(0) ) + 1 %}
{% if i > 1 %}, {% endif %}{{ option.translated.name|e }}
{% endfor %}
{% endapply %}
{% endfor %}
Fertig!
Beste Grüße,
devnullroot