config = $config; $this->preferences = $preferences; $this->metadata = $metadata; } public function process(Params $params, Data $data): StreamInterface { $attributeList = $params->getAttributeList(); $delimiterRaw = $this->preferences->get('exportDelimiter') ?? $this->config->get('exportDelimiter') ?? ','; $delimiter = str_replace('\t', "\t", $delimiterRaw); $fp = fopen('php://temp', 'w'); fputcsv($fp, $attributeList, $delimiter); while (($row = $data->readRow()) !== null) { $preparedRow = $this->prepareRow($row); fputcsv($fp, $preparedRow, $delimiter, '"' , "\0"); } rewind($fp); return new Stream($fp); } protected function prepareRow(array $row): array { $preparedRow = []; foreach ($row as $item) { if (is_array($item) || is_object($item)) { $item = Json::encode($item); } $preparedRow[] = $item; } return $preparedRow; } public function loadAdditionalFields(Entity $entity, array $fieldList): void { if (!$entity instanceof CoreEntity) { return; } foreach ($fieldList as $field) { $fieldType = $this->metadata ->get(['entityDefs', $entity->getEntityType(), 'fields', $field, 'type']); if ( $fieldType === 'linkMultiple' || $fieldType === 'attachmentMultiple' ) { if (!$entity->has($field . 'Ids')) { $entity->loadLinkMultipleField($field); } } } } }