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