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

Merge branch 'wordregion' into 'master'

Added Filter for WorldRegion and FieldOutputHandler

See merge request !54
parents 4ef1ef8a 139fcbd2
No related branches found
No related tags found
1 merge request!54Added Filter for WorldRegion and FieldOutputHandler
......@@ -147,6 +147,7 @@ class Factory {
$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'));
$this->addFilter('contact_has_membership', new Definition('Civi\DataProcessor\FilterHandler\ContactHasMembershipFilter'), E::ts('Contact has Membership filter'));
$this->addFilter('worldregion_filter', new Definition('Civi\DataProcessor\FilterHandler\WorldRegionFilter'), E::ts('World Region Filter'));
$this->addFilter('contact_type_filter', new Definition('Civi\DataProcessor\FilterHandler\ContactTypeFilter'), E::ts('Contact Type filter'));
$this->addFilter('permission_to_view_contact', new Definition('Civi\DataProcessor\FilterHandler\PermissionToViewContactFilter'), E::ts('Permission to view contact'));
$this->addFilter('case_role_filter', new Definition('Civi\DataProcessor\FilterHandler\CaseRoleFilter'), E::ts('Contact has role on case filter'));
......@@ -156,6 +157,7 @@ class Factory {
$this->addOutputHandler('raw', new Definition('Civi\DataProcessor\FieldOutputHandler\RawFieldOutputHandler'), E::ts('Raw field value'));
$this->addOutputHandler('markup', new Definition('Civi\DataProcessor\FieldOutputHandler\MarkupFieldOutputHandler'), E::ts('Markup/Html field value'));
$this->addOutputHandler('formatted_address', new Definition('Civi\DataProcessor\FieldOutputHandler\FormattedAddressFieldOutputHandler'), E::ts('Formatted Address'));
$this->addOutputHandler('worldregion', new Definition('Civi\DataProcessor\FieldOutputHandler\WorldRegionFieldOutputHandler'), E::ts('Worldregion'));
$this->addOutputHandler('number', new Definition('Civi\DataProcessor\FieldOutputHandler\NumberFieldOutputHandler'), E::ts('Formatted Number field value'));
$this->addOutputHandler('date', new Definition('Civi\DataProcessor\FieldOutputHandler\DateFieldOutputHandler'), E::ts('Date field value'));
$this->addOutputHandler('age', new Definition('Civi\DataProcessor\FieldOutputHandler\AgeFieldOutputHandler'), E::ts('Age field value'));
......
<?php
/**
* @author Klaas Eikelboom <klaas.eikelboom@civicoop.org
* @license AGPL-3.0
*/
namespace Civi\DataProcessor\FieldOutputHandler;
use CRM_Dataprocessor_ExtensionUtil as E;
class WorldRegionFieldOutputHandler extends AbstractSimpleFieldOutputHandler {
/**
* Returns the label of the field for selecting a field.
*
* This could be override in a child class.
*
* @return string
*/
protected function getFieldTitle() {
return E::ts('Country Field');
}
/**
* Returns the data type of this field
*
* @return String
*/
protected function getType() {
return 'String';
}
/**
* Returns the formatted value
*
* @param $rawRecord
* @param $formattedRecord
*
* @return \Civi\DataProcessor\FieldOutputHandler\FieldOutput
*/
public function formatField($rawRecord, $formattedRecord) {
$sql = 'SELECT wr.name FROM civicrm_worldregion wr
JOIN civicrm_country c on (c.region_id = wr.id)
WHERE c.id = %1';
$countryId = $rawRecord[$this->inputFieldSpec->alias];
$regionName = \CRM_Core_DAO::singleValueQuery($sql, [ 1 => [$countryId,'Integer']]);
$formattedValue = new HTMLFieldOutput();
$formattedValue->setHtmlOutput($regionName);
return $formattedValue;
}
}
<?php
/**
* @author Klaas Eikelboom <klaas.eikelboom@civicoop.org>
* @license AGPL-3.0
*/
namespace Civi\DataProcessor\FilterHandler;
use Civi\DataProcessor\DataFlow\SqlDataFlow;
use Civi\DataProcessor\Exception\InvalidConfigurationException;
use CRM_Dataprocessor_ExtensionUtil as E;
class WorldRegionFilter extends AbstractFieldFilterHandler {
/**
* 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']);
}
/**
* @param array $filter
* The filter settings
* @return mixed
*/
public function setFilter($filter) {
$this->resetFilter();
$dataFlow = $this->dataSource->ensureField($this->inputFieldSpecification);
$region_ids = $filter['value'];
if (!is_array($region_ids)) {
$region_ids = explode(",", $region_ids);
if (!is_array($region_ids)) {
$region_ids = [$region_ids];
}
}
$countryTableAlias = 'civicrm_country_'.$this->inputFieldSpecification->alias;
$countryFilters = array(
new SqlDataFlow\SimpleWhereClause($countryTableAlias, 'region_id', 'IN', $region_ids),
);
if ($dataFlow && $dataFlow instanceof SqlDataFlow) {
$this->whereClause = new SqlDataFlow\InTableWhereClause(
'id',
'civicrm_country',
$countryTableAlias,
$countryFilters,
$dataFlow->getName(),
$this->inputFieldSpecification->name,
$filter['op']
);
$dataFlow->addWhereClause($this->whereClause);
}
}
/**
* 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', 'country_id_field', E::ts('Country 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['country_id_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/WorldRegionFilter.tpl";
}
/**
* Process the submitted values and create a configuration array
*
* @param $submittedValues
* @return array
*/
public function processConfiguration($submittedValues) {
list($datasource, $field) = explode('::', $submittedValues['country_id_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();
$alias = $fieldSpec->alias;
$operations = $this->getOperatorOptions($fieldSpec);
$title = $fieldSpec->title;
if ($this->isRequired()) {
$title .= ' <span class="crm-marker">*</span>';
}
$sizeClass = 'huge';
$minWidth = 'min-width: 250px;';
if ($size =='compact') {
$sizeClass = 'medium';
$minWidth = '';
}
$form->add('select', "{$fieldSpec->alias}_op", E::ts('Operator:'), $operations, true, [
'style' => $minWidth,
'class' => 'crm-select2 '.$sizeClass,
'multiple' => false,
'placeholder' => E::ts('- select -'),
]);
$form->add('select', "{$fieldSpec->alias}_value", E::ts('World Regions:'), $this->worldRegions(), true, [
'placeholder' => E::ts('Select worldregion'),
'class' => 'crm-select2 '.$sizeClass,
'multiple' => true,
'select' => ['minimumInputLength' => 0],
]);
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['alias'] = $fieldSpec->alias;
$filter['title'] = $title;
$filter['size'] = $size;
return $filter;
}
protected function worldRegions(){
$regions = [];
$dao = \CRM_Core_DAO::executeQuery('select id, name from civicrm_worldregion order by name');
while($dao->fetch()){
$regions[$dao->id] = $dao->name;
}
return $regions;
}
protected function getOperatorOptions(\Civi\DataProcessor\DataSpecification\FieldSpecification $fieldSpec) {
return array(
'IN' => E::ts('Address in Worldregions'),
'NOT IN' => E::ts('Address outside Worldregions'),
);
}
}
{crmScope extensionKey='dataprocessor'}
<div class="crm-section">
<div class="label">{$form.country_id_field.label}</div>
<div class="content">{$form.country_id_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