From 51e2485a7489ee712542646d5e83a91f03b7cc95 Mon Sep 17 00:00:00 2001 From: Jaap Jansma <jaap.jansma@civicoop.org> Date: Tue, 21 May 2019 10:24:23 +0200 Subject: [PATCH] Added file download link output handler --- Civi/DataProcessor/Factory.php | 5 + .../FileFieldOutputHandler.php | 98 +++++++++++++++++++ Civi/DataProcessor/Output/Api.php | 5 +- 3 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 Civi/DataProcessor/FieldOutputHandler/FileFieldOutputHandler.php diff --git a/Civi/DataProcessor/Factory.php b/Civi/DataProcessor/Factory.php index 78e1790d..5d89de20 100644 --- a/Civi/DataProcessor/Factory.php +++ b/Civi/DataProcessor/Factory.php @@ -10,6 +10,7 @@ use Civi\DataProcessor\DataFlow\Sort\SortCompareFactory; use Civi\DataProcessor\DataSpecification\FieldSpecification; use Civi\DataProcessor\Event\FilterHandlerEvent; use Civi\DataProcessor\Event\OutputHandlerEvent; +use Civi\DataProcessor\FieldOutputHandler\FileFieldOutputHandler; use Civi\DataProcessor\FieldOutputHandler\OptionFieldOutputHandler; use Civi\DataProcessor\FieldOutputHandler\RawFieldOutputHandler; use Civi\DataProcessor\FilterHandler\SimpleSqlFilter; @@ -279,6 +280,10 @@ class Factory { $optionOutputHandler = new OptionFieldOutputHandler($field, $source); $event->handlers[$optionOutputHandler->getName()] = $optionOutputHandler; } + if ($field->type == 'File') { + $fileOutputHandler = new FileFieldOutputHandler($field, $source); + $event->handlers[$fileOutputHandler->getName()] = $fileOutputHandler; + } $this->dispatcher->dispatch(OutputHandlerEvent::NAME, $event); return $event->handlers; } diff --git a/Civi/DataProcessor/FieldOutputHandler/FileFieldOutputHandler.php b/Civi/DataProcessor/FieldOutputHandler/FileFieldOutputHandler.php new file mode 100644 index 00000000..6479c790 --- /dev/null +++ b/Civi/DataProcessor/FieldOutputHandler/FileFieldOutputHandler.php @@ -0,0 +1,98 @@ +<?php +/** + * @author Jaap Jansma <jaap.jansma@civicoop.org> + * @license AGPL-3.0 + */ + +namespace Civi\DataProcessor\FieldOutputHandler; + +use CRM_Dataprocessor_ExtensionUtil as E; +use Civi\DataProcessor\Source\SourceInterface; +use Civi\DataProcessor\DataSpecification\FieldSpecification; +use Civi\DataProcessor\FieldOutputHandler\FieldOutput; + +class FileFieldOutputHandler extends AbstractFieldOutputHandler implements OutputHandlerSortable { + + /** + * @var \Civi\DataProcessor\DataSpecification\FieldSpecification + */ + protected $inputFieldSpec; + + /** + * @var \Civi\DataProcessor\Source\SourceInterface + */ + protected $dataSource; + + public function __construct(FieldSpecification $inputFieldSpec, SourceInterface $dataSource) { + $this->dataSource = $dataSource; + $this->inputFieldSpec = $inputFieldSpec; + $this->outputFieldSpecification = clone $inputFieldSpec; + $this->outputFieldSpecification->alias = $this->getName(); + } + + /** + * @return \Civi\DataProcessor\DataSpecification\FieldSpecification + */ + public function getSortableInputFieldSpec() { + return $this->inputFieldSpec; + } + + /** + * Returns the name of the handler type. + * + * @return String + */ + public function getName() { + return 'file_field_'.$this->inputFieldSpec->alias; + } + + /** + * Returns the data type of this field + * + * @return String + */ + protected function getType() { + return $this->inputFieldSpec->type; + } + + /** + * Returns the title of this field + * + * @return String + */ + public function getTitle() { + return E::ts('%1 :: %2 (Download link)', array(1 => $this->dataSource->getSourceTitle(), 2 => $this->inputFieldSpec->title)); + } + + /** + * Initialize the processor + * + * @param String $alias + * @param String $title + * @param array $configuration + * @param \Civi\DataProcessor\ProcessorType\AbstractProcessorType $processorType + */ + public function initialize($alias, $title, $configuration) { + parent::initialize($alias, $title, $configuration); + $this->dataSource->ensureFieldInSource($this->inputFieldSpec); + } + + /** + * Returns the formatted value + * + * @param $rawRecord + * @param $formattedRecord + * + * @return \Civi\DataProcessor\FieldOutputHandler\FieldOutput + */ + public function formatField($rawRecord, $formattedRecord) { + $rawValue = $rawRecord[$this->inputFieldSpec->alias]; + if ($rawValue) { + $attachment = civicrm_api3('Attachment', 'getsingle', array('id' => $rawValue)); + return new FieldOutput($attachment["url"], $rawValue); + } + return new FieldOutput("", $rawValue); + } + + +} \ No newline at end of file diff --git a/Civi/DataProcessor/Output/Api.php b/Civi/DataProcessor/Output/Api.php index 2df9acaa..6aec2973 100644 --- a/Civi/DataProcessor/Output/Api.php +++ b/Civi/DataProcessor/Output/Api.php @@ -104,10 +104,6 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte Events::RESOLVE => array( array('onApiResolve', Events::W_EARLY), ), - /*Events::RESPOND => array( - 'onGetFieldsRepsonse', // we use this method to add our field definition to the getFields action. - 'onGetOptionsRepsonse', // we use this method to add our field definition to the getFields action. - ),*/ ); } @@ -210,6 +206,7 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte 'title' => $fieldSpec->title, 'description' => '', 'type' => $type, + 'data_type' => $fieldSpec->type, 'api.required' => FALSE, 'api.aliases' => [], 'api.filter' => FALSE, -- GitLab