FilterSql

in shopware 5 wurden alle *_FilterSql events entfernt, gibts dafür ersatz?

Hi, hängt natürlich davon ab, was du machen möchtest? Zum einfachen “Ergebnisse manipulieren” reicht ein einfacher Decorator (https://developers.shopware.com/develop … xtensions/), für Anpassungen an der eigentlichen Query-Logik, möchtest du vll. ein eigenes Criteria-Object nutzen (https://developers.shopware.com/develop … ch-bundle/) Gruß, Daniel

was wir wollen ist: zeige keine „zubehör“ kategorie artikeln unter „haupt“ kategorie artikel listing. für dies setzten admins in backend in kategorie attribute1 ob eine kategorie „haupt“ oder „zubehör“ (oder leer) ist. unsere shopware4 plugin war eine „simple“ Bootstrap.php: class Shopware\_Plugins\_Frontend\_FooBar\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { public function install() { $this-\>subscribeEvent( 'Shopware\_Modules\_Articles\_sGetArticlesByCategory\_FilterSql', 'injectIgnoriereZubehoerInHauptCategorie' ); $this-\>subscribeEvent( 'Shopware\_Modules\_Articles\_sGetArticlesByCategory\_FilterCountSql', 'injectIgnoriereZubehoerInHauptCategorie' ); return true; } public function injectIgnoriereZubehoerInHauptCategorie (Enlight\_Event\_EventArgs $args) { $sql = $args-\>getReturn(); $categoryId = $args-\>get("id"); $catAttr = 'attribute1'; $replace = 'WHERE ag.articleID IS NULL'; $search = '/'.preg\_quote($replace).'/'; $inject = ' AND IF( ( SELECT '.$catAttr.' FROM s\_categories\_attributes WHERE categoryId = '.$categoryId.' ) = "haupt" , IF( ( SELECT '.$catAttr.' FROM s\_categories\_attributes WHERE categoryId IN ( SELECT categoryID FROM s\_articles\_categories WHERE articleID = a.id ) LIMIT 1 ) = "zubehör" , 0 , 1 ) , 1 ) '; $sql = preg\_replace($search, $replace.$inject, $sql); $args-\>setReturn($sql); } } in shopware5 nehme ich an müssen wir eine doctrine query builder erweitern? klingt einfach, aber all diese boilerplate vorher habe ich keine ahnung… hab hier was zusammengewurschtelt das ich hofte sollte eine „unknown column foo“ verursachen wenn ich in frontend eine kategorie listing habe, es kommt aber keine fehler: Bootstrap.php use Shopware\Bundle\SearchBundle\ConditionInterface; use Shopware\Bundle\SearchBundleDBAL\ConditionHandlerInterface; use Shopware\Bundle\SearchBundleDBAL\QueryBuilder; use Shopware\Bundle\StoreFrontBundle\Struct; use Shopware\Bundle\StoreFrontBundle\Struct\ShopContextInterface; class Shopware\_Plugins\_Frontend\_FooBar\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { public function install() { $this-\>subscribeEvent('Enlight\_Controller\_Front\_StartDispatch', 'startDispatch'); return true; } public function startDispatch() { Shopware()-\>Events()-\>addListener( 'Shopware\_SearchBundleDBAL\_Collect\_Condition\_Handlers', function() { return new CategoryConditionHandler(); } ); } } class CategoryConditionHandler implements ConditionHandlerInterface { public function supportsCondition(ConditionInterface $condition) { return ($condition instanceof CategoryCondition); } public function generateCondition( ConditionInterface $condition, QueryBuilder $query, ShopContextInterface $context ) { $query-\>where("foo = bar"); } } was mache ich falsch? wo wird denn definiert das wir die query von alten event Shopware_Modules_Articles_sGetArticlesByCategory_FilterSql erweitern wollen?

:facepalm: alles was gefehlt hat war: use Shopware\Bundle\SearchBundle\Condition\CategoryCondition; ps. lustig das ich dafür keine fehler bekommen habe, hat wohl mit instanceof ne geist CategoryCondition verglichen?