diff --git a/Classes/DataProcessing/DataProcessingTrait.php b/Classes/DataProcessing/DataProcessingTrait.php index 844cbd4a..bf9b0242 100644 --- a/Classes/DataProcessing/DataProcessingTrait.php +++ b/Classes/DataProcessing/DataProcessingTrait.php @@ -20,18 +20,33 @@ trait DataProcessingTrait */ protected function removeDataIfnotAppendInConfiguration(array $processorConfiguration, array $processedData): array { - if (!isset($processorConfiguration['appendData']) || - (int)$processorConfiguration['appendData'] === 0) { - unset($processedData['data']); - if (isset($processorConfiguration['as'], $processedData[$processorConfiguration['as']]) - && is_array($processedData[$processorConfiguration['as']])) { + if ( + !isset($processorConfiguration['appendData']) || + (int)$processorConfiguration['appendData'] !== 1 + ) { + // Items to keep + $removeAll = !isset($processorConfiguration['appendData']) || $processorConfiguration['appendData'] == 0; + $keepItems = $removeAll ? [] : array_flip(array_map('trim', explode(',', $processorConfiguration['appendData']))); + if ($removeAll) { + unset($processedData['data']); + } else { + $processedData['data'] = array_intersect_key($processedData['data'], $keepItems); + } + if ( + isset($processorConfiguration['as'], $processedData[$processorConfiguration['as']]) + && is_array($processedData[$processorConfiguration['as']]) + ) { foreach ($processedData[$processorConfiguration['as']] as &$item) { if (is_array($item) && isset($item['data'])) { - unset($item['data']); + if ($removeAll) { + unset($item['data']); + } else { + $item['data'] = array_intersect_key($item['data'], $keepItems); + } } if ($this->isMenuProcessor() && isset($item['children']) && is_array($item['children'])) { - $this->removeDataInChildrenNodes($item['children']); + $this->removeDataInChildrenNodes($item['children'], $removeAll, $keepItems); } } } @@ -49,12 +64,18 @@ protected function isMenuProcessor(): bool * Removes recursively "data" in children nodes * * @param array $children + * @param bool $removeAll + * @param array $keepItems * @param string $nodeName */ - private function removeDataInChildrenNodes(array &$children, string $nodeName = 'children'): void + private function removeDataInChildrenNodes(array &$children, bool $removeAll, array $keepItems, string $nodeName = 'children'): void { foreach ($children as &$childrenItem) { - unset($childrenItem['data']); + if ($removeAll) { + unset($childrenItem['data']); + } else { + $childrenItem['data'] = array_intersect_key($childrenItem['data'], $keepItems); + } if (isset($childrenItem[$nodeName]) && is_array($childrenItem[$nodeName])) { $this->removeDataInChildrenNodes($childrenItem[$nodeName], $nodeName); }