Artikel aus Listing entfernen

Hallo zusammen,

ich hänge gerade an einem kleinen Problem.

Aus dem Artikel-Listing und auch aus den Suchergebnissen sollten bestimmte Artikel entfernt werden.
Dazu habe ich das Beispiel hier als Ansatz verwendet: https://developers.shopware.com/developers-guide/plugin-system/#decorate-a-service
In getList() werden ja im Array $numbers die entsprechenden Artikel-Nummern gespeichert. Jetzt habe ich gedacht, ich wende hier einfach meine Logik an und entferne die entsprechenden Artikel aus dem Array, das funktionert auch soweit. Allerdings werden in dem Array nicht alle Artikel-Nummern ausgegeben, sondern in Abhängigkeit vom Paging, d.h. wenn es z.B. insgesamt 20 Artikel gibt, die gelistet werden aber Artikel pro Seite auf 12 steht, hat das Array nur 12 Artikel und beim blättern die nächsten 12 usw.
Das ist allerdings blöd, da meine Logik alle Artikel vergleichen und dann entsprechende Artikel löschen muß.

Wahrscheinlich muß ich den Weg über eigene Search-Criteria gehen, hier finde ich allerdings nicht wirklich ein Beispiel nach Richtlinien von 5.2, an dem ich mich orientieren kann. Generell finde ich es etwas mühsam, da sich doch immer wieder einiges ändert und Doku und Beispiele nicht immer aktuell sind. Ich stolpere oft über Links zu Beispielen, die nur noch 404er Seiten aufrufen. Für jemanden, der nichts anderes als Shopware macht, ist das sicher kein Problem aber ich bin zu überwiegend in TYPO3-Entwicklung unterwegs und in Shopware nur zu einem geringen Anteil, dann finde ich es oft eine endlose Sucherei, gerade wenn sich wieder unter der Haube einiges geändert hat und man nur alte Beispiele findet.

Viele Grüße und danke für jeden Hinweis

Andi

Warum so kompliziert. Einfach die gewünschten Artikel im Backend über die Artikelübersicht inaktiv setzen. Fertig.

Naja, wenn es so einfach wäre, würde ich natürlich kein Plugin dafür programmieren wollen Wink

In dem Shop sollen gebrauchte Artikel verkauft werden, jeden Artikel gibt es deshalb nur einmal und wenn er verkauft ist, ist er weg.
So gibt es z.B. in dem Shop 5 mal ein iPhone 6, jedes als einzelnen Artikel mit eigenen Bildern.
Wenn jetzt aber alle 5 iPhone 6 verkauft sind, soll ein Musterprodukt erscheinen, also in dem Fall ein iPhone 6 Dummy, damit man sieht, es gibt iPhones, momentan ist nur keines vorhanden. Deshalb muß ich dynamisch diese Musterprodukte ein- oder ausblenden, abhängig davon, ob es aktuell Artikel dazu gibt oder nicht.
Gelöst habe ich das über ein eigenes Attribut (Typ: Dummy oder Artikel) und auch noch die Artikelnummer (Dummy: 12345-00, Artikel: 12345-01 usw.).

Ich hoffe, mein Problem ist so verständlicher Smile

Viele Grüße

Andi

Ja wo ist dann hier das Problem? Benachichtigungsfunktion in Shopware deaktivieren und Artikelanzahl bei den Artikeln auf 1 stellen, fertig. Wenn Produkt verkauft ist, es ist zwar noch in der Liste, kann aber nicht gekauft werden.

Im 1. Beitrag schreibst du, jedoch, dass der Artikel entfernt werden soll, im 2. Soll er nur als Dummy zu sehen sein. Willst ein Plugin programmieren, solltest dich aber erstmal mit den vielfältigen Einstellung auseinander setzen, genau beschreiben was du möchtest und mit Boardmitteln läßt sich das sicher lösen.

Das Produkt soll aber nicht mehr in der Liste sein, wenn es verkauft worden ist. Sonst sind ja alle 578 iPhones in der Liste, die jemals verkauft wurden.
Es sollen nur die iPhones angezeigt werden, die tatsächlich gerade zum Verkauf stehen und wenn es gerade keines gibt, soll das Muster-iPhone angezeigt werden.

Wenn das mit dem Muster-Artikel nicht wäre, dann wäre es mit Boardmitteln natürlich kein Problem aber so sehe ich keine Möglichkeit, ohne Plugin.

Klar, ich stelle bei den Artikeln:

  • Lagerbestand = 1
  • Maximalabnahme = 1
  • Artikel bei Bestand <= 0 nicht bestellbar (Haken)

Dann werden verkaufte Artikel nicht mehr angezeigt.
Trotzdem besteht das Problem mit dem Muster-Artikel noch, der sich abhängig davon, ob es aktuell Artikel von dem Typ gibt oder nicht, ein- oder ausblenden soll.

Viele Grüße

Andi

Hallo zusammen,

jetzt muß ich nochmal nachfragen.
Mittlerweile habe ich eine Lösung, die im Prinzip auch so halbwegs funktioniert. Allerdings bin ich mir nicht sicher, ob es nicht eine elegantere Lösung gibt.

Ich habe die ProductSearch (Shopware\Bundle\SearchBundle\ProductSearch) dekoriert.

Ziel war es ja aus der Ergebnisliste Artikel zu entfernen. Problem ist hier, daß immer nur ein Teil der Liste ausgegeben wird, abhängig vom Paging aber nicht die komplette Liste aller Ergebnisse. Ich benötige aber eine komplette Liste, da alle Ergebnis-Produkte verglichen werden und dann entsprechend einzelne Produkte entfernt werden müssen.

Das hier bringt immer nur eine Teil-Liste, abhängig vom Paging:
$numberResult = $this->productSearch->search($criteria, $context);

Deshalb habe ich eine komplette Liste temporär geladen und vorher die Criteria geändert:
$criteria->limit();
$criteria->offset(0);
$numberResultAll = $this->productSearch->search($criteria, $context);

Hier wende ich dann meine Logik an und schreibe die zu entfernenden Produktnummern in ein Array, mit dessen Hilfe ich dann die Produkte aus dem eigentlichen Ergebnis ($numberResult) entferne.

Ich finde die Lösung nicht ganz so elegant, sie funktioniert bis auf einen Schönheitsfehler zwar aber falls jemand einen Hinweis für mich hat, wie man das eleganter lösen könnte, würde ich mich natürlich freuen.

 

Viele Grüße

Andi