Skip to content
Snippets Groups Projects
Commit 80b121b8 authored by jaapjansma's avatar jaapjansma
Browse files

Improvement to fallback field

parent 93892e8e
No related branches found
No related tags found
No related merge requests found
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
namespace Civi\DataProcessor\FieldOutputHandler; namespace Civi\DataProcessor\FieldOutputHandler;
use Civi\DataProcessor\DataSpecification\FieldSpecification; use Civi\DataProcessor\DataSpecification\FieldSpecification;
use Civi\DataProcessor\Source\SourceInterface;
use CRM_Dataprocessor_ExtensionUtil as E; use CRM_Dataprocessor_ExtensionUtil as E;
class FallbackFieldOutputHandler extends AbstractFieldOutputHandler { class FallbackFieldOutputHandler extends AbstractFieldOutputHandler {
...@@ -38,6 +39,31 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler { ...@@ -38,6 +39,31 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler {
*/ */
protected $fallbackField; protected $fallbackField;
/**
* @var string
*/
protected $what;
/**
* @var SourceInterface
*/
protected $dataSource;
/**
* @var \Civi\DataProcessor\DataSpecification\FieldSpecification
*/
protected $inputFieldSpec;
/**
* @var SourceInterface
*/
protected $dataSourceFallback;
/**
* @var \Civi\DataProcessor\DataSpecification\FieldSpecification
*/
protected $inputFallbackFieldSpec;
/** /**
* Initialize the processor * Initialize the processor
* *
...@@ -48,8 +74,14 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler { ...@@ -48,8 +74,14 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler {
*/ */
public function initialize($alias, $title, $configuration) { public function initialize($alias, $title, $configuration) {
$this->outputFieldSpec = new FieldSpecification($alias, $this->getType(), $title); $this->outputFieldSpec = new FieldSpecification($alias, $this->getType(), $title);
$this->field = $configuration['field']; $this->what = $configuration['what'];
$this->fallbackField = $configuration['fallback_field']; if ($this->what == 'fields') {
$this->field = $configuration['field'];
$this->fallbackField = $configuration['fallback_field'];
} elseif ($this->what == 'datasource') {
[$this->dataSource, $this->inputFieldSpec] = $this->initializeField($configuration['datasource_field'], $configuration['datasource'], $alias);
[$this->dataSourceFallback, $this->inputFallbackFieldSpec] = $this->initializeField($configuration['datasource_fallback_field'], $configuration['datasource_fallback'], $alias . '_fallback');
}
} }
/** /**
...@@ -70,7 +102,24 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler { ...@@ -70,7 +102,24 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler {
* @return \Civi\DataProcessor\FieldOutputHandler\FieldOutput * @return \Civi\DataProcessor\FieldOutputHandler\FieldOutput
*/ */
public function formatField($rawRecord, $formattedRecord) { public function formatField($rawRecord, $formattedRecord) {
return new FieldOutput(); $rawValue = null;
$formattedValue = null;
if ($this->what == 'datasource') {
$rawValue = $rawRecord[$this->inputFieldSpec->alias] ?? '';
$formattedValue = $rawRecord[$this->inputFieldSpec->alias] ?? '';
if ($rawValue == null || $rawValue == '') {
$rawValue = $rawRecord[$this->inputFallbackFieldSpec->alias] ?? '';
$formattedValue = $rawRecord[$this->inputFallbackFieldSpec->alias] ?? '';
}
if (strpos($formattedValue, \CRM_Core_DAO::VALUE_SEPARATOR) !== false) {
$formattedValue = explode(\CRM_Core_DAO::VALUE_SEPARATOR, trim($formattedValue,\CRM_Core_DAO::VALUE_SEPARATOR));
$formattedValue = implode(",", $formattedValue);
}
}
$output = new FieldOutput($rawValue);
$output->formattedValue = $formattedValue;
return $output;
} }
/** /**
...@@ -91,12 +140,14 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler { ...@@ -91,12 +140,14 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler {
* @return \Civi\DataProcessor\FieldOutputHandler\FieldOutput[] * @return \Civi\DataProcessor\FieldOutputHandler\FieldOutput[]
*/ */
public function postFormat(array $record): array { public function postFormat(array $record): array {
$alias = $this->getOutputFieldSpecification()->alias; if ($this->what == 'fields') {
$field = $record[$this->field]; $alias = $this->getOutputFieldSpecification()->alias;
$fallback = $record[$this->fallbackField]; $field = $record[$this->field];
$record[$alias] = clone $fallback; $fallback = $record[$this->fallbackField];
if ($field && !$field->isEmpty()) { $record[$alias] = clone $fallback;
$record[$alias] = clone $field; if ($field && !$field->isEmpty()) {
$record[$alias] = clone $field;
}
} }
return $record; return $record;
} }
...@@ -118,18 +169,42 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler { ...@@ -118,18 +169,42 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler {
* @param array $field * @param array $field
*/ */
public function buildConfigurationForm(\CRM_Core_Form $form, $field=array()) { public function buildConfigurationForm(\CRM_Core_Form $form, $field=array()) {
$dataSourceFields = \CRM_Dataprocessor_Utils_DataSourceFields::getAvailableFieldsInDataSources($field['data_processor_id']);
$fieldSelect = $this->getFieldOutputHandlers($field['data_processor_id']); $fieldSelect = $this->getFieldOutputHandlers($field['data_processor_id']);
$form->add('select', 'field', E::ts('Field'), $fieldSelect, true, array( $whatOptions = [
'datasource' => E::ts('Select fields from a data source'),
'fields' => E::ts('Select fields from field output'),
];
$form->add('select', 'what', E::ts('What'), $whatOptions, true, array(
'style' => 'min-width:250px', 'style' => 'min-width:250px',
'class' => 'crm-select2 huge data-processor-field-for-name', 'class' => 'crm-select2 huge',
'placeholder' => E::ts('- select -'), 'placeholder' => E::ts('- select -'),
)); ));
$form->add('select', 'fallback_field', E::ts('Fallback field'), $fieldSelect, true, array(
$form->add('select', 'field', E::ts('Field'), $fieldSelect, false, array(
'style' => 'min-width:250px', 'style' => 'min-width:250px',
'class' => 'crm-select2 huge', 'class' => 'crm-select2 huge',
'placeholder' => E::ts('- select -'), 'placeholder' => E::ts('- select -'),
)); ));
$form->add('select', 'fallback_field', E::ts('Fallback field'), $fieldSelect, false, array(
'style' => 'min-width:250px',
'class' => 'crm-select2 huge',
'placeholder' => E::ts('- select -'),
));
$form->add('select', 'datasource_field', E::ts('Field'), $dataSourceFields, false, array(
'style' => 'min-width:250px',
'class' => 'crm-select2 huge',
'placeholder' => E::ts('- select -'),
));
$form->add('select', 'datasource_fallback_field', E::ts('Fallback field'), $dataSourceFields, false, array(
'style' => 'min-width:250px',
'class' => 'crm-select2 huge',
'placeholder' => E::ts('- select -'),
));
if (isset($field['configuration'])) { if (isset($field['configuration'])) {
$configuration = $field['configuration']; $configuration = $field['configuration'];
$defaults = array(); $defaults = array();
...@@ -139,8 +214,40 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler { ...@@ -139,8 +214,40 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler {
if (isset($configuration['fallback_field'])) { if (isset($configuration['fallback_field'])) {
$defaults['fallback_field'] = $configuration['fallback_field']; $defaults['fallback_field'] = $configuration['fallback_field'];
} }
if (isset($configuration['what'])) {
$defaults['what'] = $configuration['what'];
} else {
$defaults['what'] = 'fields';
}
if (isset($configuration['datasource_field']) && isset($configuration['datasource'])) {
$defaults['datasource_field'] = \CRM_Dataprocessor_Utils_DataSourceFields::getSelectedFieldValue($field['data_processor_id'], $configuration['datasource'], $configuration['datasource_field']);
}
if (isset($configuration['datasource_fallback_field']) && isset($configuration['datasource_fallback'])) {
$defaults['datasource_fallback_field'] = \CRM_Dataprocessor_Utils_DataSourceFields::getSelectedFieldValue($field['data_processor_id'], $configuration['datasource_fallback'], $configuration['datasource_fallback_field']);
}
$form->setDefaults($defaults); $form->setDefaults($defaults);
} }
$form->addFormRule([FallbackFieldOutputHandler::class, 'validateConfigurationForm']);
}
public static function validateConfigurationForm(array $values) {
$errors = [];
if ($values['what'] == 'fields') {
if (empty($values['field'])) {
$errors['field'] = E::ts('The field is required.');
}
if (empty($values['fallback_field'])) {
$errors['fallback_field'] = E::ts('The field is required.');
}
} elseif ($values['what'] == 'datasource') {
if (empty($values['datasource_field'])) {
$errors['datasource_field'] = E::ts('The field is required.');
}
if (empty($values['datasource_fallback_field'])) {
$errors['datasource_fallback_field'] = E::ts('The field is required.');
}
}
return empty($errors) ? TRUE : $errors;
} }
/** /**
...@@ -161,8 +268,18 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler { ...@@ -161,8 +268,18 @@ class FallbackFieldOutputHandler extends AbstractFieldOutputHandler {
* @return array * @return array
*/ */
public function processConfiguration($submittedValues) { public function processConfiguration($submittedValues) {
$configuration['field'] = $submittedValues['field']; $configuration['what'] = $submittedValues['what'];
$configuration['fallback_field'] = $submittedValues['fallback_field']; if ($configuration['what'] == 'fields') {
$configuration['field'] = $submittedValues['field'];
$configuration['fallback_field'] = $submittedValues['fallback_field'];
} elseif ($configuration['what'] == 'datasource') {
[$datasource, $field] = explode('::', $submittedValues['datasource_field'], 2);
$configuration['datasource_field'] = $field;
$configuration['datasource'] = $datasource;
[$datasource_fallback, $fallback_field] = explode('::', $submittedValues['datasource_fallback_field'], 2);
$configuration['datasource_fallback_field'] = $fallback_field;
$configuration['datasource_fallback'] = $datasource_fallback;
}
return $configuration; return $configuration;
} }
......
{crmScope extensionKey='dataprocessor'} {crmScope extensionKey='dataprocessor'}
<div class="crm-section"> <div class="crm-section">
<div class="label">{$form.field.label}</div> <div class="label">{$form.what.label}</div>
<div class="content">{$form.what.html}</div>
<div class="clear"></div>
</div>
<div class="crm-section fields hiddenElement" >
<div class="label">{$form.field.label} <span class="crm-marker" title="{ts}This field is required{/ts}">*</span></div>
<div class="content">{$form.field.html}</div> <div class="content">{$form.field.html}</div>
<div class="clear"></div> <div class="clear"></div>
</div> </div>
<div class="crm-section"> <div class="crm-section fields hiddenElement">
<div class="label">{$form.fallback_field.label}</div> <div class="label">{$form.fallback_field.label} <span class="crm-marker" title="{ts}This field is required{/ts}">*</span></div>
<div class="content">{$form.fallback_field.html}</div> <div class="content">{$form.fallback_field.html}</div>
<div class="clear"></div> <div class="clear"></div>
</div> </div>
<div class="crm-section datasource hiddenElement">
<div class="label">{$form.datasource_field.label} <span class="crm-marker" title="{ts}This field is required{/ts}">*</span></div>
<div class="content">{$form.datasource_field.html}</div>
<div class="clear"></div>
</div>
<div class="crm-section datasource hiddenElement">
<div class="label">{$form.datasource_fallback_field.label} <span class="crm-marker" title="{ts}This field is required{/ts}">*</span></div>
<div class="content">{$form.datasource_fallback_field.html}</div>
<div class="clear"></div>
</div>
<script type="text/javascript">
{literal}
CRM.$(function($) {
$('#what').on('change', function() {
var what = $('#what').val();
if (what == 'fields') {
$('.crm-section.datasource').addClass('hiddenElement');
$('.crm-section.fields').removeClass('hiddenElement');
} else if (what == 'datasource') {
$('.crm-section.datasource').removeClass('hiddenElement');
$('.crm-section.fields').addClass('hiddenElement');
}
});
$('#what').trigger('change');
});
{/literal}
</script>
{/crmScope} {/crmScope}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment