Skip to content
Snippets Groups Projects
Commit 3f7c252b authored by jaapjansma's avatar jaapjansma
Browse files

Added Event Filter

parent 2d6a572b
No related branches found
Tags 1.23.4
No related merge requests found
# Version 1.7.0 (not yet released)
* Changed Age field so aggeragation is working correctly.
* Changed Field Specification to allow more advanced mysql functions
* Changed Field Specification to allow more advanced mysql functions.
* Added Event Filter
# Version 1.6.0
......
......@@ -140,6 +140,7 @@ class Factory {
$this->addFilter('date_filter', new Definition('Civi\DataProcessor\FilterHandler\DateFilter'), E::ts('Date filter'));
$this->addFilter('multiple_field_filter', new Definition('Civi\DataProcessor\FilterHandler\MultipleFieldFilter'), E::ts('Text in multiple fields Filter'));
$this->addFilter('activity_filter', new Definition('Civi\DataProcessor\FilterHandler\ActivityFilter'), E::ts('Activity filter'));
$this->addFilter('event_filter', new Definition('Civi\DataProcessor\FilterHandler\EventFilter'), E::ts('Event filter'));
$this->addFilter('contact_filter', new Definition('Civi\DataProcessor\FilterHandler\ContactFilter'), E::ts('Contact filter'));
$this->addFilter('contact_in_group_filter', new Definition('Civi\DataProcessor\FilterHandler\ContactInGroupFilter'), E::ts('Contact in Group filter'));
$this->addFilter('contact_with_tag_filter', new Definition('Civi\DataProcessor\FilterHandler\ContactWithTagFilter'), E::ts('Contact has Tag filter'));
......
<?php
/**
* @author Jaap Jansma <jaap.jansma@civicoop.org>
* @license AGPL-3.0
*/
namespace Civi\DataProcessor\FilterHandler;
use Civi\DataProcessor\Exception\InvalidConfigurationException;
use CRM_Dataprocessor_ExtensionUtil as E;
class EventFilter extends AbstractFieldFilterHandler {
/**
* @var array
* Filter configuration
*/
protected $configuration;
public function __construct() {
parent::__construct();
}
/**
* Initialize the filter
*
* @throws \Civi\DataProcessor\Exception\DataSourceNotFoundException
* @throws \Civi\DataProcessor\Exception\InvalidConfigurationException
* @throws \Civi\DataProcessor\Exception\FieldNotFoundException
*/
protected function doInitialization() {
if (!isset($this->configuration['datasource']) || !isset($this->configuration['field'])) {
throw new InvalidConfigurationException(E::ts("Filter %1 requires a field to filter on. None given.", array(1=>$this->title)));
}
$this->initializeField($this->configuration['datasource'], $this->configuration['field']);
}
/**
* Returns true when this filter has additional configuration
*
* @return bool
*/
public function hasConfiguration() {
return true;
}
/**
* When this filter type has additional configuration you can add
* the fields on the form with this function.
*
* @param \CRM_Core_Form $form
* @param array $filter
*/
public function buildConfigurationForm(\CRM_Core_Form $form, $filter=array()) {
$fieldSelect = \CRM_Dataprocessor_Utils_DataSourceFields::getAvailableFilterFieldsInDataSources($filter['data_processor_id']);
$form->add('select', 'field', E::ts('Event ID Field'), $fieldSelect, true, array(
'style' => 'min-width:250px',
'class' => 'crm-select2 huge data-processor-field-for-name',
'placeholder' => E::ts('- select -'),
));
if (isset($filter['configuration'])) {
$configuration = $filter['configuration'];
$defaults = array();
if (isset($configuration['field']) && isset($configuration['datasource'])) {
$defaults['field'] = $configuration['datasource'] . '::' . $configuration['field'];
}
$form->setDefaults($defaults);
}
}
/**
* When this filter type has configuration specify the template file name
* for the configuration form.
*
* @return false|string
*/
public function getConfigurationTemplateFileName() {
return "CRM/Dataprocessor/Form/Filter/Configuration/EventFilter.tpl";
}
/**
* Process the submitted values and create a configuration array
*
* @param $submittedValues
* @return array
*/
public function processConfiguration($submittedValues) {
list($datasource, $field) = explode('::', $submittedValues['field'], 2);
$configuration['field'] = $field;
$configuration['datasource'] = $datasource;
return $configuration;
}
/**
* Add the elements to the filter form.
*
* @param \CRM_Core_Form $form
* @param array $defaultFilterValue
* @param string $size
* Possible values: full or compact
* @return array
* Return variables belonging to this filter.
*/
public function addToFilterForm(\CRM_Core_Form $form, $defaultFilterValue, $size='full') {
$fieldSpec = $this->getFieldSpecification();
$operations = $this->getOperatorOptions($fieldSpec);
$defaults = array();
$title = $fieldSpec->title;
$alias = $fieldSpec->alias;
if ($this->isRequired()) {
$title .= ' <span class="crm-marker">*</span>';
}
$sizeClass = 'huge';
$minWidth = 'min-width: 250px;';
if ($size =='compact') {
$sizeClass = 'medium';
$minWidth = '';
}
$form->add('select', "{$alias}_op", E::ts('Operator:'), $operations, true, [
'style' => $minWidth,
'class' => 'crm-select2 '.$sizeClass,
'multiple' => FALSE,
'placeholder' => E::ts('- select -'),
]);
$api_params = array();
$props = array(
'placeholder' => E::ts('Select an Event'),
'entity' => 'Event',
'api' => array('params' => $api_params),
'select' => ['minimumInputLength' => 0],
'create' => false,
'multiple' => true,
'style' => $minWidth,
'class' => $sizeClass,
);
$form->addEntityRef( "{$alias}_value", '', $props);
if (isset($defaultFilterValue['op'])) {
$defaults[$alias . '_op'] = $defaultFilterValue['op'];
} else {
$defaults[$alias . '_op'] = key($operations);
}
if (isset($defaultFilterValue['value'])) {
$defaults[$alias.'_value'] = $defaultFilterValue['value'];
}
if (count($defaults)) {
$form->setDefaults($defaults);
}
$filter['type'] = $fieldSpec->type;
$filter['title'] = $title;
$filter['alias'] = $fieldSpec->alias;
$filter['size'] = $size;
return $filter;
}
protected function getOperatorOptions(\Civi\DataProcessor\DataSpecification\FieldSpecification $fieldSpec) {
return array(
'IN' => E::ts('Is one of'),
'NOT IN' => E::ts('Is not one of'),
'null' => E::ts('Is empty'),
);
}
}
{crmScope extensionKey='dataprocessor'}
<div class="crm-section">
<div class="label">{$form.field.label}</div>
<div class="content">{$form.field.html}</div>
<div class="clear"></div>
</div>
{/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