diff --git a/CRM/DataprocessorOutputExport/CSV.php b/CRM/DataprocessorOutputExport/CSV.php index f0f81fb64aa990ac06a78da5a3f06e528c9867cf..a91d710ee2ad1d6cee44854d3fdfc47a8a403249 100644 --- a/CRM/DataprocessorOutputExport/CSV.php +++ b/CRM/DataprocessorOutputExport/CSV.php @@ -20,7 +20,7 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { * @return bool */ public function hasConfiguration() { - return false; + return true; } /** @@ -31,7 +31,30 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { * @param array $filter */ public function buildConfigurationForm(\CRM_Core_Form $form, $output=array()) { + $form->add('text', 'delimiter', E::ts('Delimiter'), array(), true); + $form->add('text', 'enclosure', E::ts('Enclosure'), array(), true); + $form->add('text', 'escape_char', E::ts('Escape char'), array(), true); + $configuration = false; + if ($output && isset($output['configuration'])) { + $configuration = $output['configuration']; + } + if ($configuration && isset($configuration['delimiter']) && $configuration['delimiter']) { + $defaults['delimiter'] = $configuration['delimiter']; + } else { + $defaults['delimiter'] = ';'; + } + if ($configuration && isset($configuration['enclosure']) && $configuration['enclosure']) { + $defaults['enclosure'] = $configuration['enclosure']; + } else { + $defaults['enclosure'] = '"'; + } + if ($configuration && isset($configuration['escape_char']) && $configuration['escape_char']) { + $defaults['escape_char'] = $configuration['escape_char']; + } else { + $defaults['escape_char'] = '\\'; + } + $form->setDefaults($defaults); } /** @@ -41,7 +64,7 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { * @return false|string */ public function getConfigurationTemplateFileName() { - return false; + return "CRM/DataprocessorOutputExport/Form/Configuration/CSV.tpl"; } @@ -53,7 +76,11 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { * @return array */ public function processConfiguration($submittedValues, &$output) { - return array(); + $configuration = array(); + $configuration['delimiter'] = $submittedValues['delimiter']; + $configuration['enclosure'] = $submittedValues['enclosure']; + $configuration['escape_char'] = $submittedValues['escape_char']; + return $configuration; } /** @@ -116,11 +143,11 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { $path = CRM_Core_Config::singleton()->templateCompileDir . 'dataprocessor_export_csv/'. $filename; if ($sortFieldName) { - $dataProcessor->getDataFlow()->addSort($sortFieldName, $sortDirection); + $dataProcessorClass->getDataFlow()->addSort($sortFieldName, $sortDirection); } - self::createHeaderLine($path, $dataProcessorClass); - self::exportDataProcessor($path, $dataProcessorClass); + self::createHeaderLine($path, $dataProcessorClass, $outputBAO['configuration']); + self::exportDataProcessor($path, $dataProcessorClass, $outputBAO['configuration']); $mimeType = CRM_Utils_Request::retrieveValue('mime-type', 'String', '', FALSE); @@ -160,7 +187,7 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { CRM_Utils_File::restrictAccess($basePath.'/'); $filename = $basePath.'/'. $name.'.csv'; - self::createHeaderLine($filename, $dataProcessorClass); + self::createHeaderLine($filename, $dataProcessorClass, $outputBAO['configuration']); $count = $dataProcessorClass->getDataFlow()->recordCount(); $recordsPerJob = self::RECORDS_PER_JOB; @@ -176,7 +203,7 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { 'CRM_DataprocessorOutputExport_CSV', 'exportBatch' ), //call back method - array($filename,$formValues, $dataProcessor['id'], $i, $recordsPerJob, $sortFieldName, $sortDirection), //parameters, + array($filename,$formValues, $dataProcessor['id'], $outputBAO['id'], $i, $recordsPerJob, $sortFieldName, $sortDirection), //parameters, $title ); //now add this task to the queue @@ -196,18 +223,18 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { $runner->runAllViaWeb(); // does not return } - protected static function createHeaderLine($filename, \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor) { + protected static function createHeaderLine($filename, \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $configuration) { $file = fopen($filename, 'a'); fwrite($file, "\xEF\xBB\xBF"); // BOF this will make sure excel opens the file correctly. $headerLine = array(); foreach($dataProcessor->getDataFlow()->getOutputFieldHandlers() as $outputHandler) { $headerLine[] = $outputHandler->getOutputFieldSpecification()->title; } - fputcsv($file, $headerLine); + fputcsv($file, $headerLine, $configuration['delimiter'], $configuration['enclosure'], $configuration['escape_char']); fclose($file); } - protected static function exportDataProcessor($filename, \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor) { + protected static function exportDataProcessor($filename, \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $configuration) { $file = fopen($filename, 'a'); try { while($record = $dataProcessor->getDataFlow()->nextRecord()) { @@ -215,7 +242,7 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { foreach($record as $field => $value) { $row[] = $value->formattedValue; } - fputcsv($file, $row); + fputcsv($file, $row, $configuration['delimiter'], $configuration['enclosure'], $configuration['escape_char']); } } catch (\Civi\DataProcessor\DataFlow\EndOfFlowException $e) { // Do nothing @@ -223,8 +250,9 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { fclose($file); } - public static function exportBatch(CRM_Queue_TaskContext $ctx, $filename, $params, $dataProcessorId, $offset, $limit, $sortFieldName = null, $sortDirection = 'ASC') { + public static function exportBatch(CRM_Queue_TaskContext $ctx, $filename, $params, $dataProcessorId, $outputId, $offset, $limit, $sortFieldName = null, $sortDirection = 'ASC') { $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dataProcessorId)); + $output = civicrm_api3('DataProcessorOutput', 'getsingle', array('id' => $outputId)); $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor); CRM_Dataprocessor_Form_Output_AbstractUIOutputForm::applyFilters($dataProcessorClass, $params); if ($sortFieldName) { @@ -232,7 +260,7 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { } $dataProcessorClass->getDataFlow()->setOffset($offset); $dataProcessorClass->getDataFlow()->setLimit($limit); - self::exportDataProcessor($filename, $dataProcessorClass); + self::exportDataProcessor($filename, $dataProcessorClass, $output['configuration']); return TRUE; } diff --git a/templates/CRM/DataprocessorOutputExport/Form/Configuration/CSV.tpl b/templates/CRM/DataprocessorOutputExport/Form/Configuration/CSV.tpl new file mode 100644 index 0000000000000000000000000000000000000000..d6e41a9c74840c0a30077e3803d2da0e1a583bb6 --- /dev/null +++ b/templates/CRM/DataprocessorOutputExport/Form/Configuration/CSV.tpl @@ -0,0 +1,19 @@ +{crmScope extensionKey='dataprocessor'} + + <div class="crm-section"> + <div class="label">{$form.delimiter.label}</div> + <div class="content">{$form.delimiter.html}</div> + <div class="clear"></div> + </div> + <div class="crm-section"> + <div class="label">{$form.enclosure.label}</div> + <div class="content">{$form.enclosure.html}</div> + <div class="clear"></div> + </div> + <div class="crm-section"> + <div class="label">{$form.escape_char.label}</div> + <div class="content">{$form.escape_char.html}</div> + <div class="clear"></div> + </div> + +{/crmScope} \ No newline at end of file