Passed
Push — master ( 59f96f...9edaa9 )
by Mikołaj
05:36
created

OptionBuilder::resolveProductOptions()   B

Complexity

Conditions 5
Paths 6

Size

Total Lines 18
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 8.8571
c 0
b 0
f 0
cc 5
eloc 11
nc 6
nop 2
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
 * another great project.
7
 * You can find more information about us on https://bitbag.shop and write us
8
 * an email on [email protected].
9
 */
10
11
declare(strict_types=1);
12
13
namespace BitBag\SyliusElasticsearchPlugin\PropertyBuilder;
14
15
use BitBag\SyliusElasticsearchPlugin\PropertyNameResolver\ConcatedNameResolverInterface;
16
use Elastica\Document;
17
use FOS\ElasticaBundle\Event\TransformEvent;
18
use Sylius\Component\Core\Model\ProductInterface;
19
20
final class OptionBuilder extends AbstractBuilder
21
{
22
    /**
23
     * @var ConcatedNameResolverInterface
24
     */
25
    private $optionNameResolver;
26
27
    /**
28
     * @param ConcatedNameResolverInterface $optionNameResolver
29
     */
30
    public function __construct(ConcatedNameResolverInterface $optionNameResolver)
31
    {
32
        $this->optionNameResolver = $optionNameResolver;
33
    }
34
35
    /**
36
     * @param TransformEvent $event
37
     */
38
    public function buildProperty(TransformEvent $event): void
39
    {
40
        /** @var ProductInterface $product */
41
        $product = $event->getObject();
42
43
        if (!$product instanceof ProductInterface) {
0 ignored issues
show
introduced by
$product is always a sub-type of Sylius\Component\Core\Model\ProductInterface.
Loading history...
44
            return;
45
        }
46
47
        $document = $event->getDocument();
48
49
        $this->resolveProductOptions($product, $document);
50
    }
51
52
    /**
53
     * @param ProductInterface $product
54
     * @param Document $document
55
     */
56
    private function resolveProductOptions(ProductInterface $product, Document $document): void
57
    {
58
        foreach ($product->getVariants() as $productVariant) {
59
            foreach ($productVariant->getOptionValues() as $productOptionValue) {
60
                $optionCode = $productOptionValue->getOption()->getCode();
61
                $index = $this->optionNameResolver->resolvePropertyName($optionCode);
62
63
                if (!$document->has($index)) {
64
                    $document->set($index, []);
65
                }
66
67
                $reference = $document->get($index);
68
                $value = $productOptionValue->getValue();
69
70
                if (!in_array($value, $reference)) {
71
                    $reference[] = $productOptionValue->getValue();
72
73
                    $document->set($index, $reference);
74
                }
75
            }
76
        }
77
    }
78
}
79