/** * Exports a given set of data row ids using a given configuration. * * @param \Database\Result $config * @param array|null $ids * * @throws ExportFailedException */ public function export($config, $ids = null) { $dataCollector = $this->prepareDefaultDataCollector($config, $ids); $reader = new ArrayReader($dataCollector->getExportData()); $writer = new CsvFileWriter('system/tmp/' . File::getName($config)); // Add header fields if ($config->headerFields) { $reader->setHeaderFields($this->prepareDefaultHeaderFields($config, $dataCollector)); $writer->enableHeaderFields(); } $row = new Row($config, $this->prepareDefaultExportConfig($config, $dataCollector)); $writer->setRowCallback(function ($data) use($row) { return $row->compile($data); }); $this->handleDefaultExportResult($writer->writeFrom($reader)); $this->updateLastRun($config); $objFile = new \File($writer->getFilename()); $objFile->sendToBrowser(); }
/** * Export with template. * * @param $config * @param ArrayReader $reader * @param Row $row * @param $format */ protected function exportWithTemplate($config, ArrayReader $reader, Row $row, $format) { // Fetch the template and make a copy of it $template = \FilesModel::findByPk($config->template); if (null === $template) { $objResponse = new Response('Could not find template.', 500); $objResponse->send(); } $tmpPath = 'system/tmp/' . File::getName($config); \Files::getInstance()->copy($template->path, $tmpPath); $excelReader = PHPExcel_IOFactory::createReader($format); $excel = $excelReader->load(TL_ROOT . '/' . $tmpPath); $excel->setActiveSheetIndex((int) $config->sheetIndex); $sheet = $excel->getActiveSheet(); $currentRow = (int) $config->startIndex ?: 1; $currentColumn = 0; foreach ($reader as $readerRow) { $compiledRow = $row->compile($readerRow); foreach ($compiledRow as $k => $value) { // Support explicit target column if ('tokens' === $config->export && isset($config->tokenFields[$k]['targetColumn'])) { $column = $config->tokenFields[$k]['targetColumn']; if (!is_numeric($column)) { $column = PHPExcel_Cell::columnIndexFromString($column) - 1; } } else { // Use next column, ignoring explicit target columns in the counter $column = $currentColumn++; } $sheet->setCellValueExplicitByColumnAndRow($column, $currentRow, (string) $value, \PHPExcel_Cell_DataType::TYPE_STRING2); } $currentColumn = 0; $currentRow++; } $excelWriter = \PHPExcel_IOFactory::createWriter($excel, $format); $excelWriter->save(TL_ROOT . '/' . $tmpPath); $this->updateLastRun($config); $tmpFile = new \File($tmpPath); $tmpFile->sendToBrowser(); }
/** * Handles the Simple Tokens and Insert Tags when exporting. * * @param $columnConfig * @param $data * @param $config * @param $value */ public function handleTokenExports($columnConfig, $data, $config, $value) { if ($config->export != 'tokens') { return null; } $tokens = array(); foreach ($columnConfig['allFieldsConfig'] as $fieldConfig) { $value = ''; if (isset($data[$fieldConfig['id']])) { $value = $data[$fieldConfig['id']]['value']; $value = deserialize($value); // Add multiple tokens (<fieldname>_<option_name>) for multi-choice fields if (is_array($value)) { foreach ($value as $choice) { $tokens[$fieldConfig['name'] . '_' . $choice] = 1; } } $value = Row::transformValue($data[$fieldConfig['id']]['value'], $fieldConfig); } $tokens[$fieldConfig['name']] = $value; } return Tokens::recursiveReplaceTokensAndTags($columnConfig['tokensValue'], $tokens); }