diff --git a/CRM/Dataprocessor/BAO/DataProcessor.php b/CRM/Dataprocessor/BAO/DataProcessor.php index 1671ce7f4ed13b91ac211fe016e87be514822ff1..fe00305050b36959f0b53e569cef673fc82f913c 100644 --- a/CRM/Dataprocessor/BAO/DataProcessor.php +++ b/CRM/Dataprocessor/BAO/DataProcessor.php @@ -28,6 +28,11 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc while ($dataProcessor->fetch()) { $row = array(); self::storeValues($dataProcessor, $row); + if (!empty($row['aggregation'])) { + $row['aggregation'] = json_decode($row['aggregation'], true); + } else { + $row['aggregation'] = array(); + } $result[$row['id']] = $row; } return $result; @@ -71,6 +76,9 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc if (isset($dataProcessor->configuration) && is_array($dataProcessor->configuration)) { $dataProcessor->configuration = json_encode($dataProcessor->configuration); } + if (isset($dataProcessor->aggregation) && is_array($dataProcessor->aggregation)) { + $dataProcessor->aggregation = json_encode($dataProcessor->aggregation); + } if (isset($dataProcessor->storage_configuration) && is_array($dataProcessor->storage_configuration)) { $dataProcessor->storage_configuration = json_encode($dataProcessor->storage_configuration); } @@ -230,6 +238,17 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc $dataProcessor->addDataSource($source, $join); } + $aggregationFields = CRM_Dataprocessor_BAO_DataProcessor::getAvailableAggregationFields($this->dataProcessorId); + if (is_string($this->aggregation)) { + $this->aggregation = json_decode($this->aggregation, true); + } + foreach($this->aggregation as $alias) { + $dataSource = $dataProcessor->getDataSourceByName($aggregationFields[$alias]->dataSource->getSourceName()); + if ($dataSource) { + $dataSource->ensureAggregationFieldInSource($aggregationFields[$alias]->fieldSpecification); + } + } + $fields = CRM_Dataprocessor_BAO_Field::getValues(array('data_processor_id' => $this->id)); $outputHandlers = $dataProcessor->getAvailableOutputHandlers(); foreach($fields as $field) { @@ -266,6 +285,21 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc return $dataProcessor->getAvailableOutputHandlers(); } + public static function getAvailableAggregationFields($data_processor_id) { + $availableAggregationFields = array(); + $factory = dataprocessor_get_factory(); + $sources = CRM_Dataprocessor_BAO_Source::getValues(array('data_processor_id' => $data_processor_id)); + foreach($sources as $sourceDao) { + $source = $factory->getDataSourceByName($sourceDao['type']); + $source->setSourceName($sourceDao['name']); + $source->setSourceTitle($sourceDao['title']); + $source->initialize($sourceDao['configuration']); + $availableAggregationFields = array_merge($availableAggregationFields, $source->getAvailableAggregationFields()); + } + + return $availableAggregationFields; + } + /** * Returns the id of the data processor. * diff --git a/CRM/Dataprocessor/DAO/DataProcessor.php b/CRM/Dataprocessor/DAO/DataProcessor.php index 105e15a288f40dea82a6e68aeb94c812e40151bf..b21b9f076da5e00985c99e8f1c18703a11d25d18 100644 --- a/CRM/Dataprocessor/DAO/DataProcessor.php +++ b/CRM/Dataprocessor/DAO/DataProcessor.php @@ -77,6 +77,11 @@ class CRM_Dataprocessor_DAO_DataProcessor extends CRM_Core_DAO { 'title' => E::ts('Configuration'), 'type' => CRM_Utils_Type::T_TEXT, ), + 'aggregation' => array( + 'name' => 'aggregation', + 'title' => E::ts('Aggregation'), + 'type' => CRM_Utils_Type::T_TEXT, + ), 'storage_type' => array( 'name' => 'storage_type', 'title' => E::ts('Storage Type'), diff --git a/CRM/Dataprocessor/Form/AggregateField.php b/CRM/Dataprocessor/Form/AggregateField.php new file mode 100644 index 0000000000000000000000000000000000000000..2658c9c40029fec36d366c788c586319851e6630 --- /dev/null +++ b/CRM/Dataprocessor/Form/AggregateField.php @@ -0,0 +1,96 @@ +<?php + +use CRM_Dataprocessor_ExtensionUtil as E; + +/** + * Form controller class + * + * @see https://wiki.civicrm.org/confluence/display/CRMDOC/QuickForm+Reference + */ +class CRM_Dataprocessor_Form_AggregateField extends CRM_Core_Form { + + private $dataProcessorId; + + private $id; + + /** + * Function to perform processing before displaying form (overrides parent function) + * + * @access public + */ + function preProcess() { + $session = CRM_Core_Session::singleton(); + $this->dataProcessorId = CRM_Utils_Request::retrieve('id', 'Integer'); + $this->assign('data_processor_id', $this->dataProcessorId); + + $title = E::ts('Data Processor Field'); + CRM_Utils_System::setTitle($title); + + $url = CRM_Utils_System::url('civicrm/dataprocessor/form/edit', array('id' => $this->dataProcessorId, 'action' => 'update', 'reset' => 1)); + $session->pushUserContext($url); + } + + public function buildQuickForm() { + $this->add('hidden', 'id'); + $this->add('hidden', 'alias'); + if ($this->_action != CRM_Core_Action::DELETE) { + $fields = CRM_Dataprocessor_BAO_DataProcessor::getAvailableAggregationFields($this->dataProcessorId); + $fieldSelect = array(E::ts('- Select -')); + foreach($fields as $field) { + $fieldSelect[$field->fieldSpecification->alias] = $field->dataSource->getSourceTitle()." :: ".$field->fieldSpecification->title; + } + + $this->add('select', 'field', E::ts('Select Field'), $fieldSelect, true, array('class' => 'crm-select2 crm-huge40')); + } + if ($this->_action == CRM_Core_Action::ADD) { + $this->addButtons(array( + array('type' => 'next', 'name' => E::ts('Add'), 'isDefault' => TRUE,), + array('type' => 'cancel', 'name' => E::ts('Cancel')))); + } elseif ($this->_action == CRM_Core_Action::DELETE) { + $this->addButtons(array( + array('type' => 'next', 'name' => E::ts('Delete'), 'isDefault' => TRUE,), + array('type' => 'cancel', 'name' => E::ts('Cancel')))); + } + parent::buildQuickForm(); + } + + function setDefaultValues() { + $defaults = []; + $defaults['id'] = $this->dataProcessorId; + $defaults['alias'] =CRM_Utils_Request::retrieve('alias', 'String'); + return $defaults; + } + + public function postProcess() { + $session = CRM_Core_Session::singleton(); + $redirectUrl = $session->readUserContext(); + if ($this->_action == CRM_Core_Action::DELETE) { + $values = $this->exportValues(); + $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId)); + $aggregation = $dataProcessor[$this->dataProcessorId]['aggregation']; + $dataProcessor[$this->dataProcessorId]['aggregation'] = array(); + foreach($aggregation as $alias) { + if ($alias != $values['alias']) { + $dataProcessor[$this->dataProcessorId]['aggregation'][] = $alias; + } + } + $result = CRM_Dataprocessor_BAO_DataProcessor::add($dataProcessor[$this->dataProcessorId]); + + $session->setStatus(E::ts('Field removed'), E::ts('Removed'), 'success'); + CRM_Utils_System::redirect($redirectUrl); + } + + $values = $this->exportValues(); + $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId)); + $aggregation = $dataProcessor[$this->dataProcessorId]['aggregation']; + if (!in_array($values['field'], $aggregation)) { + $aggregation[] = $values['field']; + } + $dataProcessor[$this->dataProcessorId]['aggregation'] = $aggregation; + $result = CRM_Dataprocessor_BAO_DataProcessor::add($dataProcessor[$this->dataProcessorId]); + + CRM_Utils_System::redirect($redirectUrl); + parent::postProcess(); + } + +} \ No newline at end of file diff --git a/CRM/Dataprocessor/Form/DataProcessor.php b/CRM/Dataprocessor/Form/DataProcessor.php index 48ab7e0a96ebf6dd5a5ac8d34badcc5bf5d9e784..66ee1bbe449eb86b168c650368d06a6ffb223c1f 100644 --- a/CRM/Dataprocessor/Form/DataProcessor.php +++ b/CRM/Dataprocessor/Form/DataProcessor.php @@ -45,11 +45,14 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { if ($this->dataProcessorId) { $this->addSources(); $this->addFields(); + $this->addAggregateFields(); $this->assign('outputs', CRM_Dataprocessor_BAO_Output::getValues(array('data_processor_id' => $this->dataProcessorId))); $dataSourceAddUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/source', 'reset=1&action=add&data_processor_id='.$this->dataProcessorId, TRUE); + $addAggregateFieldUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/aggregate_field', 'reset=1&action=add&id='.$this->dataProcessorId, TRUE); $addFieldUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/field', 'reset=1&action=add&data_processor_id='.$this->dataProcessorId, TRUE); $outputAddUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/output', 'reset=1&action=add&data_processor_id='.$this->dataProcessorId, TRUE); $this->assign('addDataSourceUrl', $dataSourceAddUrl); + $this->assign('addAggregateFieldUrl', $addAggregateFieldUrl); $this->assign('addFieldUrl', $addFieldUrl); $this->assign('addOutputUrl', $outputAddUrl); } @@ -74,15 +77,28 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { } protected function addFields() { - $factory = dataprocessor_get_factory(); $fields = CRM_Dataprocessor_BAO_Field::getValues(array('data_processor_id' => $this->dataProcessorId)); foreach($fields as $idx => $field) { $fields[$idx]['configuration_link'] = ''; - $fields[$idx]['aggregate'] = $field['aggregate'] ? E::ts('Aggregate field') : ''; } $this->assign('fields', $fields); } + protected function addAggregateFields() { + $fields = array(); + $aggregationFields = CRM_Dataprocessor_BAO_DataProcessor::getAvailableAggregationFields($this->dataProcessorId); + $aggregationFieldsFormatted = array(); + foreach($aggregationFields as $field) { + $aggregationFieldsFormatted[$field->fieldSpecification->alias] = $field->dataSource->getSourceTitle()." :: ".$field->fieldSpecification->title; + } + $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId)); + $aggregation = $dataProcessor[$this->dataProcessorId]['aggregation']; + foreach($aggregation as $alias) { + $fields[$alias] = $aggregationFieldsFormatted[$alias]; + } + $this->assign('aggregateFields', $fields); + } + public function buildQuickForm() { $this->add('hidden', 'id'); if ($this->_action != CRM_Core_Action::DELETE) { diff --git a/CRM/Dataprocessor/Form/Field.php b/CRM/Dataprocessor/Form/Field.php index c08aaf620b0d130c541f5e985f4ec924a19dd1f1..d47d79d4509533b712541228dd2a1002229e606f 100644 --- a/CRM/Dataprocessor/Form/Field.php +++ b/CRM/Dataprocessor/Form/Field.php @@ -52,8 +52,6 @@ class CRM_Dataprocessor_Form_Field extends CRM_Core_Form { } $this->add('select', 'type', E::ts('Select Field'), $outputHandlersSelect, true, array('class' => 'crm-select2 crm-huge40')); - - $this->add('checkbox', 'aggregate', E::ts('Aggregate field')); } if ($this->_action == CRM_Core_Action::ADD) { $this->addButtons(array( @@ -86,9 +84,6 @@ class CRM_Dataprocessor_Form_Field extends CRM_Core_Form { if (isset($field[$this->id]['name'])) { $defaults['name'] = $field[$this->id]['name']; } - if (isset($field[$this->id]['aggregate'])) { - $defaults['aggregate'] = $field[$this->id]['aggregate']; - } return $defaults; } @@ -109,7 +104,6 @@ class CRM_Dataprocessor_Form_Field extends CRM_Core_Form { } $params['title'] = $values['title']; $params['type'] = $values['type']; - $params['aggregate'] = isset($values['aggregate']) && !empty($values['aggregate']) ? 1 : 0; if ($this->dataProcessorId) { $params['data_processor_id'] = $this->dataProcessorId; } diff --git a/Civi/DataProcessor/DataSpecification/AggregationField.php b/Civi/DataProcessor/DataSpecification/AggregationField.php new file mode 100644 index 0000000000000000000000000000000000000000..57189dd2a7865522c883c14b4c68ab9a2d5b8aaf --- /dev/null +++ b/Civi/DataProcessor/DataSpecification/AggregationField.php @@ -0,0 +1,28 @@ +<?php +/** + * @author Jaap Jansma <jaap.jansma@civicoop.org> + * @license AGPL-3.0 + */ + +namespace Civi\DataProcessor\DataSpecification; + +use Civi\DataProcessor\Source\SourceInterface; + +class AggregationField { + + /** + * @var \Civi\DataProcessor\DataSpecification\FieldSpecification + */ + public $fieldSpecification; + + /** + * @var \Civi\DataProcessor\Source\SourceInterface + */ + public $dataSource; + + public function __construct(FieldSpecification $fieldSpecification, SourceInterface $dataSource) { + $this->dataSource = $dataSource; + $this->fieldSpecification = $fieldSpecification; + } + +} \ No newline at end of file diff --git a/Civi/DataProcessor/ProcessorType/AbstractProcessorType.php b/Civi/DataProcessor/ProcessorType/AbstractProcessorType.php index 9ff836612ec55bc480b7bfb528dccd6c06c4f2ba..f8a0c75dee622e5dfbead11efc488ed2ea69def0 100644 --- a/Civi/DataProcessor/ProcessorType/AbstractProcessorType.php +++ b/Civi/DataProcessor/ProcessorType/AbstractProcessorType.php @@ -58,6 +58,21 @@ abstract class AbstractProcessorType { } } + /** + * Returns the data source + * + * @param $source_name + * @return null|\Civi\DataProcessor\Source\SourceInterface + */ + public function getDataSourceByName($source_name) { + foreach($this->dataSources as $dataSource) { + if ($dataSource['datasource']->getSourceName() == $source_name) { + return $dataSource['datasource']; + } + } + return null; + } + /** * @return \Civi\DataProcessor\FieldOutputHandler\AbstractFieldOutputHandler[] */ diff --git a/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php b/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php index 00a2ea95820c78311fda1d02b2ffb7c9671447b8..87632b783bf9d84b810e284978bc7e3cdcbd2af2 100644 --- a/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php +++ b/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php @@ -12,6 +12,7 @@ use Civi\DataProcessor\DataFlow\SqlTableDataFlow; use Civi\DataProcessor\DataFlow\CombinedDataFlow\CombinedSqlDataFlow; use Civi\DataProcessor\DataFlow\MultipleDataFlows\DataFlowDescription; use Civi\DataProcessor\DataFlow\MultipleDataFlows\SimpleJoin; +use Civi\DataProcessor\DataSpecification\AggregationField; use Civi\DataProcessor\DataSpecification\CustomFieldSpecification; use Civi\DataProcessor\DataSpecification\DataSpecification; use Civi\DataProcessor\DataSpecification\FieldSpecification; @@ -268,6 +269,19 @@ abstract class AbstractCivicrmEntitySource implements SourceInterface { return $this->availableFilterFields; } + /** + * @return \Civi\DataProcessor\DataSpecification\AggregationField[] + * @throws \Exception + */ + public function getAvailableAggregationFields() { + $fields = $this->getAvailableFields(); + $aggregationFields = array(); + foreach($fields->getFields() as $field) { + $aggregationFields[$field->alias] = new AggregationField($field, $this); + } + return $aggregationFields; + } + /** * Ensures a field is in the data source * @@ -276,7 +290,7 @@ abstract class AbstractCivicrmEntitySource implements SourceInterface { * @throws \Exception */ public function ensureFieldInSource(FieldSpecification $fieldSpecification) { - if ($this->availableFields->doesFieldExist($fieldSpecification->name)) { + if ($this->getAvailableFields()->doesFieldExist($fieldSpecification->name)) { if ($fieldSpecification instanceof CustomFieldSpecification) { $customGroupDataFlowDescription = $this->ensureCustomGroup($fieldSpecification->customGroupTableName, $fieldSpecification->customGroupName); $customGroupDataFlowDescription->getDataFlow()->getDataSpecification()->addFieldSpecification($fieldSpecification->alias, $fieldSpecification); @@ -286,6 +300,24 @@ abstract class AbstractCivicrmEntitySource implements SourceInterface { } } + /** + * Ensures an aggregation field in the data source + * + * @param \Civi\DataProcessor\DataSpecification\FieldSpecification $fieldSpecification + * @return \Civi\DataProcessor\Source\SourceInterface + * @throws \Exception + */ + public function ensureAggregationFieldInSource(FieldSpecification $fieldSpecification) { + if ($this->getAvailableFields()->doesFieldExist($fieldSpecification->name)) { + if ($fieldSpecification instanceof CustomFieldSpecification) { + $customGroupDataFlowDescription = $this->ensureCustomGroup($fieldSpecification->customGroupTableName, $fieldSpecification->customGroupName); + $customGroupDataFlowDescription->getDataFlow()->addAggregateField($fieldSpecification); + } else { + $this->primaryDataFlow->addAggregateField($fieldSpecification); + } + } + } + /** * @return String */ diff --git a/Civi/DataProcessor/Source/SourceInterface.php b/Civi/DataProcessor/Source/SourceInterface.php index 76eaf3cf13e927441370a355ca687814842b9dc7..cb3d001bc58028570267eaeaf9fc8d655b269efc 100644 --- a/Civi/DataProcessor/Source/SourceInterface.php +++ b/Civi/DataProcessor/Source/SourceInterface.php @@ -38,6 +38,11 @@ interface SourceInterface { */ public function getAvailableFilterFields(); + /** + * @return \Civi\DataProcessor\DataSpecification\AggregationField[] + */ + public function getAvailableAggregationFields(); + /** * Returns URL to configuration screen * @@ -54,6 +59,15 @@ interface SourceInterface { */ public function ensureFieldInSource(FieldSpecification $fieldSpecification); + /** + * Ensures an aggregation field in the data source + * + * @param \Civi\DataProcessor\DataSpecification\FieldSpecification $fieldSpecification + * + * @return \Civi\DataProcessor\Source\SourceInterface + */ + public function ensureAggregationFieldInSource(FieldSpecification $fieldSpecification); + /** * @return String */ diff --git a/api/v3/DataProcessor/Create.php b/api/v3/DataProcessor/Create.php index 2cf01de4a253ada256576e4fbb0ac986676f6529..268aeb3255514247196a2e4f8c1aa6172e6c2153 100644 --- a/api/v3/DataProcessor/Create.php +++ b/api/v3/DataProcessor/Create.php @@ -47,6 +47,11 @@ function _civicrm_api3_data_processor_create_spec(&$spec) { 'type' => CRM_Utils_Type::T_TEXT, 'api.required' => false, ); + $spec['aggregation'] = array( + 'title' => E::ts('Aggregation'), + 'type' => CRM_Utils_Type::T_TEXT, + 'api.required' => false, + ); $spec['storage_type'] = array( 'title' => E::ts('Storage Type'), 'type' => CRM_Utils_Type::T_STRING, diff --git a/sql/create_civicrm_data_processor.sql b/sql/create_civicrm_data_processor.sql index c92272cd79b5dec844279e50549a140e36a080db..914b3764a8f2680dcd2c908bfe515bee980e860e 100644 --- a/sql/create_civicrm_data_processor.sql +++ b/sql/create_civicrm_data_processor.sql @@ -2,6 +2,7 @@ CREATE TABLE IF NOT EXISTS `civicrm_data_processor` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `type` VARCHAR(128) NOT NULL, `configuration` TEXT NULL, + `aggregation` TEXT NULL, `name` VARCHAR(128) NOT NULL, `title` VARCHAR(128) NULL, `is_active` TINYINT NULL DEFAULT 1, diff --git a/templates/CRM/Dataprocessor/Form/AggregateField.tpl b/templates/CRM/Dataprocessor/Form/AggregateField.tpl new file mode 100644 index 0000000000000000000000000000000000000000..b33955e14680de2e74698062a4be2527d418fa95 --- /dev/null +++ b/templates/CRM/Dataprocessor/Form/AggregateField.tpl @@ -0,0 +1,28 @@ +{crmScope extensionKey='dataprocessor'} +<div class="crm-submit-buttons"> + {include file="CRM/common/formButtons.tpl" location="top"} +</div> + +{if $action eq 8} + {* Are you sure to delete form *} + <h3>{ts}Delete Field{/ts}</h3> + <div class="crm-block crm-form-block crm-data-processor_label-block"> + <div class="crm-section">{ts}Are you sure to remove this field?{/ts}</div> + </div> +{else} + + {* block for rule data *} + <h3>{ts}Aggregation Field{/ts}</h3> + <div class="crm-block crm-form-block crm-data-processor_source-block"> + <div class="crm-section"> + <div class="label">{$form.field.label}</div> + <div class="content">{$form.field.html}</div> + <div class="clear"></div> + </div> + </div> +{/if} + +<div class="crm-submit-buttons"> + {include file="CRM/common/formButtons.tpl" location="bottom"} +</div> +{/crmScope} \ No newline at end of file diff --git a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl index 4969869060f9fcf2beffc5b5ba96d13123389fb4..6bb449cf1268cbc7401f554cfd60275c26a66bee 100644 --- a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl +++ b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl @@ -49,6 +49,7 @@ {if $data_processor_id} {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/Sources.tpl"} + {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/AggregateFields.tpl"} {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl"} {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/Outputs.tpl"} {/if} diff --git a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/AggregateFields.tpl b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/AggregateFields.tpl new file mode 100644 index 0000000000000000000000000000000000000000..49cd0981a139e4355f97a8c18bf7dbb820bf33bf --- /dev/null +++ b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/AggregateFields.tpl @@ -0,0 +1,23 @@ +{crmScope extensionKey='dataprocessor'} +<div class="crm-block crm-form-block crm-data-processor_source-block"> + <table> + <tr> + <th>{ts}Field{/ts}</th> + <th></th> + </tr> + {foreach from=$aggregateFields item=field key=alias} + <tr> + <td>{$field}</td> + <td> + <a href="{crmURL p="civicrm/dataprocessor/form/aggregate_field" q="reset=1&action=delete&id=`$data_processor_id`&alias=`$alias`"}">{ts}Remove{/ts}</a> + </td> + </tr> + {/foreach} + </table> + + <div class="crm-submit-buttons"> + <a class="add button" title="{ts}Add Aggregate Field{/ts}" href="{$addAggregateFieldUrl}"> + <span><div class="icon add-icon ui-icon-circle-plus"></div>{ts}Add Aggregate Field{/ts}</span></a> + </div> +</div> +{/crmScope} \ No newline at end of file diff --git a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl index a7765fe77b45e190d97bea2194615c0269cb721f..91737000459d912888a1c5311a06c06836e7d983 100644 --- a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl +++ b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl @@ -4,7 +4,6 @@ <tr> <th>{ts}Title{/ts}</th> <th>{ts}Name{/ts}</th> - <th>{ts}Aggregate{/ts}</th> <th></th> <th></th> <th></th> @@ -14,7 +13,6 @@ <tr> <td>{$field.title}</td> <td>{$field.name}</td> - <td>{$field.aggregate}</td> <td> {if $field.configuration_link} <a href="{$source.configuration_link}">{ts}Configure Field{/ts}</a> diff --git a/templates/CRM/Dataprocessor/Form/Field.tpl b/templates/CRM/Dataprocessor/Form/Field.tpl index 56aae0ec65c8dbeab723d2da52ff47ff0f154d02..711b32c77977fbeda6f5e991cc37bc804b876c9f 100644 --- a/templates/CRM/Dataprocessor/Form/Field.tpl +++ b/templates/CRM/Dataprocessor/Form/Field.tpl @@ -29,11 +29,6 @@ <div class="content">{$form.name.html}</div> <div class="clear"></div> </div> - <div class="crm-section"> - <div class="label">{$form.aggregate.label}</div> - <div class="content">{$form.aggregate.html}</div> - <div class="clear"></div> - </div> </div> {/if} diff --git a/xml/Menu/dataprocessor.xml b/xml/Menu/dataprocessor.xml index ac96e2b7750bc569b85253f5cad85b99c0535cb9..6b2419d315cc3b608327ed5d66b13c6dbd272ec1 100644 --- a/xml/Menu/dataprocessor.xml +++ b/xml/Menu/dataprocessor.xml @@ -21,6 +21,13 @@ <access_arguments>access CiviCRM</access_arguments> <access_arguments>administer CiviCRM</access_arguments> </item> + <item> + <path>civicrm/dataprocessor/form/aggregate_field</path> + <page_callback>CRM_Dataprocessor_Form_AggregateField</page_callback> + <title>DataProcessor</title> + <access_arguments>access CiviCRM</access_arguments> + <access_arguments>administer CiviCRM</access_arguments> + </item> <item> <path>civicrm/dataprocessor/form/output</path> <page_callback>CRM_Dataprocessor_Form_Output</page_callback>