Skip to content

Commit a9d546c

Browse files
committed
OP-289: Fix bundle filter handling
1 parent 6fac2a2 commit a9d546c

File tree

12 files changed

+91
-79
lines changed

12 files changed

+91
-79
lines changed

src/Entity/ProductBundlesAwareInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@ public function getProductBundle(): ?ProductBundleInterface;
1818
public function setProductBundle(?ProductBundleInterface $productBundle): void;
1919

2020
public function isBundle(): bool;
21+
22+
public function hasProductBundleItems(): bool;
2123
}

src/Entity/ProductBundlesAwareTrait.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace BitBag\SyliusProductBundlePlugin\Entity;
1313

14+
use Doctrine\Common\Collections\Collection;
1415
use Doctrine\ORM\Mapping as ORM;
1516

1617
trait ProductBundlesAwareTrait
@@ -45,4 +46,14 @@ public function isBundle(): bool
4546
{
4647
return null !== $this->getProductBundle();
4748
}
49+
50+
public function hasProductBundleItems(): bool
51+
{
52+
$items = $this->getProductBundle()?->getProductBundleItems();
53+
if (!$items instanceof Collection) {
54+
return false;
55+
}
56+
57+
return 0 < $items->count();
58+
}
4859
}

src/Grid/Filter/IsBundleFilter.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,28 @@
1111

1212
namespace BitBag\SyliusProductBundlePlugin\Grid\Filter;
1313

14+
use BitBag\SyliusProductBundlePlugin\Repository\ProductBundleRepositoryInterface;
1415
use Sylius\Component\Grid\Data\DataSourceInterface;
1516
use Sylius\Component\Grid\Filter\BooleanFilter;
1617
use Sylius\Component\Grid\Filtering\FilterInterface;
1718

1819
final class IsBundleFilter implements FilterInterface
1920
{
20-
//TODO fix handling bundles with no products added
21+
public function __construct(private ProductBundleRepositoryInterface $productBundleRepository)
22+
{
23+
}
24+
2125
public function apply(DataSourceInterface $dataSource, string $name, $data, array $options): void
2226
{
27+
$productBundleIds = $this->productBundleRepository->getProductIds();
28+
2329
switch ($data) {
2430
case BooleanFilter::TRUE:
25-
$dataSource->restrict('productBundleItems IS NOT NULL');
31+
$dataSource->restrict($dataSource->getExpressionBuilder()->in('id', $productBundleIds));
2632

2733
break;
2834
case BooleanFilter::FALSE:
29-
$dataSource->restrict('productBundleItems IS NULL');
35+
$dataSource->restrict($dataSource->getExpressionBuilder()->notIn('id', $productBundleIds));
3036

3137
break;
3238
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
/*
4+
* This file has been created by developers from BitBag.
5+
* Feel free to contact us once you face any issues or want to start
6+
* You can find more information about us on https://bitbag.io and write us
7+
* an email on hello@bitbag.io.
8+
*/
9+
10+
declare(strict_types=1);
11+
12+
namespace BitBag\SyliusProductBundlePlugin\Repository;
13+
14+
use Doctrine\Common\Collections\Collection;
15+
use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository;
16+
use Sylius\Component\Product\Model\ProductVariantInterface;
17+
18+
class ProductBundleRepository extends EntityRepository implements ProductBundleRepositoryInterface
19+
{
20+
public function getProductIds(): array
21+
{
22+
return $this->createQueryBuilder('pb')
23+
->select('product.id')
24+
->leftJoin('pb.product', 'product')
25+
->leftJoin('pb.productBundleItems', 'items')
26+
->andWhere('items.id IS NOT NULL')
27+
->getQuery()
28+
->getSingleColumnResult();
29+
}
30+
31+
/** @param Collection<int, ProductVariantInterface> $variants */
32+
public function findBundlesByVariants(Collection $variants): array
33+
{
34+
return $this->createQueryBuilder('pb')
35+
->select('pb')
36+
->leftJoin('pb.productBundleItems', 'items')
37+
->andWhere('items.productVariant IN (:variants)')
38+
->setParameter('variants', $variants)
39+
->getQuery()
40+
->getResult();
41+
}
42+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
/*
4+
* This file has been created by developers from BitBag.
5+
* Feel free to contact us once you face any issues or want to start
6+
* You can find more information about us on https://bitbag.io and write us
7+
* an email on hello@bitbag.io.
8+
*/
9+
10+
declare(strict_types=1);
11+
12+
namespace BitBag\SyliusProductBundlePlugin\Repository;
13+
14+
use Doctrine\Common\Collections\Collection;
15+
use Sylius\Component\Product\Model\ProductVariantInterface;
16+
use Sylius\Component\Resource\Repository\RepositoryInterface;
17+
18+
interface ProductBundleRepositoryInterface extends RepositoryInterface
19+
{
20+
public function getProductIds(): array;
21+
22+
/** @param Collection<int, ProductVariantInterface> $variants */
23+
public function findBundlesByVariants(Collection $variants): array;
24+
}

src/Repository/ProductBundlesAwareInterface.php

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/Repository/ProductBundlesAwareTrait.php

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/Resources/config/grids.yml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,8 @@
11
sylius_grid:
22
grids:
33
sylius_admin_product:
4-
driver:
5-
name: doctrine/orm
6-
options:
7-
class: "%sylius.model.product.class%"
8-
repository:
9-
method: createSearchListQueryBuilder
10-
arguments: [ "expr:service('sylius.context.locale').getLocaleCode()", $taxonId ]
114
fields:
12-
bundle:
5+
productBundleItems:
136
type: twig
147
label: bitbag_sylius_product_bundle.ui.is_bundle
158
options:

src/Resources/config/resources/product_bundle.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ sylius_resource:
66
model: BitBag\SyliusProductBundlePlugin\Entity\ProductBundle
77
interface: BitBag\SyliusProductBundlePlugin\Entity\ProductBundleInterface
88
form: BitBag\SyliusProductBundlePlugin\Form\Type\ProductBundleType
9+
repository: BitBag\SyliusProductBundlePlugin\Repository\ProductBundleRepository

src/Resources/config/services/filter.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
55
<services>
66
<service id="bitbag_sylius_product_bundle.grid.filter.is_bundle" class="BitBag\SyliusProductBundlePlugin\Grid\Filter\IsBundleFilter">
7+
<argument type="service" id="bitbag_sylius_product_bundle.repository.product_bundle"/>
78
<tag name="sylius.grid_filter" type="is_bundle" form_type="Sylius\Bundle\GridBundle\Form\Type\Filter\BooleanFilterType" />
89
</service>
910
</services>

0 commit comments

Comments
 (0)