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.