diff --git a/CRM/Dataprocessor/BAO/DataProcessor.php b/CRM/Dataprocessor/BAO/DataProcessor.php index c25dfef8001abb413464f340955ce3f906691412..923f5e18b8843c8d980258b8acad35efe944e1b9 100644 --- a/CRM/Dataprocessor/BAO/DataProcessor.php +++ b/CRM/Dataprocessor/BAO/DataProcessor.php @@ -115,8 +115,8 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc CRM_Utils_Hook::pre('delete', 'DataProcessor', $id, CRM_Core_DAO::$_nullArray); CRM_Dataprocessor_BAO_Output::deleteWithDataProcessorId($id); - CRM_Dataprocessor_BAO_Filter::deleteWithDataProcessorId($id); - CRM_Dataprocessor_BAO_Field::deleteWithDataProcessorId($id); + CRM_Dataprocessor_BAO_DataProcessorFilter::deleteWithDataProcessorId($id); + CRM_Dataprocessor_BAO_DataProcessorField::deleteWithDataProcessorId($id); CRM_Dataprocessor_BAO_Source::deleteWithDataProcessorId($id); $dataProcessor = new CRM_Dataprocessor_DAO_DataProcessor(); @@ -274,8 +274,8 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc } } - $filters = CRM_Dataprocessor_BAO_Filter::getValues(array('data_processor_id' => $this->id)); - foreach($filters as $filter) { + $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $this->id, 'options' => array('limit' => 0))); + foreach($filters['values'] as $filter) { $filterHandler = $factory->getFilterByName($filter['type']); if ($filterHandler) { $filterHandler->setDataProcessor($dataProcessor); @@ -284,9 +284,9 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc } } - $fields = CRM_Dataprocessor_BAO_Field::getValues(array('data_processor_id' => $this->id)); + $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $this->id, 'options' => array('limit' => 0))); $outputHandlers = $dataProcessor->getAvailableOutputHandlers(); - foreach($fields as $field) { + foreach($fields['values'] as $field) { if (isset($outputHandlers[$field['type']])) { $outputHandler = $outputHandlers[$field['type']]; $outputHandler->initialize($field['name'], $field['title'], $field['configuration']); @@ -451,16 +451,16 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc unset($datasource['data_processor_id']); $dataProcessor['data_sources'][] = $datasource; } - $filters = CRM_Dataprocessor_BAO_Filter::getValues(array('data_processor_id' => $id)); + $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0))); $dataProcessor['filters'] = array(); - foreach($filters as $i => $filter) { + foreach($filters['values'] as $i => $filter) { unset($filter['id']); unset($filter['data_processor_id']); $dataProcessor['filters'][] = $filter; } - $fields = CRM_Dataprocessor_BAO_Field::getValues(array('data_processor_id' => $id)); + $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0))); $dataProcessor['fields'] = array(); - foreach($fields as $i => $field) { + foreach($fields['values'] as $i => $field) { unset($field['id']); unset($field['data_processor_id']); $dataProcessor['fields'][] = $field; diff --git a/CRM/Dataprocessor/BAO/DataProcessorField.php b/CRM/Dataprocessor/BAO/DataProcessorField.php index 872479069c4276c50143897d0c48a01c0bb2270a..f6a45fd2f5db66a1474b6d497a385b90e2802ab5 100644 --- a/CRM/Dataprocessor/BAO/DataProcessorField.php +++ b/CRM/Dataprocessor/BAO/DataProcessorField.php @@ -28,4 +28,25 @@ class CRM_Dataprocessor_BAO_DataProcessorField extends CRM_Dataprocessor_DAO_Dat return $name; } + /** + * Function to delete a Data Processor Filter with id + * + * @param int $id + * @throws Exception when $id is empty + * @access public + * @static + */ + public static function deleteWithDataProcessorId($id) { + if (empty($id)) { + throw new Exception('id can not be empty when attempting to delete a data processor filter'); + } + + $field = new CRM_Dataprocessor_DAO_DataProcessorField(); + $field->data_processor_id = $id; + $field->find(FALSE); + while ($field->fetch()) { + civicrm_api3('DataProcessorField', 'delete', array('id' => $field->id)); + } + } + } diff --git a/CRM/Dataprocessor/BAO/DataProcessorFilter.php b/CRM/Dataprocessor/BAO/DataProcessorFilter.php new file mode 100644 index 0000000000000000000000000000000000000000..12aefe4cd743f88cef5e0b03a64a0a4802dc9936 --- /dev/null +++ b/CRM/Dataprocessor/BAO/DataProcessorFilter.php @@ -0,0 +1,52 @@ +<?php +use CRM_Dataprocessor_ExtensionUtil as E; + +class CRM_Dataprocessor_BAO_DataProcessorFilter extends CRM_Dataprocessor_DAO_DataProcessorFilter { + + public static function checkName($title, $data_processor_id, $id=null,$name=null) { + if (!$name) { + $name = preg_replace('@[^a-z0-9_]+@','_',strtolower($title)); + } + + $name = preg_replace('@[^a-z0-9_]+@','_',strtolower($name)); + $name_part = $name; + + $sql = "SELECT COUNT(*) FROM `civicrm_data_processor_filter` WHERE `name` = %1 AND `data_processor_id` = %2"; + $sqlParams[1] = array($name, 'String'); + $sqlParams[2] = array($data_processor_id, 'String'); + if (isset($id)) { + $sql .= " AND `id` != %3"; + $sqlParams[3] = array($id, 'Integer'); + } + + $i = 1; + while(CRM_Core_DAO::singleValueQuery($sql, $sqlParams) > 0) { + $i++; + $name = $name_part .'_'.$i; + $sqlParams[1] = array($name, 'String'); + } + return $name; + } + + /** + * Function to delete a Data Processor Filter with id + * + * @param int $id + * @throws Exception when $id is empty + * @access public + * @static + */ + public static function deleteWithDataProcessorId($id) { + if (empty($id)) { + throw new Exception('id can not be empty when attempting to delete a data processor filter'); + } + + $field = new CRM_Dataprocessor_DAO_DataProcessorFilter(); + $field->data_processor_id = $id; + $field->find(FALSE); + while ($field->fetch()) { + civicrm_api3('DataProcessorFilter', 'delete', array('id' => $field->id)); + } + } + +} diff --git a/CRM/Dataprocessor/BAO/Filter.php b/CRM/Dataprocessor/BAO/Filter.php deleted file mode 100644 index 3f034800f2af7d570c6cddd7f7c5568376a86c9c..0000000000000000000000000000000000000000 --- a/CRM/Dataprocessor/BAO/Filter.php +++ /dev/null @@ -1,180 +0,0 @@ -<?php -/** - * @author Jaap Jansma <jaap.jansma@civicoop.org> - * @license AGPL-3.0 - */ - -class CRM_Dataprocessor_BAO_Filter extends CRM_Dataprocessor_DAO_Filter { - - /** - * Function to get values - * - * @return array $result found rows with data - * @access public - * @static - */ - public static function getValues($params) { - $factory = dataprocessor_get_factory(); - $types = $factory->getDataSources(); - - $result = array(); - $filter = new CRM_Dataprocessor_DAO_Filter(); - if (!empty($params)) { - $filters = self::fields(); - foreach ($params as $key => $value) { - if (isset($filters[$key])) { - $filter->$key = $value; - } - } - } - $filter->find(); - while ($filter->fetch()) { - $row = array(); - self::storeValues($filter, $row); - - if (isset($types[$row['type']])) { - $row['type_name'] = $types[$row['type']]; - } else { - $row['type_name'] = ''; - } - if (!empty($row['configuration'])) { - $row['configuration'] = json_decode($row['configuration'], true); - } else { - $row['configuration'] = array(); - } - - $result[$row['id']] = $row; - } - return $result; - } - - /** - * Function to add or update a DataProcessor - * - * @param array $params - * @return array $result - * @access public - * @throws Exception when params is empty - * @static - */ - public static function add($params) { - $result = array(); - if (empty($params)) { - throw new Exception('Params can not be empty when adding or updating a data processor filter'); - } - - if (!empty($params['id'])) { - CRM_Utils_Hook::pre('edit', 'DataProcessorFilter', $params['id'], $params); - } - else { - CRM_Utils_Hook::pre('create', 'DataProcessorFilter', NULL, $params); - } - - $filter = new CRM_Dataprocessor_DAO_Filter(); - $filters = self::fields(); - foreach ($params as $key => $value) { - if (isset($filters[$key])) { - $filter->$key = $value; - } - } - if (isset($filter->configuration) && is_array($filter->configuration)) { - $filter->configuration = json_encode($filter->configuration); - } - - $filter->save(); - $id = $filter->id; - $filter = new CRM_Dataprocessor_BAO_Filter(); - $filter->id = $id; - $filter->find(true); - CRM_Dataprocessor_BAO_DataProcessor::updateAndChekStatus($filter->data_processor_id); - self::storeValues($filter, $result); - - if (!empty($params['id'])) { - CRM_Utils_Hook::post('edit', 'DataProcessorFilter', $filter->id, $filter); - } - else { - CRM_Utils_Hook::post('create', 'DataProcessorFilter', $filter->id, $filter); - } - - return $result; - } - - /** - * Public function to generate name from title - * - * @param $label - * @return string - * @access public - * @static - */ - public static function buildNameFromTitle($title) { - return preg_replace('@[^a-z0-9_]+@','_', strtolower($title)); - } - - /** - * Returns whether the name is valid or not - * - * @param string $name - * @param int $data_procssor_id, - * @param int $id optional - * @return bool - * @static - */ - public static function isNameValid($name, $data_procssor_id, $id=null) { - $sql = "SELECT COUNT(*) FROM `civicrm_data_processor_filter` WHERE `name` = %1 AND `data_processor_id` = %2"; - $params[1] = array($name, 'String'); - $params[2] = array($data_procssor_id, 'Integer'); - if ($id) { - $sql .= " AND `id` != %3"; - $params[3] = array($id, 'Integer'); - } - $count = CRM_Core_DAO::singleValueQuery($sql, $params); - return ($count > 0) ? false : true; - } - - /** - * Function to delete a Data Processor Filter with id - * - * @param int $id - * @throws Exception when $id is empty - * @access public - * @static - */ - public static function deleteWithId($id) { - if (empty($id)) { - throw new Exception('id can not be empty when attempting to delete a data processor filter'); - } - - CRM_Utils_Hook::pre('delete', 'DataProcessorFilter', $id, CRM_Core_DAO::$_nullArray); - - $filter = new CRM_Dataprocessor_DAO_Filter(); - $filter->id = $id; - $filter->delete(); - - CRM_Utils_Hook::post('delete', 'DataProcessorFilter', $id, CRM_Core_DAO::$_nullArray); - - return; - } - - /** - * Function to delete a Data Processor Filter with id - * - * @param int $id - * @throws Exception when $id is empty - * @access public - * @static - */ - public static function deleteWithDataProcessorId($id) { - if (empty($id)) { - throw new Exception('id can not be empty when attempting to delete a data processor filter'); - } - - $filter = new CRM_Dataprocessor_DAO_Filter(); - $filter->data_processor_id = $id; - $filter->find(FALSE); - while ($filter->fetch()) { - self::deleteWithId($filter->id); - } - } - -} \ No newline at end of file diff --git a/CRM/Dataprocessor/DAO/DataProcessorFilter.php b/CRM/Dataprocessor/DAO/DataProcessorFilter.php new file mode 100644 index 0000000000000000000000000000000000000000..3a34a33c3f28bc751642f9aa0bd3cd733606d8b5 --- /dev/null +++ b/CRM/Dataprocessor/DAO/DataProcessorFilter.php @@ -0,0 +1,267 @@ +<?php + +/** + * @package CRM + * @copyright CiviCRM LLC (c) 2004-2019 + * + * Generated from /buildkit/build/search/sites/default/files/civicrm/ext/dataprocessor/xml/schema/CRM/Dataprocessor/DataProcessorFilter.xml + * DO NOT EDIT. Generated by CRM_Core_CodeGen + * (GenCodeChecksum:a0b00b49eb3a0197adf06272fc6e31f7) + */ + +/** + * Database access object for the DataProcessorFilter entity. + */ +class CRM_Dataprocessor_DAO_DataProcessorFilter extends CRM_Core_DAO { + + /** + * Static instance to hold the table name. + * + * @var string + */ + static $_tableName = 'civicrm_data_processor_filter'; + + /** + * Should CiviCRM log any modifications to this table in the civicrm_log table. + * + * @var bool + */ + static $_log = FALSE; + + /** + * Unique DataProcessorFilter ID + * + * @var int unsigned + */ + public $id; + + /** + * FK to Data Processor + * + * @var int unsigned + */ + public $data_processor_id; + + /** + * @var int + */ + public $weight; + + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $title; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $is_required; + + /** + * @var text + */ + public $configuration; + + /** + * Class constructor. + */ + public function __construct() { + $this->__table = 'civicrm_data_processor_filter'; + parent::__construct(); + } + + /** + * Returns foreign keys and entity references. + * + * @return array + * [CRM_Core_Reference_Interface] + */ + public static function getReferenceColumns() { + if (!isset(Civi::$statics[__CLASS__]['links'])) { + Civi::$statics[__CLASS__]['links'] = static ::createReferenceColumns(__CLASS__); + Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName(), 'data_processor_id', 'civicrm_data_processor', 'id'); + CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'links_callback', Civi::$statics[__CLASS__]['links']); + } + return Civi::$statics[__CLASS__]['links']; + } + + /** + * Returns all the column names of this table + * + * @return array + */ + public static function &fields() { + if (!isset(Civi::$statics[__CLASS__]['fields'])) { + Civi::$statics[__CLASS__]['fields'] = [ + 'id' => [ + 'name' => 'id', + 'type' => CRM_Utils_Type::T_INT, + 'description' => CRM_Dataprocessor_ExtensionUtil::ts('Unique DataProcessorFilter ID'), + 'required' => TRUE, + 'table_name' => 'civicrm_data_processor_filter', + 'entity' => 'DataProcessorFilter', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'localizable' => 0, + ], + 'data_processor_id' => [ + 'name' => 'data_processor_id', + 'type' => CRM_Utils_Type::T_INT, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Data Processor ID'), + 'description' => CRM_Dataprocessor_ExtensionUtil::ts('FK to Data Processor'), + 'required' => TRUE, + 'table_name' => 'civicrm_data_processor_filter', + 'entity' => 'DataProcessorFilter', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'localizable' => 0, + ], + 'weight' => [ + 'name' => 'weight', + 'type' => CRM_Utils_Type::T_INT, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Weight'), + 'required' => FALSE, + 'table_name' => 'civicrm_data_processor_filter', + 'entity' => 'DataProcessorFilter', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'localizable' => 0, + ], + 'name' => [ + 'name' => 'name', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Name'), + 'required' => FALSE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'table_name' => 'civicrm_data_processor_filter', + 'entity' => 'DataProcessorFilter', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'localizable' => 0, + ], + 'title' => [ + 'name' => 'title', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Title'), + 'required' => TRUE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'table_name' => 'civicrm_data_processor_filter', + 'entity' => 'DataProcessorFilter', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'localizable' => 0, + ], + 'type' => [ + 'name' => 'type', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Type'), + 'required' => TRUE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'table_name' => 'civicrm_data_processor_filter', + 'entity' => 'DataProcessorFilter', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'localizable' => 0, + ], + 'is_required' => [ + 'name' => 'is_required', + 'type' => CRM_Utils_Type::T_BOOLEAN, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Is required'), + 'required' => FALSE, + 'table_name' => 'civicrm_data_processor_filter', + 'entity' => 'DataProcessorFilter', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'localizable' => 0, + ], + 'configuration' => [ + 'name' => 'configuration', + 'type' => CRM_Utils_Type::T_TEXT, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Configuration'), + 'required' => FALSE, + 'table_name' => 'civicrm_data_processor_filter', + 'entity' => 'DataProcessorFilter', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'localizable' => 0, + 'serialize' => self::SERIALIZE_JSON, + ], + ]; + CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']); + } + return Civi::$statics[__CLASS__]['fields']; + } + + /** + * Return a mapping from field-name to the corresponding key (as used in fields()). + * + * @return array + * Array(string $name => string $uniqueName). + */ + public static function &fieldKeys() { + if (!isset(Civi::$statics[__CLASS__]['fieldKeys'])) { + Civi::$statics[__CLASS__]['fieldKeys'] = array_flip(CRM_Utils_Array::collect('name', self::fields())); + } + return Civi::$statics[__CLASS__]['fieldKeys']; + } + + /** + * Returns the names of this table + * + * @return string + */ + public static function getTableName() { + return self::$_tableName; + } + + /** + * Returns if this table needs to be logged + * + * @return bool + */ + public function getLog() { + return self::$_log; + } + + /** + * Returns the list of fields that can be imported + * + * @param bool $prefix + * + * @return array + */ + public static function &import($prefix = FALSE) { + $r = CRM_Core_DAO_AllCoreTables::getImports(__CLASS__, 'data_processor_filter', $prefix, []); + return $r; + } + + /** + * Returns the list of fields that can be exported + * + * @param bool $prefix + * + * @return array + */ + public static function &export($prefix = FALSE) { + $r = CRM_Core_DAO_AllCoreTables::getExports(__CLASS__, 'data_processor_filter', $prefix, []); + return $r; + } + + /** + * Returns the list of indices + * + * @param bool $localize + * + * @return array + */ + public static function indices($localize = TRUE) { + $indices = []; + return ($localize && !empty($indices)) ? CRM_Core_DAO_AllCoreTables::multilingualize(__CLASS__, $indices) : $indices; + } + +} diff --git a/CRM/Dataprocessor/DAO/Filter.php b/CRM/Dataprocessor/DAO/Filter.php deleted file mode 100644 index 6be51fceaff8de35076466a95625863e8c83cf82..0000000000000000000000000000000000000000 --- a/CRM/Dataprocessor/DAO/Filter.php +++ /dev/null @@ -1,102 +0,0 @@ -<?php - -use CRM_Dataprocessor_ExtensionUtil as E; - -/** - * @author Jaap Jansma (CiviCooP) <jaap.jansma@civicoop.org> - * @license http://www.gnu.org/licenses/agpl-3.0.html - */ -class CRM_Dataprocessor_DAO_Filter extends CRM_Core_DAO { - /** - * static instance to hold the field values - * - * @var array - * @static - */ - static $_fields = null; - static $_export = null; - /** - * empty definition for virtual function - */ - static function getTableName() { - return 'civicrm_data_processor_filter'; - } - /** - * returns all the column names of this table - * - * @access public - * @return array - */ - public static function &fields() { - if (!(self::$_fields)) { - self::$_fields = array( - 'id' => array( - 'name' => 'id', - 'title' => E::ts('ID'), - 'type' => CRM_Utils_Type::T_INT, - 'required' => true - ) , - 'data_processor_id' => array( - 'name' => 'data_processor_id', - 'title' => E::ts('Data Processor ID'), - 'type' => CRM_Utils_Type::T_INT, - 'required' => true, - 'FKApiName' => 'DataProcessor', - ), - 'is_required' => array( - 'name' => 'is_required', - 'title' => E::ts('Is required'), - 'type' => CRM_Utils_Type::T_INT, - ), - 'type' => array( - 'name' => 'type', - 'title' => E::ts('Type'), - 'type' => CRM_Utils_Type::T_STRING, - 'maxlength' => 80, - 'required' => true, - ), - 'name' => array( - 'name' => 'name', - 'title' => E::ts('Name'), - 'type' => CRM_Utils_Type::T_STRING, - 'maxlength' => 128, - 'required' => true - ), - 'title' => array( - 'name' => 'title', - 'title' => E::ts('Title'), - 'type' => CRM_Utils_Type::T_STRING, - 'maxlength' => 128, - 'required' => true - ), - 'configuration' => array( - 'name' => 'configuration', - 'title' => E::ts('Configuration'), - 'type' => CRM_Utils_Type::T_TEXT, - ), - ); - } - return self::$_fields; - } - /** - * Returns an array containing, for each field, the array key used for that - * field in self::$_fields. - * - * @access public - * @return array - */ - public static function &fieldKeys() { - if (!(self::$_fieldKeys)) { - self::$_fieldKeys = array( - 'id' => 'id', - 'data_processor_id' => 'data_processor_id', - 'is_required' => 'is_required', - 'type' => 'type', - 'name' => 'name', - 'title' => 'title', - 'configuration' => 'configuration', - ); - } - return self::$_fieldKeys; - } -} \ No newline at end of file diff --git a/CRM/Dataprocessor/Form/DataProcessor.php b/CRM/Dataprocessor/Form/DataProcessor.php index a9dcc6d5492bf67e07e9866d7ef8dc72e87afdf3..d949892682e37a37c8f430083ac0cad477d5b280 100644 --- a/CRM/Dataprocessor/Form/DataProcessor.php +++ b/CRM/Dataprocessor/Form/DataProcessor.php @@ -93,11 +93,12 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { } protected function addFilters() { - $filters = CRM_Dataprocessor_BAO_Filter::getValues(array('data_processor_id' => $this->dataProcessorId)); + $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $this->dataProcessorId, 'options' => array('limit' => 0))); + $filters = $filters['values']; foreach($filters as $idx => $filter) { - $filters[$idx]['is_required'] = $filter['is_required'] ? E::ts('Yes') : E::ts('No'); $filters[$idx]['configuration_link'] = ''; } + CRM_Utils_Weight::addOrder($filters, 'CRM_Dataprocessor_DAO_DataProcessorFilter', 'id', $this->currentUrl, 'data_processor_id='.$this->dataProcessorId); $this->assign('filters', $filters); } diff --git a/CRM/Dataprocessor/Form/Filter.php b/CRM/Dataprocessor/Form/Filter.php index 04b249274fe261ba9bc3874a2ac00218dd581b5e..085d589afadc9f43d4a49d8eb32302be8c277def 100644 --- a/CRM/Dataprocessor/Form/Filter.php +++ b/CRM/Dataprocessor/Form/Filter.php @@ -13,12 +13,28 @@ class CRM_Dataprocessor_Form_Filter extends CRM_Core_Form { private $id; + private $filter; + + /** + * @var Civi\DataProcessor\FilterHandler\AbstractFilterHandler + */ + private $filterTypeClass; + + private $snippet; + /** * Function to perform processing before displaying form (overrides parent function) * * @access public */ function preProcess() { + $this->snippet = CRM_Utils_Request::retrieve('snippet', 'String'); + if ($this->snippet) { + $this->assign('suppressForm', TRUE); + $this->controller->_generateQFKey = FALSE; + } + + $factory = dataprocessor_get_factory(); $session = CRM_Core_Session::singleton(); $this->dataProcessorId = CRM_Utils_Request::retrieve('data_processor_id', 'Integer'); $this->assign('data_processor_id', $this->dataProcessorId); @@ -26,9 +42,22 @@ class CRM_Dataprocessor_Form_Filter extends CRM_Core_Form { $this->id = CRM_Utils_Request::retrieve('id', 'Integer'); $this->assign('id', $this->id); + $this->assign('has_configuration', false); if ($this->id) { - $filter = CRM_Dataprocessor_BAO_Filter::getValues(array('id' => $this->id)); - $this->assign('filter', $filter[$this->id]); + $this->filter = civicrm_api3('DataProcessorFilter', 'getsingle', array('id' => $this->id)); + $this->assign('filter', $this->filter); + $this->filterTypeClass = $factory->getFilterByName($this->filter['type']); + $this->assign('has_configuration', $this->filterTypeClass->hasConfiguration()); + } + + $type = CRM_Utils_Request::retrieve('type', 'String'); + if ($type) { + $this->filterTypeClass = $factory->getFilterByName($type); + $this->assign('has_configuration', $this->filterTypeClass->hasConfiguration()); + } + + if (!$this->filter) { + $this->filter['data_processor_id'] = $this->dataProcessorId; } $title = E::ts('Data Processor Filter'); @@ -41,24 +70,25 @@ class CRM_Dataprocessor_Form_Filter extends CRM_Core_Form { public function buildQuickForm() { $this->add('hidden', 'data_processor_id'); $this->add('hidden', 'id'); - if ($this->_action != CRM_Core_Action::DELETE) { + if ($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')))); + } else { $this->add('text', 'name', E::ts('Name'), array('size' => CRM_Utils_Type::HUGE), FALSE); $this->add('text', 'title', E::ts('Title'), array('size' => CRM_Utils_Type::HUGE), TRUE); $factory = dataprocessor_get_factory(); - $filters = array(E::ts(' - select - ')) + $factory->getFilters(); - $this->add('select', 'type', E::ts('Select Filter'), $filters, true, array('class' => 'crm-select2 crm-huge40')); + $this->add('select', 'type', E::ts('Select Filter'), $factory->getFilters(), true, array('style' => 'min-width:250px', + 'class' => 'crm-select2 huge', + 'placeholder' => E::ts('- select -'),)); $this->add('checkbox', 'is_required', E::ts('Is required')); - } - if ($this->_action == CRM_Core_Action::ADD) { - $this->addButtons(array( - array('type' => 'next', 'name' => E::ts('Next'), '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')))); - } else { + + if ($this->filterTypeClass && $this->filterTypeClass->hasConfiguration()) { + $this->filterTypeClass->buildConfigurationForm($this, $this->filter); + $this->assign('configuration_template', $this->filterTypeClass->getConfigurationTemplateFileName()); + } + $this->addButtons(array( array('type' => 'next', 'name' => E::ts('Save'), 'isDefault' => TRUE,), array('type' => 'cancel', 'name' => E::ts('Cancel')))); @@ -71,18 +101,21 @@ class CRM_Dataprocessor_Form_Filter extends CRM_Core_Form { $defaults['data_processor_id'] = $this->dataProcessorId; $defaults['id'] = $this->id; - $filter = CRM_Dataprocessor_BAO_Filter::getValues(array('id' => $this->id)); - if (isset($filter[$this->id]['type'])) { - $defaults['type'] = $filter[$this->id]['type']; + if (isset($this->filter['type'])) { + $defaults['type'] = $this->filter['type']; + } else { + $factory = dataprocessor_get_factory(); + $filter_types = array_keys($factory->getFilters()); + $defaults['type'] = reset($filter_types); } - if (isset($filter[$this->id]['is_required'])) { - $defaults['is_required'] = $filter[$this->id]['is_required']; + if (isset($this->filter['is_required'])) { + $defaults['is_required'] = $this->filter['is_required']; } - if (isset($filter[$this->id]['title'])) { - $defaults['title'] = $filter[$this->id]['title']; + if (isset($this->filter['title'])) { + $defaults['title'] = $this->filter['title']; } - if (isset($filter[$this->id]['name'])) { - $defaults['name'] = $filter[$this->id]['name']; + if (isset($this->filter['name'])) { + $defaults['name'] = $this->filter['name']; } return $defaults; } @@ -91,7 +124,7 @@ class CRM_Dataprocessor_Form_Filter extends CRM_Core_Form { $session = CRM_Core_Session::singleton(); $redirectUrl = $session->readUserContext(); if ($this->_action == CRM_Core_Action::DELETE) { - CRM_Dataprocessor_BAO_Filter::deleteWithId($this->id); + civicrm_api3('DataProcessorFilter', 'delete', array('id' => $this->id)); $session->setStatus(E::ts('Filter removed'), E::ts('Removed'), 'success'); CRM_Utils_System::redirect($redirectUrl); } @@ -99,8 +132,6 @@ class CRM_Dataprocessor_Form_Filter extends CRM_Core_Form { $values = $this->exportValues(); if (!empty($values['name'])) { $params['name'] = $values['name']; - } else { - $params['name'] = CRM_Dataprocessor_BAO_Filter::buildNameFromTitle($values['title']); } $params['title'] = $values['title']; $params['type'] = $values['type']; @@ -112,59 +143,14 @@ class CRM_Dataprocessor_Form_Filter extends CRM_Core_Form { $params['id'] = $this->id; } - $result = CRM_Dataprocessor_BAO_Filter::add($params); - $factory = dataprocessor_get_factory(); - $filter = $factory->getFilterByName($values['type']); - if ($filter->getConfigurationUrl($result['id'], $this->dataProcessorId)) { - $redirectUrl = CRM_Utils_System::url($filter->getConfigurationUrl(), [ - 'reset' => 1, - 'action' => 'update', - 'id' => $result['id'], - 'data_processor_id' => $this->dataProcessorId - ]); + if ($this->filterTypeClass && $this->filterTypeClass->hasConfiguration()) { + $params['configuration'] = $this->filterTypeClass->processConfiguration($values); } + civicrm_api3('DataProcessorFilter', 'create', $params); + CRM_Utils_System::redirect($redirectUrl); parent::postProcess(); } - /** - * Function to add validation rules (overrides parent function) - * - * @access public - */ - function addRules() { - if ($this->_action != CRM_Core_Action::DELETE) { - $this->addFormRule(array( - 'CRM_Dataprocessor_Form_Filter', - 'validateName' - )); - } - } - - /** - * Function to validate if rule label already exists - * - * @param array $fields - * @return array|bool - * @access static - */ - static function validateName($fields) { - /* - * if id not empty, edit mode. Check if changed before check if exists - */ - $id = false; - if (!empty($fields['id'])) { - $id = $fields['id']; - } - if (empty($fields['name'])) { - $fields['name'] = CRM_Dataprocessor_BAO_Filter::buildNameFromTitle($fields['title']); - } - if (!CRM_Dataprocessor_BAO_Filter::isNameValid($fields['name'], $fields['data_processor_id'], $id)) { - $errors['name'] = E::ts('There is already a filter with this name'); - return $errors; - } - return TRUE; - } - } \ No newline at end of file diff --git a/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php b/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php index 0ec54cff45bd30f75c3059ea3537883a16c11309..9537ad900a7e16466bc21dbfcb6c0801a10d5270 100644 --- a/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php +++ b/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php @@ -323,6 +323,7 @@ abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Co else { switch ($type) { case \CRM_Utils_Type::T_DATE: + case \CRM_Utils_Type::T_TIMESTAMP: CRM_Core_Form_Date::buildDateRange($this, $fieldSpec->alias, $count, '_from', '_to', E::ts('From:'), $filterHandler->isRequired(), $operations); $count++; break; diff --git a/CRM/Dataprocessor/Utils/DataSourceFields.php b/CRM/Dataprocessor/Utils/DataSourceFields.php new file mode 100644 index 0000000000000000000000000000000000000000..e4cca6a4c9491df31c717fd0f815e4f8bccc853a --- /dev/null +++ b/CRM/Dataprocessor/Utils/DataSourceFields.php @@ -0,0 +1,26 @@ +<?php +/** + * @author Jaap Jansma <jaap.jansma@civicoop.org> + * @license AGPL-3.0 + */ + +class CRM_Dataprocessor_Utils_DataSourceFields { + + /** + * Returns an array with the name of the field as the key and the label of the field as the value. + * + * @oaram int $dataProcessorId + * @return array + * @throws \Exception + */ + public static function getAvailableFieldsInDataSources($dataProcessorId) { + $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dataProcessorId); + foreach($dataProcessor->getDataSources() as $dataSource) { + foreach($dataSource->getAvailableFilterFields()->getFields() as $field) { + $fieldSelect[$dataSource->getSourceName().'::'.$field->name] = $dataSource->getSourceTitle().' :: '.$field->title; + } + } + return $fieldSelect; + } + +} \ No newline at end of file diff --git a/CRM/Dataprocessor/Utils/Importer.php b/CRM/Dataprocessor/Utils/Importer.php index fcd441cf19c85b87c35a215559d0bf0b006cf221..a5b70651f789292c892941bbb09e269cdf103c09 100644 --- a/CRM/Dataprocessor/Utils/Importer.php +++ b/CRM/Dataprocessor/Utils/Importer.php @@ -73,8 +73,8 @@ class CRM_Dataprocessor_Utils_Importer { // Clear all existing data sources and outputs CRM_Dataprocessor_BAO_Source::deleteWithDataProcessorId($id); - CRM_Dataprocessor_BAO_Filter::deleteWithDataProcessorId($id); - CRM_Dataprocessor_BAO_Field::deleteWithDataProcessorId($id); + CRM_Dataprocessor_BAO_DataProcessorFilter::deleteWithDataProcessorId($id); + CRM_Dataprocessor_BAO_DataProcessorField::deleteWithDataProcessorId($id); CRM_Dataprocessor_BAO_Output::deleteWithDataProcessorId($id); foreach($data['data_sources'] as $data_source) { @@ -85,12 +85,12 @@ class CRM_Dataprocessor_Utils_Importer { foreach($data['filters'] as $filter) { $params = $filter; $params['data_processor_id'] = $id; - $result = CRM_Dataprocessor_BAO_Filter::add($params); + civicrm_api3('DataProcessorFilter', 'create', $params); } foreach($data['fields'] as $field) { $params = $field; $params['data_processor_id'] = $id; - $result = CRM_Dataprocessor_BAO_Field::add($params); + civicrm_api3('DataProcessorField', 'create', $params); } foreach($data['outputs'] as $output) { $params = $output; diff --git a/Civi/DataProcessor/Factory.php b/Civi/DataProcessor/Factory.php index 245a2bcbc0e6e8e1d711be79b67e239a146f9743..d20880c997651fc7f2e4a3b4302b6b6dd4e910b4 100644 --- a/Civi/DataProcessor/Factory.php +++ b/Civi/DataProcessor/Factory.php @@ -121,7 +121,7 @@ class Factory { $this->addOutput('contact_search', 'CRM_DataprocessorSearch_ContactSearch', E::ts('Contact Search')); $this->addOutput('activity_search', 'CRM_DataprocessorSearch_ActivitySearch', E::ts('Activity Search')); $this->addOutput('export_csv', 'CRM_DataprocessorOutputExport_CSV', E::ts('CSV Export')); - $this->addFilter('simple_sql_filter', 'Civi\DataProcessor\FilterHandler\SimpleSqlFilter', E::ts('Simple Filter')); + $this->addFilter('simple_sql_filter', 'Civi\DataProcessor\FilterHandler\SimpleSqlFilter', E::ts('Field filter')); $this->addjoinType('simple_join', 'Civi\DataProcessor\DataFlow\MultipleDataFlows\SimpleJoin', E::ts('Simple Join')); $this->addjoinType('simple_non_required_join', 'Civi\DataProcessor\DataFlow\MultipleDataFlows\SimpleNonRequiredJoin', E::ts('Simple (but not required) Join')); } diff --git a/Civi/DataProcessor/FilterHandler/AbstractFilterHandler.php b/Civi/DataProcessor/FilterHandler/AbstractFilterHandler.php index d6420526fc8911441d69a97dc6eb6d08e6265e63..48b9c1701f68daeaccbfa199651f289794c2e9a9 100644 --- a/Civi/DataProcessor/FilterHandler/AbstractFilterHandler.php +++ b/Civi/DataProcessor/FilterHandler/AbstractFilterHandler.php @@ -56,13 +56,49 @@ abstract class AbstractFilterHandler { } /** - * Returns the URL to a configuration screen. - * Return false when no configuration screen is present. + * Returns true when this filter has additional configuration + * + * @return bool + */ + public function hasConfiguration() { + return false; + } + + /** + * 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()) { + // Example add a checkbox to the form. + // $form->add('checkbox', 'show_label', E::ts('Show label')); + } + + /** + * When this filter type has configuration specify the template file name + * for the configuration form. * * @return false|string */ - public function getConfigurationUrl() { + public function getConfigurationTemplateFileName() { + // Example return "CRM/FormFieldLibrary/Form/FieldConfiguration/TextField.tpl"; return false; } + + /** + * Process the submitted values and create a configuration array + * + * @param $submittedValues + * @return array + */ + public function processConfiguration($submittedValues) { + // Add the show_label to the configuration array. + // $configuration['show_label'] = $submittedValues['show_label']; + // return $configuration; + return array(); + } + } \ No newline at end of file diff --git a/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php b/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php index a16ca8c2d8f5d3489f8ab154963040070e73be4d..79ded590eb1064b2ae1c8c4fa648545001e79afb 100644 --- a/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php +++ b/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php @@ -73,13 +73,60 @@ class SimpleSqlFilter extends AbstractFilterHandler { } /** - * Returns the URL to a configuration screen. - * Return false when no configuration screen is present. + * 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::getAvailableFieldsInDataSources($filter['data_processor_id']); + + $form->add('select', 'field', E::ts('Field'), $fieldSelect, true, array( + 'style' => 'min-width:250px', + 'class' => 'crm-select2 huge', + 'placeholder' => E::ts('- select -'), + )); + if (isset($filter['configuration'])) { + $configuration = $filter['configuration']; + 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 getConfigurationUrl() { - return 'civicrm/dataprocessor/form/filter/simplefilter'; + public function getConfigurationTemplateFileName() { + return "CRM/Dataprocessor/Form/Filter/SimpleSqlFilter.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; } } \ No newline at end of file diff --git a/api/v3/DataProcessorFilter.php b/api/v3/DataProcessorFilter.php new file mode 100644 index 0000000000000000000000000000000000000000..6737abacbc800ceb6cfa8093a1e60eb396a6fea6 --- /dev/null +++ b/api/v3/DataProcessorFilter.php @@ -0,0 +1,124 @@ +<?php +use CRM_Dataprocessor_ExtensionUtil as E; + +/** + * DataProcessorFilter.create API specification (optional) + * This is used for documentation and validation. + * + * @param array $spec description of fields supported by this API call + * @return void + * @see http://wiki.civicrm.org/confluence/display/CRMDOC/API+Architecture+Standards + */ +function _civicrm_api3_data_processor_filter_create_spec(&$spec) { + $fields = CRM_Dataprocessor_DAO_DataProcessorFilter::fields(); + foreach($fields as $fieldname => $field) { + $spec[$fieldname] = $field; + if ($fieldname != 'id' && isset($field['required']) && $field['required']) { + $spec[$fieldname]['api.required'] = true; + } + } +} + +/** + * DataProcessorFilter.create API + * + * @param array $params + * @return array API result descriptor + * @throws API_Exception + */ +function civicrm_api3_data_processor_filter_create($params) { + if (!isset($params['weight']) && !isset($params['id'])) { + $params['weight'] = CRM_Utils_Weight::getDefaultWeight('CRM_Dataprocessor_DAO_DataProcessorFilter', array('data_processor_id' => $params['data_processor_id'])); + } + $id = null; + if (isset($params['id'])) { + $id = $params['id']; + } + $params['name'] = CRM_Dataprocessor_BAO_DataProcessorFilter::checkName($params['title'], $params['data_processor_id'], $id, $params['name']); + return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params); +} + +/** + * DataProcessorFilter.delete API + * + * @param array $params + * @return array API result descriptor + * @throws API_Exception + */ +function civicrm_api3_data_processor_filter_delete($params) { + return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params); +} + +/** + * DataProcessorFilter.get API specification (optional) + * This is used for documentation and validation. + * + * @param array $spec description of fields supported by this API call + * @return void + * @see http://wiki.civicrm.org/confluence/display/CRMDOC/API+Architecture+Standards + */ +function civicrm_api3_data_processor_filter_get_spec(&$spec) { + $fields = CRM_Dataprocessor_DAO_DataProcessorFilter::fields(); + foreach($fields as $fieldname => $field) { + $spec[$fieldname] = $field; + } +} + +/** + * DataProcessorFilter.get API + * + * @param array $params + * @return array API result descriptor + * @throws API_Exception + */ +function civicrm_api3_data_processor_filter_get($params) { + if (!isset($params['options']) || !isset($params['options']['sort'])) { + $params['options']['sort'] = 'weight ASC'; + } + $return = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params); + foreach($return['values'] as $id => $value) { + if (isset($value['configuration'])) { + $return['values'][$id]['configuration'] = json_decode($value['configuration'], TRUE); + } + } + return $return; +} + + +/** + * DataProcessorFilter.check_name API specification + * + * @param $params + */ +function _civicrm_api3_data_processor_filter_check_name_spec($params) { + $params['id'] = array( + 'name' => 'id', + 'title' => E::ts('ID'), + ); + $params['title'] = array( + 'name' => 'title', + 'title' => E::ts('Title'), + 'api.required' => true, + ); + $params['data_processor_id'] = array( + 'name' => 'data_processor_id', + 'title' => E::ts('Data Processor Id'), + 'api.required' => true, + ); + $params['name'] = array( + 'name' => 'name', + 'title' => E::ts('Name'), + ); +} + +/** + * DataProcessorFilter.check_name API + * + * @param $params + */ +function civicrm_api3_data_processor_filter_check_name($params) { + $name = CRM_Dataprocessor_BAO_DataProcessorFilter::checkName($params['title'], $params['data_processor_id'], $params['id'], $params['name']); + return array( + 'name' => $name, + ); +} diff --git a/api/v3/DataProcessorFilter/Create.php b/api/v3/DataProcessorFilter/Create.php deleted file mode 100644 index f20d05d4a843deca67940a12b5af3b55d0ab2e4e..0000000000000000000000000000000000000000 --- a/api/v3/DataProcessorFilter/Create.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php - -use CRM_Dataprocessor_ExtensionUtil as E; - -/** - * DataProcessorFilter.Create API specification (optional) - * This is used for documentation and validation. - * - * @param array $spec description of filters supported by this API call - * @return void - * @see http://wiki.civicrm.org/confluence/display/CRM/API+Architecture+Standards - */ -function _civicrm_api3_data_processor_filter_create_spec(&$spec) { - $spec['id'] = array( - 'title' => E::ts('ID'), - 'type' => CRM_Utils_Type::T_INT, - 'api.required' => false - ); - $spec['data_processor_id'] = array( - 'title' => E::ts('Data Processor ID'), - 'type' => CRM_Utils_Type::T_INT, - 'api.required' => true, - ); - $spec['is_required'] = array( - 'title' => E::ts('Is required'), - 'type' => CRM_Utils_Type::T_BOOLEAN, - 'api.required' => true, - 'api.default' => true, - ); - $spec['type'] = array( - 'title' => E::ts('Type'), - 'type' => CRM_Utils_Type::T_STRING, - 'api.required' => true - ); - $spec['name'] = array( - 'title' => E::ts('Name'), - 'type' => CRM_Utils_Type::T_STRING, - 'api.required' => true - ); - $spec['title'] = array( - 'title' => E::ts('Title'), - 'type' => CRM_Utils_Type::T_STRING, - 'api.required' => true - ); - $spec['configuration'] = array( - 'title' => E::ts('Configuration'), - 'type' => CRM_Utils_Type::T_TEXT, - 'api.required' => false, - ); -} - -/** - * DataProcessorFilter.Create API - * - * @param array $params - * @return array API result descriptor - * @see civicrm_api3_create_success - * @see civicrm_api3_create_error - * - * - */ -function civicrm_api3_data_processor_filter_create($params) { - $returnValue = CRM_Dataprocessor_BAO_Filter::add($params); - $returnValues[$returnValue['id']] = $returnValue; - return civicrm_api3_create_success($returnValues, $params, 'DataProcessorFilter', 'Create'); -} - diff --git a/api/v3/DataProcessorFilter/Delete.php b/api/v3/DataProcessorFilter/Delete.php deleted file mode 100644 index fdcb3341cb7c3ea22bcf5e43eef1fc8061bed011..0000000000000000000000000000000000000000 --- a/api/v3/DataProcessorFilter/Delete.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -use CRM_Dataprocessor_ExtensionUtil as E; - -/** - * DataProcessorFilter.Delete API specification (optional) - * This is used for documentation and validation. - * - * @param array $spec description of fields supported by this API call - * @return void - * @see http://wiki.civicrm.org/confluence/display/CRMDOC/API+Architecture+Standards - */ -function _civicrm_api3_data_processor_filter_Delete_spec(&$spec) { - $spec['id'] = array( - 'title' => E::ts('ID'), - 'type' => CRM_Utils_Type::T_INT, - 'api.required' => true - ); -} - -/** - * DataProcessorFilter.Delete API - * - * @param array $params - * @return array API result descriptor - * @see civicrm_api3_create_success - * @see civicrm_api3_create_error - * @throws API_Exception - */ -function civicrm_api3_data_processor_filter_Delete($params) { - if (!array_key_exists('id', $params) || empty($params['id'])) { - throw new API_Exception('Parameter id is mandatory and can not be empty in ' . __METHOD__, 0010); - } else { - return civicrm_api3_create_success(CRM_Dataprocessor_BAO_DataProcessorFilter::deleteWithId($params['id']), $params, 'DataProcessorFilter', 'Delete'); - } -} - diff --git a/api/v3/DataProcessorFilter/Get.php b/api/v3/DataProcessorFilter/Get.php deleted file mode 100644 index dbdfd8a54534e04b208dfd351ecb1d08fc09808d..0000000000000000000000000000000000000000 --- a/api/v3/DataProcessorFilter/Get.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php -/** - * DataProcessorFilter.Get API - * - * @param array $params - * @return array API result descriptor - * @see civicrm_api3_create_success - * @see civicrm_api3_create_error - * @throws API_Exception - */ -function civicrm_api3_data_processor_filter_get($params) { - $returnValues = CRM_Dataprocessor_BAO_Filter::getValues($params); - return civicrm_api3_create_success($returnValues, $params, 'DataProcessorFilter', 'Get'); -} - -/** - * DataProcessorFilter.Get API specification (optional) - * This is used for documentation and validation. - * - * @param array $spec description of fields supported by this API call - * @return void - * @see http://wiki.civicrm.org/confluence/display/CRM/API+Architecture+Standards - */ -function _civicrm_api3_data_processor_filter_get_spec(&$spec) { - $fields = CRM_Dataprocessor_BAO_Filter::fields(); - foreach($fields as $fieldname => $field) { - $spec[$fieldname] = $field; - } -} - diff --git a/dataprocessor.civix.php b/dataprocessor.civix.php index 415bce1b6813b7584a9c312a8836f92d473a395a..e993b955bd7e6c635a0084b6cf38eb0580804f44 100644 --- a/dataprocessor.civix.php +++ b/dataprocessor.civix.php @@ -463,5 +463,11 @@ function _dataprocessor_civix_civicrm_entityTypes(&$entityTypes) { 'class' => 'CRM_Dataprocessor_DAO_DataProcessorField', 'table' => 'civicrm_data_processor_field', ), + 'CRM_Dataprocessor_DAO_DataProcessorFilter' => + array ( + 'name' => 'DataProcessorFilter', + 'class' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'table' => 'civicrm_data_processor_filter', + ), )); } diff --git a/sql/alter.sql b/sql/alter.sql index e46fa163ac8397b483e11343ae6e0bd01386dc7e..4efe63d067e1b28c9015e12ee587f770ec9d289a 100644 --- a/sql/alter.sql +++ b/sql/alter.sql @@ -1,4 +1,12 @@ ALTER TABLE `civicrm_data_processor_field` CHANGE `name` `name` VARCHAR(255) NOT NULL, CHANGE `type` `type` VARCHAR(255) NOT NULL, -CHANGE `title` `title` VARCHAR(255) NOT NULL; \ No newline at end of file +CHANGE `title` `title` VARCHAR(255) NOT NULL; + +ALTER TABLE `civicrm_data_processor_filter` +CHANGE `name` `name` VARCHAR(255) NOT NULL, +CHANGE `type` `type` VARCHAR(255) NOT NULL, +CHANGE `title` `title` VARCHAR(255) NOT NULL, +ADD `weight` int NULL; + +UPDATE `civicrm_data_processor_filter` SET `weight` = `id`; \ No newline at end of file diff --git a/sql/auto_install.sql b/sql/auto_install.sql index 18635bb0c02aeb4d9130cbc31c498dcfca45f3fa..e2e5878e57f032303ce408c897094b24cf03413e 100644 --- a/sql/auto_install.sql +++ b/sql/auto_install.sql @@ -62,6 +62,7 @@ SET FOREIGN_KEY_CHECKS=0; +DROP TABLE IF EXISTS `civicrm_data_processor_filter`; DROP TABLE IF EXISTS `civicrm_data_processor_field`; SET FOREIGN_KEY_CHECKS=1; @@ -93,4 +94,27 @@ CREATE TABLE `civicrm_data_processor_field` ( , CONSTRAINT FK_civicrm_data_processor_field_data_processor_id FOREIGN KEY (`data_processor_id`) REFERENCES `civicrm_data_processor`(`id`) ON DELETE CASCADE ) ; +-- /******************************************************* +-- * +-- * civicrm_data_processor_filter +-- * +-- *******************************************************/ +CREATE TABLE `civicrm_data_processor_filter` ( + + + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'Unique DataProcessorFilter ID', + `data_processor_id` int unsigned NOT NULL COMMENT 'FK to Data Processor', + `weight` int NULL , + `name` varchar(255) NULL , + `title` varchar(255) NOT NULL , + `type` varchar(255) NOT NULL , + `is_required` tinyint NULL , + `configuration` text NULL +, + PRIMARY KEY (`id`) + + +, CONSTRAINT FK_civicrm_data_processor_filter_data_processor_id FOREIGN KEY (`data_processor_id`) REFERENCES `civicrm_data_processor`(`id`) ON DELETE CASCADE +) ; + diff --git a/sql/auto_uninstall.sql b/sql/auto_uninstall.sql index ef24e55f9769b35e4907f1908d572d73747b7637..f49727688c5273245adc7842193bc747290cefe2 100644 --- a/sql/auto_uninstall.sql +++ b/sql/auto_uninstall.sql @@ -33,6 +33,7 @@ SET FOREIGN_KEY_CHECKS=0; +DROP TABLE IF EXISTS `civicrm_data_processor_filter`; DROP TABLE IF EXISTS `civicrm_data_processor_field`; SET FOREIGN_KEY_CHECKS=1; diff --git a/sql/create_civicrm_data_processor.sql b/sql/create_civicrm_data_processor.sql index 1bafe6ea324f1bdb3785101393ddca5f5b14a89c..7d1d85345b18fdc478d32d231c9e2fbc00563657 100644 --- a/sql/create_civicrm_data_processor.sql +++ b/sql/create_civicrm_data_processor.sql @@ -26,17 +26,6 @@ CREATE TABLE IF NOT EXISTS `civicrm_data_processor_source` ( PRIMARY KEY (`id`) ) ENGINE = InnoDB; -CREATE TABLE IF NOT EXISTS `civicrm_data_processor_filter` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `data_processor_id` INT UNSIGNED NOT NULL, - `name` VARCHAR(128) NOT NULL, - `type` VARCHAR(128) NOT NULL, - `title` VARCHAR(128) NOT NULL, - `is_required` TINYINT NULL DEFAULT 1, - `configuration` TEXT NULL, - PRIMARY KEY (`id`) -) ENGINE = InnoDB; - CREATE TABLE IF NOT EXISTS `civicrm_data_processor_output` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `data_processor_id` INT UNSIGNED NOT NULL, diff --git a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl index 3f39af1c4e4013343132f0eceaca4482cbe08524..c9df525707fd6fc93646ce7e1a7d2e48f89916b8 100644 --- a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl +++ b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl @@ -4,7 +4,7 @@ <table> <tr> <th>{ts}Title{/ts}</th> - <th>{ts}Name{/ts}</th> + <th>{ts}System Name{/ts}</th> <th></th> <th></th> <th></th> @@ -12,7 +12,7 @@ {foreach from=$fields item=field} <tr> <td>{$field.title}</td> - <td>{$field.name}</td> + <td><span class="description">{$field.name}</span></td> <td>{if ($field.weight && !is_numeric($field.weight))}{$field.weight}{/if}</td> <td> <a href="{crmURL p="civicrm/dataprocessor/form/field" q="reset=1&action=update&data_processor_id=`$field.data_processor_id`&id=`$field.id`"}">{ts}Edit{/ts}</a> diff --git a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Filters.tpl b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Filters.tpl index fab5d7e0c03b822311d1faa097c95264dcb7594a..27e44682925565718d0e4ef4d4a9cb560674265f 100644 --- a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Filters.tpl +++ b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Filters.tpl @@ -4,17 +4,22 @@ <table> <tr> <th>{ts}Title{/ts}</th> - <th>{ts}Name{/ts}</th> - <th>{ts}Required{/ts}</th> + <th>{ts}System name{/ts}</th> + <th></th> <th></th> <th></th> <th></th> </tr> {foreach from=$filters item=filter} <tr> - <td>{$filter.title}</td> - <td>{$filter.name}</td> - <td>{$filter.is_required}</td> + <td> + {$filter.title} + {if ($filter.is_required)} + <span class="crm-marker">*</span> + {/if} + </td> + <td><span class="description">{$filter.name}</span></td> + <td>{if ($filter.weight && !is_numeric($filter.weight))}{$filter.weight}{/if}</td> <td> {if $filter.configuration_link} <a href="{$filter.configuration_link}">{ts}Configure Filter{/ts}</a> diff --git a/templates/CRM/Dataprocessor/Form/Field.tpl b/templates/CRM/Dataprocessor/Form/Field.tpl index a5e57d7d900edc4b399f6cfe5b4f5217a992b7ba..c46b6b8912c2a2d4244adb5c38356db18e4b18a8 100644 --- a/templates/CRM/Dataprocessor/Form/Field.tpl +++ b/templates/CRM/Dataprocessor/Form/Field.tpl @@ -58,8 +58,6 @@ }); } }); - - $('#type').change(); }); {/literal} </script> diff --git a/templates/CRM/Dataprocessor/Form/Filter.tpl b/templates/CRM/Dataprocessor/Form/Filter.tpl index b3afbc13dee646a041b58b28b785946b746a53c4..039c96134470d9f7d66f24a07b7d16ec14694613 100644 --- a/templates/CRM/Dataprocessor/Form/Filter.tpl +++ b/templates/CRM/Dataprocessor/Form/Filter.tpl @@ -1,7 +1,4 @@ {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 *} @@ -9,11 +6,19 @@ <div class="crm-block crm-form-block crm-data-processor_label-block"> <div class="crm-section">{ts 1=$filter->title}Are you sure to delete filter '%1'?{/ts}</div> </div> -{else} + + <div class="crm-submit-buttons"> + {include file="CRM/common/formButtons.tpl" location="bottom"} + </div> +{elseif (!$snippet)} + + <div class="crm-submit-buttons"> + {include file="CRM/common/formButtons.tpl" location="top"} + </div> {* block for rule data *} <h3>{ts}Field{/ts}</h3> - <div class="crm-block crm-form-block crm-data-processor_source-block"> + <div class="crm-block crm-form-block crm-data-processor_filter-block"> <div class="crm-section"> <div class="label">{$form.type.label}</div> <div class="content">{$form.type.html}</div> @@ -21,10 +26,19 @@ </div> <div class="crm-section"> <div class="label">{$form.title.label}</div> - <div class="content">{$form.title.html}</div> + <div class="content"> + {$form.title.html} + <span class=""> + {ts}System name:{/ts} + <span id="systemName" style="font-style: italic;">{if ($filter)}{$filter.name}{/if}</span> + <a href="javascript:void(0);" onclick="jQuery('#nameSection').removeClass('hiddenElement'); jQuery(this).parent().addClass('hiddenElement'); return false;"> + {ts}Change{/ts} + </a> + </span> + </div> <div class="clear"></div> </div> - <div class="crm-section"> + <div id="nameSection" class="crm-section hiddenElement"> <div class="label">{$form.name.label}</div> <div class="content">{$form.name.html}</div> <div class="clear"></div> @@ -34,10 +48,55 @@ <div class="content">{$form.is_required.html}</div> <div class="clear"></div> </div> + + <div id="type_configuration"> + {if ($configuration_template)} + {include file=$configuration_template} + {/if} + </div> </div> -{/if} -<div class="crm-submit-buttons"> - {include file="CRM/common/formButtons.tpl" location="bottom"} -</div> + <script type="text/javascript"> + {literal} + CRM.$(function($) { + var id = {/literal}{if ($filter)}{$filter.id}{else}false{/if}{literal}; + var data_processor_id = {/literal}{$data_processor_id}{literal}; + + $('#type').on('change', function() { + var type = $('#type').val(); + if (type) { + var dataUrl = CRM.url('civicrm/dataprocessor/form/filter', {type: type, 'data_processor_id': data_processor_id, 'id': id}); + CRM.loadPage(dataUrl, {'target': '#type_configuration'}); + } + }); + + $('#title').on('blur', function() { + var title = $('#title').val(); + if ($('#nameSection').hasClass('hiddenElement') && !id) { + CRM.api3('DataProcessorFilter', 'check_name', { + 'title': title, + 'data_processor_id': data_processor_id + }).done(function (result) { + $('#systemName').html(result.name); + $('#name').val(result.name); + }); + } + }); + + $('#type').change(); + }); + {/literal} + </script> + + <div class="crm-submit-buttons"> + {include file="CRM/common/formButtons.tpl" location="bottom"} + </div> + +{else} + <div id="type_configuration"> + {if ($configuration_template)} + {include file=$configuration_template} + {/if} + </div> +{/if} {/crmScope} \ No newline at end of file diff --git a/templates/CRM/Dataprocessor/Form/Filter/SimpleFilter.tpl b/templates/CRM/Dataprocessor/Form/Filter/SimpleFilter.tpl deleted file mode 100644 index c623039c643226698db29c847952d64b60c1bf7f..0000000000000000000000000000000000000000 --- a/templates/CRM/Dataprocessor/Form/Filter/SimpleFilter.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{crmScope extensionKey='dataprocessor'} -<div class="crm-submit-buttons"> - {include file="CRM/common/formButtons.tpl" location="top"} -</div> - -<h3>{ts}Filter configuration{/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> - -<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/Filter/SimpleSqlFilter.tpl b/templates/CRM/Dataprocessor/Form/Filter/SimpleSqlFilter.tpl new file mode 100644 index 0000000000000000000000000000000000000000..699cd97b3d12abaf39898421ff8f7a18bd052863 --- /dev/null +++ b/templates/CRM/Dataprocessor/Form/Filter/SimpleSqlFilter.tpl @@ -0,0 +1,7 @@ +{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} \ No newline at end of file diff --git a/templates/CRM/Dataprocessor/Form/Output/UIOutput/CriteriaForm.tpl b/templates/CRM/Dataprocessor/Form/Output/UIOutput/CriteriaForm.tpl index 3330dd10d4dc564bd053bca698246e580ad474ad..b54cf9e8458bbbcb8f024d227e1d298a3eb3342e 100644 --- a/templates/CRM/Dataprocessor/Form/Output/UIOutput/CriteriaForm.tpl +++ b/templates/CRM/Dataprocessor/Form/Output/UIOutput/CriteriaForm.tpl @@ -17,7 +17,7 @@ {assign var=filterVal value=$filterName|cat:"_value"} {assign var=filterMin value=$filterName|cat:"_min"} {assign var=filterMax value=$filterName|cat:"_max"} - {if $filter.type == 'Date'} + {if $filter.type == 'Date' || $filter.type == 'Timestamp'} <tr> <td class="label">{$filter.title}</td> {include file="CRM/Dataprocessor/Form/Output/UIOutput/DateRange.tpl" fieldName=$filterName from='_from' to='_to'} diff --git a/xml/Menu/dataprocessor.xml b/xml/Menu/dataprocessor.xml index 327842c16b5c6f3c14cfc92a941876f1d679ef51..dad787ee27e87af68aa449e42d3f8686ddeacfec 100644 --- a/xml/Menu/dataprocessor.xml +++ b/xml/Menu/dataprocessor.xml @@ -42,13 +42,6 @@ <access_arguments>access CiviCRM</access_arguments> <access_arguments>administer CiviCRM</access_arguments> </item> - <item> - <path>civicrm/dataprocessor/form/filter/simplefilter</path> - <page_callback>CRM_Dataprocessor_Form_Filter_SimpleFilter</page_callback> - <title>DataProcessor</title> - <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> diff --git a/xml/schema/CRM/Dataprocessor/DataProcessorFilter.entityType.php b/xml/schema/CRM/Dataprocessor/DataProcessorFilter.entityType.php new file mode 100644 index 0000000000000000000000000000000000000000..b2f41a5efde3e2a201a88507b97c19ab78330bcd --- /dev/null +++ b/xml/schema/CRM/Dataprocessor/DataProcessorFilter.entityType.php @@ -0,0 +1,11 @@ +<?php +// This file declares a new entity type. For more details, see "hook_civicrm_entityTypes" at: +// http://wiki.civicrm.org/confluence/display/CRMDOC/Hook+Reference +return array ( + 0 => + array ( + 'name' => 'DataProcessorFilter', + 'class' => 'CRM_Dataprocessor_DAO_DataProcessorFilter', + 'table' => 'civicrm_data_processor_filter', + ), +); diff --git a/xml/schema/CRM/Dataprocessor/DataProcessorFilter.xml b/xml/schema/CRM/Dataprocessor/DataProcessorFilter.xml new file mode 100644 index 0000000000000000000000000000000000000000..1fed632bc30ab3e2576a1b2c6bcda7ab7e6666a4 --- /dev/null +++ b/xml/schema/CRM/Dataprocessor/DataProcessorFilter.xml @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="iso-8859-1" ?> + +<table> + <base>CRM/Dataprocessor</base> + <class>DataProcessorFilter</class> + <name>civicrm_data_processor_filter</name> + <log>false</log> + + <field> + <name>id</name> + <type>int unsigned</type> + <required>true</required> + <comment>Unique DataProcessorFilter ID</comment> + </field> + <primaryKey> + <name>id</name> + <autoincrement>true</autoincrement> + </primaryKey> + + <field> + <name>data_processor_id</name> + <title>Data Processor ID</title> + <type>int unsigned</type> + <required>true</required> + <comment>FK to Data Processor</comment> + </field> + <field> + <name>weight</name> + <title>Weight</title> + <type>int</type> + <required>false</required> + <length>255</length> + </field> + <field> + <name>name</name> + <title>Name</title> + <type>varchar</type> + <required>false</required> + <length>255</length> + </field> + <field> + <name>title</name> + <title>Title</title> + <type>varchar</type> + <required>true</required> + <length>255</length> + </field> + <field> + <name>type</name> + <title>Type</title> + <type>varchar</type> + <required>true</required> + <length>255</length> + </field> + <field> + <name>is_required</name> + <title>Is required</title> + <type>boolean</type> + <required>false</required> + <length>255</length> + </field> + <field> + <name>configuration</name> + <title>Configuration</title> + <type>text</type> + <required>false</required> + <length>255</length> + <serialize>JSON</serialize> + </field> + <foreignKey> + <name>data_processor_id</name> + <table>civicrm_data_processor</table> + <key>id</key> + <onDelete>CASCADE</onDelete> + </foreignKey> + +</table>