Subscriber event nur im frontend

Hi,

wie kann ein event nur im frontend ausgeführt werden? Als Beispiel; ich möchte im frontend Werte von Artikeln ändern:

  public static function getSubscribedEvents(): array
  {
      return [
          ProductEvents::PRODUCT_SEARCH_RESULT_LOADED_EVENT => 'searchResultLoaded',
      ];
  }

public function searchResultLoaded(EntitySearchResultLoadedEvent $event, string $eventName, TraceableEventDispatcher $debug): void
  {
    $this->context = $event->getResult()->getContext();
    if(get_class($this->context->getSource()) == 'Shopware\Core\Framework\Api\Context\AdminApiSource'){
      return;
    }
    
    // do something with $event->getResult()

  }

Momentan frage ich den Klassennamen vom context source ab. Der ist im Adminpanel nämlich Shopware\Core\Framework\Api\Context\AdminApiSource. Fühlt sich aber irgendwie falsch an. Hat jemand einen besseren Vorschlag?

1 „Gefällt mir“

Ich versteh nicht genau was du genau möchtest. Du kannst über den Subscriber bei einem Produkt etwas hinzufügen. Theoretisch müsste man auf diese Weise auch Werte manipulieren können. Vielleicht hilft dir dieser Code etwas.

public static function getSubscribedEvents()
    {
        return [
            ProductSearchResultEvent::class => 'handleResult',
        ];
    }

public function handleResult(ProductSearchResultEvent $event)
{
    $result = $event->getResult();

    $tempArr = ['blabla'];
    
    foreach ($result->getEntities() as $product) {
        $product->addExtension("myExtension", new ProductStruct($tempArr));
    }
}

ProductStruct.php:

class ProductStruct extends Struct
{
    var $myVar;

    public function __construct(array $myVar)
    {
        $this->myVar = $myVar;
    }
}

 Im Frontend {{ product.extension('myExtension').myVar}}

Bei dir wird ja ProductSearchResultEvent sowohl im Frontend als auch im Backend ausgeführt. D.h. deine Results werden auch im Backend mit myExtension erweitert.

Meine Frage ist halt, wie kann ich das auf eins von beiden beschränken? In sw5 hat das ja über den Event-Namen funktioniert Enlight_Controller_Action_PostDispatch_Frontend.

Hast du eine Lösung gefunden?