includeAggregateRows = true; } /** * Separator for building recursive labels (or paths) * @var string */ public $recursiveLabelSeparator = ''; /** * @param DataTable $dataTable * @param string $recursiveLabelSeparator * @return DataTable|DataTable\Map */ public function flatten($dataTable, $recursiveLabelSeparator) { $this->recursiveLabelSeparator = $recursiveLabelSeparator; return $this->manipulate($dataTable); } /** * Template method called from self::manipulate. * Flatten each data table. * * @param DataTable $dataTable * @return DataTable */ protected function manipulateDataTable($dataTable) { $newDataTable = $dataTable->getEmptyClone($keepFilters = true); // this recursive filter will be applied to subtables $dataTable->filter('ReplaceSummaryRowLabel'); $this->flattenDataTableInto($dataTable, $newDataTable); return $newDataTable; } /** * @param $dataTable DataTable * @param $newDataTable */ protected function flattenDataTableInto($dataTable, $newDataTable, $prefix = '', $logo = false) { foreach ($dataTable->getRows() as $rowId => $row) { $this->flattenRow($row, $rowId, $newDataTable, $prefix, $logo); } } /** * @param Row $row * @param DataTable $dataTable * @param string $labelPrefix * @param bool $parentLogo */ private function flattenRow(Row $row, $rowId, DataTable $dataTable, $labelPrefix = '', $parentLogo = false) { $label = $row->getColumn('label'); if ($label !== false) { $label = trim($label); if ($this->recursiveLabelSeparator == '/') { if (substr($label, 0, 1) == '/') { $label = substr($label, 1); } elseif ($rowId === DataTable::ID_SUMMARY_ROW && $labelPrefix && $label != DataTable::LABEL_SUMMARY_ROW) { $label = ' - ' . $label; } } $label = $labelPrefix . $label; $row->setColumn('label', $label); } $logo = $row->getMetadata('logo'); if ($logo === false && $parentLogo !== false) { $logo = $parentLogo; $row->setMetadata('logo', $logo); } /** @var DataTable $subTable */ $subTable = $row->getSubtable(); if ($subTable) { $subTable->applyQueuedFilters(); $row->deleteMetadata('idsubdatatable_in_db'); } else { $subTable = $this->loadSubtable($dataTable, $row); } $row->removeSubtable(); if ($subTable === null) { if ($this->includeAggregateRows) { $row->setMetadata('is_aggregate', 0); } $dataTable->addRow($row); } else { if ($this->includeAggregateRows) { $row->setMetadata('is_aggregate', 1); $dataTable->addRow($row); } $prefix = $label . $this->recursiveLabelSeparator; $this->flattenDataTableInto($subTable, $dataTable, $prefix, $logo); } } /** * Remove the flat parameter from the subtable request * * @param array $request * @return array */ protected function manipulateSubtableRequest($request) { unset($request['flat']); return $request; } }