getQueryParams(); if (!$queryParams['uri']) { throw new common_exception_MissingParameter('uri', __METHOD__); } $uri = $queryParams['uri']; $metaDataArray = $this->getMetadataRepository()->findMetadataByClassUri($uri); $template = $this->getTemplateRepository()->findById(CsvTemplateRepository::DEFAULT); $headers = $this->getTemplateHeaderParser()->parse($template, $metaDataArray); $templateSampleLines = $this->getTemplateSampleLines()->createMultiple($template); $className = $this->getClassName($uri); $filename = $this->getFileName($className); $csvContent = $this->getCsvContent($headers, $templateSampleLines); return $response ->withHeader('Content-Encoding', 'UTF-8') ->withHeader('Content-Type', 'text/csv; charset=UTF-8') ->withHeader("Content-Disposition", "attachment; filename=" . $filename) ->withBody(stream_for($csvContent)); } private function getCsvContent($headers, $templateSampleLines): string { $extraMetadataColumns = str_repeat( self::CSV_SEPARATOR . '""', count($headers) - count($templateSampleLines[0]) ); $sampleLines = implode(self::CSV_SEPARATOR, $headers) . PHP_EOL; foreach ($templateSampleLines as $row) { foreach ($row as &$column) { $column = '"' . $column . '"'; } $sampleLines .= implode(self::CSV_SEPARATOR, $row) . $extraMetadataColumns . PHP_EOL; } return $sampleLines; } private function getFileName(string $className): string { return 'tabular_template_for_' . $className . '_' . date('YmdHis') . rand(10, 99) . '.csv'; } public function getClassName(string $uri): string { return $this->getClass($uri)->getLabel(); } private function getMetadataRepository(): MetadataRepository { return $this->getServiceLocator()->get(MetadataRepository::class); } private function getTemplateHeaderParser(): TemplateHeaderParser { return $this->getServiceLocator()->get(TemplateHeaderParser::class); } private function getTemplateRepository(): TemplateRepositoryInterface { return $this->getServiceLocator()->get(CsvTemplateRepository::class); } private function getTemplateSampleLines(): CsvTemplateSampleLineFactory { return $this->getServiceLocator()->get(CsvTemplateSampleLineFactory::class); } }