Widget::getFilterString()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 6
c 1
b 0
f 0
nc 3
nop 0
dl 0
loc 13
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Setono\SyliusStrandsPlugin\Widget;
6
7
/**
8
 * This class represents a Strands widget: http://retail.strands.com/resources/javascript-library/#widinstall
9
 */
10
final class Widget
11
{
12
    /** @var string */
13
    private $template;
14
15
    /** @var string[] */
16
    private $items = [];
17
18
    /** @var string[][] */
19
    private $filters = [];
20
21
    public function __construct(string $template)
22
    {
23
        $this->template = $template;
24
    }
25
26
    public static function create(string $template): self
27
    {
28
        return new self($template);
29
    }
30
31
    public function getHtml(): string
32
    {
33
        $html = '<div class="strandsRecs" tpl="' . $this->template . '"';
34
35
        if (count($this->items) > 0) {
36
            $html .= ' item="' . implode('_._', $this->items) . '"';
37
        }
38
39
        $filterString = $this->getFilterString();
40
        if (null !== $filterString) {
41
            $html .= ' dfilter="' . $filterString . '"';
42
        }
43
44
        $html .= '></div>';
45
46
        return $html;
47
    }
48
49
    public function __toString(): string
50
    {
51
        return $this->getHtml();
52
    }
53
54
    public function addItem(string $item): self
55
    {
56
        $this->items[] = $item;
57
58
        return $this;
59
    }
60
61
    /**
62
     * @param string $key The property to filter on, i.e. Category
63
     * @param string $value The value to filter, i.e. Shoes
64
     */
65
    public function addFilter(string $key, string $value): self
66
    {
67
        $this->filters[$key][] = $value;
68
69
        return $this;
70
    }
71
72
    private function getFilterString(): ?string
73
    {
74
        if (count($this->filters) === 0) {
75
            return null;
76
        }
77
78
        $filterGroups = [];
79
80
        foreach ($this->filters as $key => $val) {
81
            $filterGroups[] = $key . '::' . implode(';;', $val);
82
        }
83
84
        return implode('_._', $filterGroups);
85
    }
86
}
87