ProductStream-Erweiterung

Ich würde gerne ganz allgemein die Product-Stream-Queries erweitern. Zumindest aber mal in den Einkaufswelten und in den Kategorien.

Dazu habe ich mir überlegt, den ProductNumberSearch-Service oder die QueryBuilderFactory zu dekorieren. Damit komme ich zwar an die Query, um diese zu erweitern, aber ich kann nicht abfragen, ob es sich um einen ProductStream handelt.

So würde es bspw. in einer Kategorie funktionieren:

originalService = $service;
		$this->connection = $connection;
	}
	
	public function createProductQuery(Criteria $criteria, ShopContextInterface $context)
	{
		$query = $this->originalService->createProductQuery($criteria, $context);
	
		$categoryID = Shopware ()->Front ()->Request()->getParam('sCategory');
		
		if(!empty($categoryID)){
			$productStreamId = $this->findStreamIdByCategoryId($categoryID);
			if(!empty($productStreamId)){
				// Modify query
				$orderArray = $query->getQueryPart('orderBy');
				array_unshift($orderArray, 'product.name ASC');
				$query->add('orderBy', $orderArray);
			}
		}
	
		return $query;
	}
	
	/**
	 * {@inheritdoc}
	 */
	public function createQueryWithSorting(Criteria $criteria, ShopContextInterface $context)
	{
		$query = $this->originalService->createQueryWithSorting($criteria, $context);
	
		return $query;
	}
	
	/**
	 * {@inheritdoc}
	 *
	 * @throws \Exception
	 */
	public function createQuery(Criteria $criteria, ShopContextInterface $context)
	{
		$query = $this->originalService->createQuery($criteria, $context);
	
		return $query;
	}
	
	/**
	 * {@inheritdoc}
	 */
	public function createQueryBuilder()
	{
		return new QueryBuilder($this->connection);
	}
	
	/**
	 * @param int $categoryId
	 *
	 * @return int|null
	 */
	private function findStreamIdByCategoryId($categoryId)
	{
		$streamId = Shopware()->Container()->get('dbal_connection')->fetchColumn(
				'SELECT stream_id FROM s_categories WHERE id = :id',
				['id' => $categoryId]
		);
	
		if ($streamId) {
			return (int) $streamId;
		}
	
		return null;
	}
}

In einer Einkaufswelt bräuchte ich dann aber die ElementId und ProductStreamId, um den Query einschränken zu können.

Kann man ganz global ProductStreams erweitern, egal an welcher Stelle? Ansonsten müsste man jeden einzelnen Service dekorieren.

Danke im Voraus.

Und noch ein weiteres Problem:

Damit steht an anderer Stelle nicht mehr “shopware_searchdbal.dbal_query_builder_factory” zur Verfügung. Ab dem Zeitpunkt wird nur noch “mbdus_product_stream.dbal_query_builder_factory” an die Konstruktoren übergeben. Gibt es dafür eine Lösung? Ansonsten würde ich es über Enlight_Bootstrap_AfterInitResource versuchen.

Danke im Voraus.

 

Nachtrag:

Im zweiten Plugin bekomme ich die Fehlermeldung:

__construct() must be an instance of Shopware\Bundle\SearchBundleDBAL\QueryBuilderFactory, instance of MbdusProductStream\SearchBundle\QueryBuilderFactory given

Mit

use Shopware\Bundle\SearchBundleDBAL\QueryBuilderFactory as ShopwareQueryBuilderFactory;


class QueryBuilderFactory extends ShopwareQueryBuilderFactory

anstatt

class QueryBuilderFactory implements QueryBuilderFactoryInterface

funktioniert es.

Was passiert, wenn das 2. Plugin createProductQuery erweitern möchte? Funktioniert es dann auch noch?

Wenn alle Plugins brav das Interface benutzen, sollte es keine Probleme geben

1 Like