ich habe ein kleines Vorhaben, denn ich würde gerne in der product-card vereinzelte Ausgaben der Eigenschaften darstellen, nur leider finde ich keinen Ansatz oder ein Eintrag in der Docs.
Dort wo ich bereits die Liste mit den 3 Eigenschaften erstellt habe, sollte dementsprechend auch die Ausgabe dargestellt werden. Welche Variablen und Abfragen benötige ich hier für oder wo kann ich etwas ähnliches ansehen? In der Produktübersicht bei den Eigenschaften wird ja nur die komplette Tabelle der eingepflegten Eigenschaften ausgegeben.
Ich hab das wie beschrieben dort eingefügt, nur sobald ich das Theme compile und den Cache lösche, schmeißt mir Shopware auf der Produktdetailseite ein “Leider ist etwas schief gelaufen” aus…
Hast du Shopware in der PROD oder DEV Version am laufen? Im PROD Mode sollte Twig Debug nicht gehen, wenn du in var/log Ordner schaust hast entweder ein prod.log oder dev.log. Bei einem prod.log sollte sowas wie unbekannte Twig Funktion drin stehen.
Du kannst auf alles was du siehst zugreifen wenn das hast was du brauchst kannst das dump() wegnehmen und musst es halt noch an die richtige Stellen im Template setzen. Über die Elemente musst du ggf. iterieren das ich denke sich die IDs ändern von Produkt zu produkt aber einfach mal ausprobieren.
Hallöchen, ich melde mich mal wieder deswegen.
Wir haben auf die 6.1 RC3 gewechselt und jetzt wollen wir diese Änderung dort endlich fertig stellen.
Also ich habe jetzt einen Dump darauf erstellt und habe festgestellt, dass properties plötzlich auf null steht, obwohl die ganz sicher eingepflegt sind.
Hier der Dump:
Hallo zusammen. Ich schließe mich hier mal an, da ich Ähnliches versuche. In der Product-Box im Listing werden die sortedProperties nicht ausgegeben (sind immer NULL). Nur auf der Detailseite. Habt ihr eine Lösug gefunden, innerhalb der Product-Box auf die Eigenschaften zuzugreifen?
Die zugehörige services.xml sieht bei mir bisher so aus:
Damit hat man immerhin die properties und die zugehörigen groups. Aber eben immer noch nicht sortiert unter sortedProperties. Kann man natürlich ungelenk im Tiwg-Template nachbauen, aber schöner wäre es natürlich per PHP im Vorhinein.
class ListingPropertiesSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
ProductListingCriteriaEvent::class => 'handleListingRequest',
];
}
public function handleListingRequest(ProductListingCriteriaEvent $event): void
{
$event->getCriteria()->addAssociation('properties.group')
}
}
Mit der es mir möglich ist auf die Eigenschaften zuzugreifen. Allerdings frage ich mich, ob es eine komfortablere Möglichkeit gibt als über die Propertygroups zu iterieren und die Property- und Option-IDs zu vergleichen.
Falls hierzu jemand noch einen Tipp hat wäre ich sehr dankbar. Stehe da irgendwie auf dem Schlauch.
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 %}
vielen Dank für deine Lösung. Sie hat mir wirklich weitergeholfen. Hast du vielleicht noch einen Tipp. Wie man auf einzelne Eigenschaften zugreifen kann, ohne durch die das komplette “options”-Array iterieren zu müssen und den Namen zu vergleichen?
mmmh, wenn ich dich richtig verstehe, möchtest Du direkten Zugriff auf einzelne Eigenschaften, also quasi die Eigenschaften als Key? Dann wirst Du wohl so oder so iterieren - entweder ungelenk in Twig, oder Du bereitest dir die Eigenschaften in der onProductLoaded vor. Du könntest die Daten dann z.B. in ein CustomProperty schreiben (Shopware 6: Entity extension) und darauf dann im Template zugreifen. Vielleicht gibt es auch entsprechende Methoden im Core, das weiß ich aber nicht.
ich habe eure Diskussion gelesen und wollte nachfragen ob die Lösung auf funktioniert wenn die Bilder bei Eigenschaften auf der Artikel Detail Seite ausgeben will? Diese werden bei einem {{dump()}} im Listing angezeigt jedoch wird der Media Pfad auf der Artikel detailseite nicht ausgegeben.
Hat jemand hierfür eine Idee/Tipp?
Wäre euch super dankbar da ich echt schon lange daran hänge. Danke!
Habe die beiden Threads zu dem Thema mit viel Vorfreude durchgelesen und durchgearbeitet, allerdings leider ohne Erfolg Ist die Lösung nach wie vor valide? Es treibt mich grad zum Wahnsinn, dass man nicht out-of-the-box Zugriff auf die Produkteigeschaften in den Produkt-Listen hat. Ich habe keine Dev-Umgebung zur Hand und kann deswegen auch kein debug aufrufen, was das ganze noch schwieriger für mich macht. Ich bin auf Shopware Version 6.3.5.0.
Ich habe ein Subscriber-Plugin eingebunden, das wie hier beschrieben auf “onProductsLoaded” horcht und die sortedProperties befüllen sollte. Die Funktion wird auch ausgeführt, habe da mal testweise ein paar echos/var_dumps in den PHP-Code eingebunden um das nachzuvollziehen. Sieht auf den ersten Blick alles gut aus. Im Template kommt dann aber trotzdem nichts raus, wenn ich über product.sortedProperties iteriere.
Den Code habe ich minimal erweitert, da bei mir noch eine Exception geflogen ist. So sieht das aktuell aus:
public function onProductsLoaded(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();
if ($properties) {
$grouped = $properties->groupByPropertyGroups();
$grouped->sortByPositions();
$grouped->sortByConfig();
$productEntity->setSortedProperties( $grouped );
}
}
}
das läuft bei mir immer noch genau so wie ich es hier gepostet habe (bis auf die zusätzliche if-Abfrage, die Du ja auch schon eingbaut hast ;))
Für debug Ausgaben brauchts Du keine dev Umgebung, das Production Template reicht.
Wenn Du im Theme in der src/Resources/views/storefront/component/product/card/box-standard.html.twig mal {{ dump(product) }} machst, tauchen die Eigenschaften da nicht auf?
(Solltest Du allerdings direkt auf der deployten Version arbeiten, hast Du tatsächlich kein dump - ich rate dann dringend zum Production-Template, ansonsten macht das ja keinen Spaß…).
Ha, meinte natürlich Shopware Freudscher Verschreiber.
Werd mir dann mal das Production-Template für besseres Debugging aufsetzen. Dann ergibt sich vielleicht auch, warum das bei mir bisher nicht klappt.
Falls sich was ergibt, werde ich das hier nochmalt niederschreiben für den Fall, dass jemand anderes das gleiche Problem hat.
Versuch mich auch gerade an der Lösung - komme aber nicht groß weiter.
Kann von Euch jemand den gesamten Inhalt des Subscribers posten?
Komme nicht ganz mit den benötigten „use“ Sachen nach.