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