1<?php
2
3namespace FINDOLOGIC\Export\Helpers;
4
5/**
6 * Class UsergroupAwareMultiValue
7 * @package FINDOLOGIC\Export\Helpers
8 *
9 * Multi values that can differ per usergroup, and have multiple values for each.
10 */
11abstract class UsergroupAwareMultiValue implements Serializable
12{
13    private $rootCollectionName;
14    private $usergroupCollectionName;
15    private $csvDelimiter;
16    private $values = [];
17
18    public function __construct($rootCollectionName, $usergroupCollectionName, $csvDelimiter)
19    {
20        $this->rootCollectionName = $rootCollectionName;
21        $this->usergroupCollectionName = $usergroupCollectionName;
22        $this->csvDelimiter = $csvDelimiter;
23    }
24
25    public function addValue(UsergroupAwareMultiValueItem $value)
26    {
27        if (!array_key_exists($value->getUsergroup(), $this->values)) {
28            $this->values[$value->getUsergroup()] = [];
29        }
30
31        array_push($this->values[$value->getUsergroup()], $value);
32    }
33
34    public function setAllValues($values)
35    {
36        $this->values = $values;
37    }
38
39    /**
40     * @SuppressWarnings(PHPMD.StaticAccess)
41     * @inheritdoc
42     */
43    public function getDomSubtree(\DOMDocument $document)
44    {
45        $rootCollectionElem = XMLHelper::createElement($document, $this->rootCollectionName);
46
47        foreach ($this->values as $usergroup => $usergroupValues) {
48            $usergroupCollectionElem = XMLHelper::createElement($document, $this->usergroupCollectionName);
49            if ($usergroup) {
50                $usergroupCollectionElem->setAttribute('usergroup', $usergroup);
51            }
52            $rootCollectionElem->appendChild($usergroupCollectionElem);
53
54            /** @var UsergroupAwareMultiValueItem $value */
55            foreach ($usergroupValues as $value) {
56                $usergroupCollectionElem->appendChild($value->getDomSubtree($document));
57            }
58        }
59
60        return $rootCollectionElem;
61    }
62
63    /**
64     * @inheritdoc
65     */
66    public function getCsvFragment()
67    {
68        $mergedValues = '';
69
70        if (array_key_exists('', $this->values)) {
71            foreach ($this->values[''] as $value) {
72                $escapedValue = preg_replace('/' . $this->csvDelimiter . '/', ' ', $value);
73
74                $mergedValues .= $escapedValue . $this->csvDelimiter;
75            }
76        }
77
78        $trimmedMergedValues = rtrim($mergedValues, $this->csvDelimiter);
79
80        return $trimmedMergedValues;
81    }
82}
83