diff --git a/CRM/Dataprocessor/BAO/DataProcessor.php b/CRM/Dataprocessor/BAO/DataProcessor.php index 57625c534864d46622ce9e0beffe28660cc953ae..d06e4bd334d0819aea284db7759a7293decd6107 100644 --- a/CRM/Dataprocessor/BAO/DataProcessor.php +++ b/CRM/Dataprocessor/BAO/DataProcessor.php @@ -1,179 +1,30 @@ <?php -/** - * @author Jaap Jansma <jaap.jansma@civicoop.org> - * @license AGPL-3.0 - */ +use CRM_Dataprocessor_ExtensionUtil as E; class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProcessor { - static $importingDataProcessors = array(); - - /** - * Function to get values - * - * @return array $result found rows with data - * @access public - * @static - */ - public static function getValues($params) { - $result = array(); - $dataProcessor = new CRM_Dataprocessor_DAO_DataProcessor(); - if (!empty($params)) { - $fields = self::fields(); - foreach ($params as $key => $value) { - if (isset($fields[$key])) { - $dataProcessor->$key = $value; - } - } - } - $dataProcessor->find(); - 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; - } - - /** - * 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'); - } - - if (!empty($params['id'])) { - CRM_Utils_Hook::pre('edit', 'DataProcessor', $params['id'], $params); - } - else { - CRM_Utils_Hook::pre('create', 'DataProcessor', NULL, $params); - } - - $dataProcessor = new CRM_Dataprocessor_DAO_DataProcessor(); - $fields = self::fields(); - foreach ($params as $key => $value) { - if (isset($fields[$key])) { - $dataProcessor->$key = $value; - } - } - if (empty($dataProcessor->name) && !empty($dataProcessor->title)) { - $dataProcessor->name = self::buildNameFromTitle($dataProcessor->title); - } - if (empty($dataProcessor->type)) { - $dataProcessor->type = 'default'; - } - 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); - } - - $dataProcessor->save(); - self::storeValues($dataProcessor, $result); - CRM_Dataprocessor_BAO_DataProcessor::updateAndChekStatus($dataProcessor->id); - - if (!empty($params['id'])) { - CRM_Utils_Hook::post('edit', 'DataProcessor', $dataProcessor->id, $dataProcessor); - } - else { - CRM_Utils_Hook::post('create', 'DataProcessor', $dataProcessor->id, $dataProcessor); - } - - return $result; - } - - /** - * Function to delete a FormProcessorInstance 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'); + public static function checkName($title, $id=null,$name=null) { + if (!$name) { + $name = preg_replace('@[^a-z0-9_]+@','_',strtolower($title)); } - CRM_Utils_Hook::pre('delete', 'DataProcessor', $id, CRM_Core_DAO::$_nullArray); - - CRM_Dataprocessor_BAO_DataProcessorOutput::deleteWithDataProcessorId($id); - CRM_Dataprocessor_BAO_DataProcessorFilter::deleteWithDataProcessorId($id); - CRM_Dataprocessor_BAO_DataProcessorField::deleteWithDataProcessorId($id); - CRM_Dataprocessor_BAO_DataProcessorSource::deleteWithDataProcessorId($id); - - $dataProcessor = new CRM_Dataprocessor_DAO_DataProcessor(); - $dataProcessor->id = $id; - $dataProcessor->delete(); - - CRM_Utils_Hook::post('delete', 'DataProcessor', $id, CRM_Core_DAO::$_nullArray); + $name = preg_replace('@[^a-z0-9_]+@','_',strtolower($name)); + $name_part = $name; - return; - } - - /** - * Function to disable a data processor - * - * @param int $id - * @throws Exception when id is empty - * @access public - * @static - */ - public static function disable($id) { - if (empty($id)) { - throw new Exception('id can not be empty when attempting to disable a data processor'); + $sql = "SELECT COUNT(*) FROM `civicrm_data_processor` WHERE `name` = %1"; + $sqlParams[1] = array($name, 'String'); + if ($id) { + $sql .= " AND `id` != %2"; + $sqlParams[2] = array($id, 'Integer'); } - $dataProcessor = new CRM_Dataprocessor_BAO_DataProcessor(); - $dataProcessor->id = $id; - $dataProcessor->find(true); - self::add(array('id' => $dataProcessor->id, 'is_active' => 0)); - } - /** - * Function to enable a data processor - * - * @param int $id - * @throws Exception when id is empty - * @access public - * @static - */ - public static function enable($id) { - if (empty($id)) { - throw new Exception('id can not be empty when attempting to enable a data processor'); + $i = 1; + while(CRM_Core_DAO::singleValueQuery($sql, $sqlParams) > 0) { + $i++; + $name = $name_part .'_'.$i; + $sqlParams[1] = array($name, 'String'); } - $dataProcessor = new CRM_Dataprocessor_BAO_DataProcessor(); - $dataProcessor->id = $id; - $dataProcessor->find(true); - self::add(array('id' => $dataProcessor->id, 'is_active' => 1)); - } - - /** - * 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)); + return $name; } /** @@ -185,10 +36,6 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc * @static */ public static function isNameValid($name, $id=null) { - $invalidNames = array('getactions', 'getfields', 'get', 'create', 'delete'); - if (in_array(strtolower($name), $invalidNames)) { - return false; - } $sql = "SELECT COUNT(*) FROM `civicrm_data_processor` WHERE `name` = %1"; $params[1] = array($name, 'String'); if ($id) { @@ -202,282 +49,49 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc /** * Returns a configured data processor instance. * - * @param String $output_type - * @param String $name - * @return \Civi\DataProcessor\ProcessorType\AbstractProcessorType - * @throws \Exception when no data processor is found. - */ - public static function getDataProcessorById($id) { - $sql = " - SELECT civicrm_data_processor.* - FROM civicrm_data_processor - WHERE id = %1 - "; - $params[1] = [$id, 'Integer']; - $dao = CRM_Dataprocessor_BAO_DataProcessor::executeQuery($sql, $params, TRUE, 'CRM_Dataprocessor_BAO_DataProcessor'); - if ($dao->N != 1) { - throw new \Exception('Could not find Data Processor'); - } - $dao->fetch(); - return $dao->getDataProcessor(); - } - - /** - * Returns a configured data processor instance. - * - * @param String $output_type - * @param String $name - * @return \Civi\DataProcessor\ProcessorType\AbstractProcessorType - * @throws \Exception when no data processor is found. - */ - public static function getDataProcessorByOutputTypeAndName($output_type, $name) { - $sql = " - SELECT civicrm_data_processor.* - FROM civicrm_data_processor - INNER JOIN civicrm_data_processor_output ON civicrm_data_processor.id = civicrm_data_processor_output.data_processor_id - WHERE is_active = 1 AND civicrm_data_processor.name = %1 AND civicrm_data_processor_output.type = %2 - "; - $params[1] = array($name, 'String'); - $params[2] = array($output_type, 'String'); - $dao = CRM_Dataprocessor_BAO_DataProcessor::executeQuery($sql, $params, TRUE, 'CRM_Dataprocessor_BAO_DataProcessor'); - if ($dao->N != 1) { - throw new \Exception('Could not find Data Processor'); - } - $dao->fetch(); - return $dao->getDataProcessor(); - } - - /** - * Returns a configured data processor instance. - * + * @param array $dataProcessor * @return \Civi\DataProcessor\ProcessorType\AbstractProcessorType + * @throws \Exception */ - public function getDataProcessor() { + public static function dataProcessorToClass($dataProcessor) { $factory = dataprocessor_get_factory(); - $dataProcessor = $factory->getDataProcessorTypeByName($this->type); - $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $this->id, 'options' => array('limit' => 0))); + $dataProcessorClass = $factory->getDataProcessorTypeByName($dataProcessor['type']); + $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $dataProcessor['id'], 'options' => array('limit' => 0))); foreach($sources['values'] as $sourceDao) { - CRM_Dataprocessor_BAO_DataProcessorSource::addSourceToDataProcessor($sourceDao, $dataProcessor); + CRM_Dataprocessor_BAO_DataProcessorSource::addSourceToDataProcessor($sourceDao, $dataProcessorClass); } - $aggregationFields = CRM_Dataprocessor_BAO_DataProcessor::getAvailableAggregationFields($this->id); - if (is_string($this->aggregation)) { - $this->aggregation = json_decode($this->aggregation, true); - } - if (!is_array($this->aggregation)) { - $this->aggregation = array(); + $aggregationFields = array(); + foreach($dataProcessorClass->getDataSources() as $source) { + $aggregationFields = array_merge($aggregationFields, $source->getAvailableAggregationFields()); } - foreach($this->aggregation as $alias) { - $dataSource = $dataProcessor->getDataSourceByName($aggregationFields[$alias]->dataSource->getSourceName()); + foreach($dataProcessor['aggregation'] as $alias) { + $dataSource = $dataProcessorClass->getDataSourceByName($aggregationFields[$alias]->dataSource->getSourceName()); if ($dataSource) { $dataSource->ensureAggregationFieldInSource($aggregationFields[$alias]->fieldSpecification); } } - $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $this->id, 'options' => array('limit' => 0))); + $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $dataProcessor['id'], 'options' => array('limit' => 0))); foreach($filters['values'] as $filter) { $filterHandler = $factory->getFilterByName($filter['type']); if ($filterHandler) { - $filterHandler->setDataProcessor($dataProcessor); + $filterHandler->setDataProcessor($dataProcessorClass); $filterHandler->initialize($filter['name'], $filter['title'], $filter['is_required'], $filter['configuration']); - $dataProcessor->addFilterHandler($filterHandler); + $dataProcessorClass->addFilterHandler($filterHandler); } } - $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $this->id, 'options' => array('limit' => 0))); - $outputHandlers = $dataProcessor->getAvailableOutputHandlers(); + $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $dataProcessor['id'], 'options' => array('limit' => 0))); + $outputHandlers = $dataProcessorClass->getAvailableOutputHandlers(); foreach($fields['values'] as $field) { if (isset($outputHandlers[$field['type']])) { $outputHandler = $outputHandlers[$field['type']]; $outputHandler->initialize($field['name'], $field['title'], $field['configuration']); - $dataProcessor->addOutputFieldHandlers($outputHandler); - } - } - return $dataProcessor; - } - - public static function getAvailableOutputHandlers($data_processor_id) { - $dao = new CRM_Dataprocessor_BAO_DataProcessor(); - $dao->id = $data_processor_id; - $dao->find(true); - $factory = dataprocessor_get_factory(); - $dataProcessor = $factory->getDataProcessorTypeByName($dao->type); - $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0))); - foreach($sources['values'] as $sourceDao) { - CRM_Dataprocessor_BAO_DataProcessorSource::addSourceToDataProcessor($sourceDao, $dataProcessor); - } - - return $dataProcessor->getAvailableOutputHandlers(); - } - - public static function getAvailableFilterHandlers($data_processor_id) { - $dao = new CRM_Dataprocessor_BAO_DataProcessor(); - $dao->id = $data_processor_id; - $dao->find(true); - $factory = dataprocessor_get_factory(); - $dataProcessor = $factory->getDataProcessorTypeByName($dao->type); - $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $dao->id, 'options' => array('limit' => 0))); - foreach($sources['values'] as $sourceDao) { - CRM_Dataprocessor_BAO_DataProcessorSource::addSourceToDataProcessor($sourceDao, $dataProcessor); - } - - return $dataProcessor->getAvailableFilterHandlers(); - } - - /** - * Returns an array with all available fields for aggregation - * - * @param $data_processor_id - * - * @return array - */ - public static function getAvailableAggregationFields($data_processor_id) { - $availableAggregationFields = array(); - $dao = new CRM_Dataprocessor_BAO_DataProcessor(); - $dao->id = $data_processor_id; - $dao->find(true); - $factory = dataprocessor_get_factory(); - $dataProcessor = $factory->getDataProcessorTypeByName($dao->type); - $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $dao->id, 'options' => array('limit' => 0))); - foreach($sources['values'] as $sourceDao) { - $source = CRM_Dataprocessor_BAO_DataProcessorSource::sourceToSourceClass($sourceDao); - $availableAggregationFields = array_merge($availableAggregationFields, $source->getAvailableAggregationFields()); - } - - return $availableAggregationFields; - } - - /** - * Returns the id of the data processor. - * - * @param string $dataProcessorName - * The name of the data processor. - * @return int - * The id of the data processor. - */ - public static function getId($dataProcessorName) { - $sql = "SELECT `id` FROM `civicrm_data_processor` WHERE `name` = %1"; - $params[1] = array($dataProcessorName, 'String'); - $id = CRM_Core_DAO::singleValueQuery($sql, $params); - return $id; - } - - /** - * Returns the status of the data processor. - * @See CRM_Dataprocessor_DAO_DataProcessor for possible values. - * - * @param string $dataProcessorName - * The name of the data processor. - * @return int - * The status of the data processor. - */ - public static function getStatus($dataProcessorName) { - $sql = "SELECT `status` FROM `civicrm_data_processor` WHERE `name` = %1"; - $params[1] = array($dataProcessorName, 'String'); - $status = CRM_Core_DAO::singleValueQuery($sql, $params); - return $status; - } - - /** - * Update the status from in code to overriden when a data processor has been changed - * - * @param $dataProcessorId - */ - public static function updateAndChekStatus($dataProcessorId) { - $sql = "SELECT `status`, `name` FROM `civicrm_data_processor` WHERE `id` = %1"; - $params[1] = array($dataProcessorId, 'Integer'); - $dao = CRM_Core_DAO::executeQuery($sql, $params); - if ($dao->fetch()) { - if (!in_array($dao->name, self::$importingDataProcessors) && $dao->status == self::STATUS_IN_CODE) { - $sql = "UPDATE `civicrm_data_processor` SET `status` = %2 WHERE `id` = %1"; - $params[1] = array($dataProcessorId, 'String'); - $params[2] = array(self::STATUS_OVERRIDDEN, 'Integer'); - CRM_Core_DAO::executeQuery($sql, $params); + $dataProcessorClass->addOutputFieldHandlers($outputHandler); } } - } - - /** - * Store the data processor name so we know that we are importing this data processor - * and should not update its status on the way. - * - * @param $dataProcessorName - */ - public static function setDataProcessorToImportingState($dataProcessorName) { - self::$importingDataProcessors[] = $dataProcessorName; - } - - /** - * Updates the status and source file of the data processor. - * @See CRM_Dataprocessor_DAO_DataProcessor for possible status values. - * - * @param string $dataProcessorName - * The name of the data processor. - * @param int $status - * The status value. - * @param string $source_file - * The source file. Leave empty when status is IN_DATABASE. - */ - public static function setStatusAndSourceFile($dataProcessorName, $status, $source_file) { - $sql = "UPDATE `civicrm_data_processor` SET `status` = %2, `source_file` = %3 WHERE `name` = %1"; - $params[1] = array($dataProcessorName, 'String'); - $params[2] = array($status, 'Integer'); - $params[3] = array($source_file, 'String'); - CRM_Core_DAO::executeQuery($sql, $params); - } - - /** - * Exports a data processor - * - * Returns the array with the whole configuration. - * - * @param $id - * @return array - */ - public static function export($id) { - $dataProcessors = self::getValues(array('id' => $id)); - if (!isset($dataProcessors[$id])) { - return array(); - } - $dataProcessor = $dataProcessors[$id]; - unset($dataProcessor['id']); - unset($dataProcessor['status']); - unset($dataProcessor['source_file']); - - $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0))); - $dataProcessor['data_sources'] = array(); - foreach($sources['values'] as $i => $datasource) { - unset($datasource['id']); - unset($datasource['data_processor_id']); - $dataProcessor['data_sources'][] = $datasource; - } - $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0))); - $dataProcessor['filters'] = array(); - foreach($filters['values'] as $i => $filter) { - unset($filter['id']); - unset($filter['data_processor_id']); - $dataProcessor['filters'][] = $filter; - } - $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0))); - $dataProcessor['fields'] = array(); - foreach($fields['values'] as $i => $field) { - unset($field['id']); - unset($field['data_processor_id']); - $dataProcessor['fields'][] = $field; - } - $outputs = $outputs = civicrm_api3('DataProcessorOutput', 'get', array('data_processor_id' => $id, 'options' => array('limit' => 0))); - $dataProcessor['outputs'] = array(); - foreach($outputs['values'] as $i => $output) { - unset($output['id']); - unset($output['data_processor_id']); - $dataProcessor['outputs'][] = $output; - } - - $eventData['data_processor'] = &$dataProcessor; - $event = \Civi\Core\Event\GenericHookEvent::create($eventData); - \Civi::dispatcher()->dispatch('hook_civicrm_dataprocessor_export', $event); - - return $dataProcessor; + return $dataProcessorClass; } /** @@ -488,7 +102,7 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc if (!$dao->fetch()) { return false; } - if ($dao->status != CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN) { + if ($dao->status != CRM_Dataprocessor_Status::STATUS_OVERRIDDEN) { return false; } $key = substr($dao->source_file, 0, stripos($dao->source_file, "/")); @@ -497,8 +111,8 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc $data = file_get_contents($filename); $data = json_decode($data, true); - CRM_Dataprocessor_Utils_Importer::importDataProcessor($data, $dao->source_file, $data_processor_id); + CRM_Dataprocessor_Utils_Importer::importDataProcessor($data, $dao->source_file, $data_processor_id, CRM_Dataprocessor_Status::STATUS_IN_CODE); return true; } -} \ No newline at end of file +} diff --git a/CRM/Dataprocessor/BAO/DataProcessorField.php b/CRM/Dataprocessor/BAO/DataProcessorField.php index f6a45fd2f5db66a1474b6d497a385b90e2802ab5..3a2806e5f32e340f662ece38af2a7f401f6c7be7 100644 --- a/CRM/Dataprocessor/BAO/DataProcessorField.php +++ b/CRM/Dataprocessor/BAO/DataProcessorField.php @@ -14,7 +14,7 @@ class CRM_Dataprocessor_BAO_DataProcessorField extends CRM_Dataprocessor_DAO_Dat $sql = "SELECT COUNT(*) FROM `civicrm_data_processor_field` WHERE `name` = %1 AND `data_processor_id` = %2"; $sqlParams[1] = array($name, 'String'); $sqlParams[2] = array($data_processor_id, 'String'); - if (isset($id)) { + if ($id) { $sql .= " AND `id` != %3"; $sqlParams[3] = array($id, 'Integer'); } diff --git a/CRM/Dataprocessor/BAO/DataProcessorFilter.php b/CRM/Dataprocessor/BAO/DataProcessorFilter.php index 12aefe4cd743f88cef5e0b03a64a0a4802dc9936..88b0d039aaa75962e906e8c99a976032b29c96cd 100644 --- a/CRM/Dataprocessor/BAO/DataProcessorFilter.php +++ b/CRM/Dataprocessor/BAO/DataProcessorFilter.php @@ -14,7 +14,7 @@ class CRM_Dataprocessor_BAO_DataProcessorFilter extends CRM_Dataprocessor_DAO_Da $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)) { + if ($id) { $sql .= " AND `id` != %3"; $sqlParams[3] = array($id, 'Integer'); } diff --git a/CRM/Dataprocessor/BAO/DataProcessorSource.php b/CRM/Dataprocessor/BAO/DataProcessorSource.php index 13f30d96811eb930cb79bca35481e0ed4bc05a8c..83b201ee0c25e4bce47592f2e135442b8a5903d1 100644 --- a/CRM/Dataprocessor/BAO/DataProcessorSource.php +++ b/CRM/Dataprocessor/BAO/DataProcessorSource.php @@ -14,7 +14,7 @@ class CRM_Dataprocessor_BAO_DataProcessorSource extends CRM_Dataprocessor_DAO_Da $sql = "SELECT COUNT(*) FROM `civicrm_data_processor_source` WHERE `name` = %1 AND `data_processor_id` = %2"; $sqlParams[1] = array($name, 'String'); $sqlParams[2] = array($data_processor_id, 'String'); - if (isset($id)) { + if ($id) { $sql .= " AND `id` != %3"; $sqlParams[3] = array($id, 'Integer'); } diff --git a/CRM/Dataprocessor/DAO/DataProcessor.php b/CRM/Dataprocessor/DAO/DataProcessor.php index b21b9f076da5e00985c99e8f1c18703a11d25d18..cb6c049e427de40543ea85579090642318f00c58 100644 --- a/CRM/Dataprocessor/DAO/DataProcessor.php +++ b/CRM/Dataprocessor/DAO/DataProcessor.php @@ -1,137 +1,316 @@ <?php -use CRM_Dataprocessor_ExtensionUtil as E; +/** + * @package CRM + * @copyright CiviCRM LLC (c) 2004-2019 + * + * Generated from /buildkit/build/search/sites/default/files/civicrm/ext/dataprocessor/xml/schema/CRM/Dataprocessor/DataProcessor.xml + * DO NOT EDIT. Generated by CRM_Core_CodeGen + * (GenCodeChecksum:28cee8d17fc4e4fca4b21a0b4dbf17ff) + */ /** - * @author Jaap Jansma (CiviCooP) <jaap.jansma@civicoop.org> - * @license http://www.gnu.org/licenses/agpl-3.0.html + * Database access object for the DataProcessor entity. */ class CRM_Dataprocessor_DAO_DataProcessor extends CRM_Core_DAO { - const STATUS_IN_DATABASE = 1; - const STATUS_IN_CODE = 2; - const STATUS_OVERRIDDEN = 3; + /** + * Static instance to hold the table name. + * + * @var string + */ + static $_tableName = 'civicrm_data_processor'; + + /** + * Should CiviCRM log any modifications to this table in the civicrm_log table. + * + * @var bool + */ + static $_log = FALSE; /** - * static instance to hold the field values + * Unique DataProcessor ID * - * @var array - * @static + * @var int unsigned */ - static $_fields = null; - static $_export = null; + public $id; + /** - * empty definition for virtual function + * @var string */ - static function getTableName() { - return 'civicrm_data_processor'; + public $name; + + /** + * @var string + */ + public $title; + + /** + * @var string + */ + public $type; + + /** + * @var text + */ + public $configuration; + + /** + * @var text + */ + public $aggregation; + + /** + * @var boolean + */ + public $is_active; + + /** + * @var text + */ + public $description; + + /** + * @var string + */ + public $storage_type; + + /** + * @var text + */ + public $storage_configuration; + + /** + * @var int unsigned + */ + public $status; + + /** + * @var string + */ + public $source_file; + + /** + * Class constructor. + */ + public function __construct() { + $this->__table = 'civicrm_data_processor'; + parent::__construct(); } + /** - * returns all the column names of this table + * Returns all the column names of this table * - * @access public * @return array */ public static function &fields() { - if (!(self::$_fields)) { - self::$_fields = array( - 'id' => array( + if (!isset(Civi::$statics[__CLASS__]['fields'])) { + Civi::$statics[__CLASS__]['fields'] = [ + 'id' => [ 'name' => 'id', - 'title' => E::ts('ID'), 'type' => CRM_Utils_Type::T_INT, - 'required' => true - ) , - 'type' => array( - 'name' => 'type', - 'title' => E::ts('Type'), - 'type' => CRM_Utils_Type::T_STRING, - 'maxlength' => 80, - 'required' => true, - ), - 'name' => array( + 'description' => CRM_Dataprocessor_ExtensionUtil::ts('Unique DataProcessor ID'), + 'required' => TRUE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + ], + 'name' => [ 'name' => 'name', - 'title' => E::ts('Name'), 'type' => CRM_Utils_Type::T_STRING, - 'maxlength' => 128, - 'required' => true - ), - 'title' => array( + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Name'), + 'required' => FALSE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + ], + 'title' => [ 'name' => 'title', - 'title' => E::ts('Title'), 'type' => CRM_Utils_Type::T_STRING, - 'maxlength' => 128, - 'required' => true - ), - 'is_active' => array( - 'name' => 'is_active', - 'title' => E::ts('Is active'), - 'type' => CRM_Utils_Type::T_INT, - ), - 'description' => array( - 'name' => 'description', - 'title' => E::ts('Description'), + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Title'), + 'required' => TRUE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + ], + 'type' => [ + 'name' => 'type', 'type' => CRM_Utils_Type::T_STRING, - ), - 'configuration' => array( + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Type'), + 'required' => TRUE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + ], + 'configuration' => [ 'name' => 'configuration', - 'title' => E::ts('Configuration'), 'type' => CRM_Utils_Type::T_TEXT, - ), - 'aggregation' => array( + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Configuration'), + 'required' => FALSE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + 'serialize' => self::SERIALIZE_JSON, + ], + 'aggregation' => [ 'name' => 'aggregation', - 'title' => E::ts('Aggregation'), 'type' => CRM_Utils_Type::T_TEXT, - ), - 'storage_type' => array( + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Aggregation Fields'), + 'required' => FALSE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + 'serialize' => self::SERIALIZE_JSON, + ], + 'is_active' => [ + 'name' => 'is_active', + 'type' => CRM_Utils_Type::T_BOOLEAN, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Is active'), + 'required' => TRUE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + ], + 'description' => [ + 'name' => 'description', + 'type' => CRM_Utils_Type::T_TEXT, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Description'), + 'required' => FALSE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + ], + 'storage_type' => [ 'name' => 'storage_type', - 'title' => E::ts('Storage Type'), 'type' => CRM_Utils_Type::T_STRING, - 'maxlength' => 80, - 'required' => true, - ), - 'storage_configuration' => array( + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Storage Type'), + 'required' => FALSE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + ], + 'storage_configuration' => [ 'name' => 'storage_configuration', - 'title' => E::ts('Storage Configuration'), 'type' => CRM_Utils_Type::T_TEXT, - ), - 'status' => array( + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Storage Configuration'), + 'required' => FALSE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + 'serialize' => self::SERIALIZE_JSON, + ], + 'status' => [ 'name' => 'status', 'type' => CRM_Utils_Type::T_INT, - ), - 'source_file' => array( + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Status'), + 'required' => FALSE, + 'default' => '0', + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + ], + 'source_file' => [ 'name' => 'source_file', - 'title' => E::ts('Source file'), 'type' => CRM_Utils_Type::T_STRING, + 'title' => CRM_Dataprocessor_ExtensionUtil::ts('Source File'), + 'required' => FALSE, 'maxlength' => 255, - 'required' => false, - ), - ); + 'size' => CRM_Utils_Type::HUGE, + 'table_name' => 'civicrm_data_processor', + 'entity' => 'DataProcessor', + 'bao' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'localizable' => 0, + ], + ]; + CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']); } - return self::$_fields; + return Civi::$statics[__CLASS__]['fields']; } + /** - * Returns an array containing, for each field, the array key used for that - * field in self::$_fields. + * Return a mapping from field-name to the corresponding key (as used in fields()). * - * @access public * @return array + * Array(string $name => string $uniqueName). */ public static function &fieldKeys() { - if (!(self::$_fieldKeys)) { - self::$_fieldKeys = array( - 'id' => 'id', - 'type' => 'type', - 'name' => 'name', - 'title' => 'title', - 'is_active' => 'is_active', - 'description' => 'description', - 'configuration' => 'configuration', - 'storage_type' => 'storage_type', - 'storage_configuration' => 'storage_configuration', - 'status' => 'status', - 'source_file' => 'source_file', - ); + if (!isset(Civi::$statics[__CLASS__]['fieldKeys'])) { + Civi::$statics[__CLASS__]['fieldKeys'] = array_flip(CRM_Utils_Array::collect('name', self::fields())); } - return self::$_fieldKeys; + 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; } -} \ No newline at end of file + + /** + * 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', $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', $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/Form/DataProcessor.php b/CRM/Dataprocessor/Form/DataProcessor.php index 1b3442e2216004cbbdba3606411a34ae1aba8134..ed627c30de4eebbfb10fc5c39eed265cabe4f178 100644 --- a/CRM/Dataprocessor/Form/DataProcessor.php +++ b/CRM/Dataprocessor/Form/DataProcessor.php @@ -11,6 +11,13 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { private $dataProcessorId; + private $dataProcessor; + + /** + * @var \Civi\DataProcessor\ProcessorType\AbstractProcessorType + */ + private $dataProcessorClass; + private $currentUrl; /** @@ -26,12 +33,12 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { $session = CRM_Core_Session::singleton(); switch($this->_action) { case CRM_Core_Action::DISABLE: - CRM_Dataprocessor_BAO_DataProcessor::disable($this->dataProcessorId); + civicrm_api3('DataProcessor', 'create', array('id' => $this->dataProcessorId, 'is_active' => 0)); $session->setStatus('Data Processor disabled', 'Disable', 'success'); CRM_Utils_System::redirect($session->readUserContext()); break; case CRM_Core_Action::ENABLE: - CRM_Dataprocessor_BAO_DataProcessor::enable($this->dataProcessorId); + civicrm_api3('DataProcessor', 'create', array('id' => $this->dataProcessorId, 'is_active' => 1)); $session->setStatus('Data Processor enabled', 'Enable', 'success'); CRM_Utils_System::redirect($session->readUserContext()); break; @@ -41,11 +48,14 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { CRM_Utils_System::redirect($session->readUserContext()); break; case CRM_Core_Action::EXPORT: - $this->assign('export', json_encode(CRM_Dataprocessor_BAO_DataProcessor::export($this->dataProcessorId), JSON_PRETTY_PRINT)); + $this->assign('export', json_encode(CRM_Dataprocessor_Utils_Importer::export($this->dataProcessorId), JSON_PRETTY_PRINT)); break; } if ($this->dataProcessorId) { + $this->dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $this->dataProcessorId)); + $this->dataProcessorClass = CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($this->dataProcessor); + $this->assign('dataProcessor', $this->dataProcessor); $this->addSources(); $this->addFields(); $this->addFilters(); @@ -95,14 +105,14 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { } 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; + foreach($this->dataProcessorClass->getDataSources() as $dataSource) { + foreach($dataSource->getAvailableAggregationFields() 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']; + $aggregation = $this->dataProcessor['aggregation']; + $fields = array(); foreach($aggregation as $alias) { $fields[$alias] = $aggregationFieldsFormatted[$alias]; } @@ -176,7 +186,7 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { public function postProcess() { $session = CRM_Core_Session::singleton(); if ($this->_action == CRM_Core_Action::DELETE) { - CRM_Dataprocessor_BAO_DataProcessor::deleteWithId($this->dataProcessorId); + civicrm_api3('DataProcessor', 'delete', array('id' => $this->dataProcessorId)); $session->setStatus(E::ts('Data Processor removed'), E::ts('Removed'), 'success'); $redirectUrl = $session->popUserContext(); CRM_Utils_System::redirect($redirectUrl); @@ -191,7 +201,7 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { $params['id'] = $this->dataProcessorId; } - $result = CRM_Dataprocessor_BAO_DataProcessor::add($params); + $result = civicrm_api3('DataProcessor', 'create', $params); $redirectUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/edit', array('reset' => 1, 'action' => 'update', 'id' => $result['id'])); CRM_Utils_System::redirect($redirectUrl); } @@ -227,18 +237,17 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { * @access protected */ protected function setUpdateDefaults(&$defaults) { - $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId)); - if (!empty($dataProcessor) && !empty($this->dataProcessorId)) { - $defaults['title'] = $dataProcessor[$this->dataProcessorId]['title']; - if (isset($dataProcessor[$this->dataProcessorId]['name'])) { - $defaults['name'] = $dataProcessor[$this->dataProcessorId]['name']; + if (!empty($this->dataProcessor) && !empty($this->dataProcessorId)) { + $defaults['title'] = $this->dataProcessor['title']; + if (isset($this->dataProcessor['name'])) { + $defaults['name'] = $this->dataProcessor['name']; } - if (isset($dataProcessor[$this->dataProcessorId]['description'])) { - $defaults['description'] = $dataProcessor[$this->dataProcessorId]['description']; + if (isset($this->dataProcessor['description'])) { + $defaults['description'] = $this->dataProcessor['description']; } else { $defaults['description'] = ''; } - $defaults['is_active'] = $dataProcessor[$this->dataProcessorId]['is_active']; + $defaults['is_active'] = $this->dataProcessor['is_active']; } } @@ -258,9 +267,9 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form { $id = $fields['id']; } if (empty($fields['name'])) { - $fields['name'] = CRM_Dataprocessor_BAO_DataProcessor::buildNameFromTitle($fields['title']); + $fields['name'] = CRM_Dataprocessor_BAO_DataProcessor::checkName($fields['title'], $id); } - if (!CRM_Dataprocessor_BAO_DataProcessor::isNameValid($fields['name'], $id)) { + if (!CRM_Dataprocessor_BAO_DataProcessorSource::isNameValid($fields['name'], $id)) { $errors['name'] = E::ts('There is already a data processor with this name'); return $errors; } diff --git a/CRM/Dataprocessor/Form/Import.php b/CRM/Dataprocessor/Form/Import.php index 039c4d50bb9517b902bbfe43917a2b6ddf992c5d..54d39d3d34b4053921e6cb5ca151c6ee409debdf 100644 --- a/CRM/Dataprocessor/Form/Import.php +++ b/CRM/Dataprocessor/Form/Import.php @@ -29,7 +29,7 @@ class CRM_Dataprocessor_Form_Import extends CRM_Core_Form { public function postProcess() { $values = $this->exportValues(); $importCode = json_decode($values['code'], true); - $importResult = CRM_Dataprocessor_Utils_Importer::import($importCode, ''); + $importResult = CRM_Dataprocessor_Utils_Importer::import($importCode, '', true); CRM_Core_Session::setStatus(E::ts('Imported data processor'), '', 'success'); diff --git a/CRM/Dataprocessor/Form/Join/Simple.php b/CRM/Dataprocessor/Form/Join/Simple.php deleted file mode 100644 index e4c4d0c99f0dd1139ec99a57062c0e4ee7dc91e0..0000000000000000000000000000000000000000 --- a/CRM/Dataprocessor/Form/Join/Simple.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php - -use CRM_Dataprocessor_ExtensionUtil as E; - -/** - * Form controller class - * - * @see https://wiki.civicrm.org/confluence/display/CRMDOC/QuickForm+Reference - */ -class CRM_Dataprocessor_Form_Join_Simple extends CRM_Core_Form { - - private $dataProcessorId; - - private $source_id; - - /** - * Function to perform processing before displaying form (overrides parent function) - * - * @access public - */ - function preProcess() { - $this->dataProcessorId = CRM_Utils_Request::retrieve('data_processor_id', 'Integer'); - $this->assign('data_processor_id', $this->dataProcessorId); - - $this->source_id = CRM_Utils_Request::retrieve('source_id', 'Integer', CRM_Core_DAO::$_nullObject, TRUE); - $this->assign('source_id', $this->source_id); - - $source = CRM_Dataprocessor_BAO_Source::getValues(array('id' => $this->source_id)); - $this->assign('source', $source[$this->source_id]); - - $title = E::ts('Data Processor Source Join Conifuration'); - CRM_Utils_System::setTitle($title); - } - - public function buildQuickForm() { - $this->add('hidden', 'data_processor_id'); - $this->add('hidden', 'source_id'); - - $fields = $this->buildFieldList(); - - $this->add('select', 'left_field', ts('Select field'), $fields, true, array( - 'style' => 'min-width:250px', - 'class' => 'crm-select2 huge', - 'placeholder' => E::ts('- select -'), - )); - $this->add('select', 'right_field', ts('Select field'), $fields, true, array( - 'style' => 'min-width:250px', - 'class' => 'crm-select2 huge', - 'placeholder' => E::ts('- select -'), - )); - - 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 { - $this->addButtons(array( - array('type' => 'next', 'name' => E::ts('Save'), 'isDefault' => TRUE,), - array('type' => 'cancel', 'name' => E::ts('Cancel')))); - } - parent::buildQuickForm(); - } - - function setDefaultValues() { - $defaults = []; - $defaults['data_processor_id'] = $this->dataProcessorId; - $defaults['source_id'] = $this->source_id; - - $source = CRM_Dataprocessor_BAO_Source::getValues(array('id' => $this->source_id)); - if (isset($source[$this->source_id]['join_configuration']['left_prefix'])) { - $defaults['left_field'] = $source[$this->source_id]['join_configuration']['left_prefix'].".".$source[$this->source_id]['join_configuration']['left_field']; - } - if (isset($source[$this->source_id]['join_configuration']['right_prefix'])) { - $defaults['right_field'] = $source[$this->source_id]['join_configuration']['right_prefix'].".".$source[$this->source_id]['join_configuration']['right_field']; - } - - return $defaults; - } - - public function postProcess() { - $session = CRM_Core_Session::singleton(); - - $values = $this->exportValues(); - list($left_prefix, $left_field) = explode(".",$values['left_field'], 2); - list($right_prefix, $right_field) = explode(".",$values['right_field'], 2); - - $params['join_configuration'] = array( - 'left_prefix' => $left_prefix, - 'left_field' => $left_field, - 'right_prefix' => $right_prefix, - 'right_field' => $right_field - ); - if ($this->dataProcessorId) { - $params['data_processor_id'] = $this->dataProcessorId; - } - if ($this->source_id) { - $params['id'] = $this->source_id; - } - CRM_Dataprocessor_BAO_Source::add($params); - CRM_Utils_System::redirect($session->readUserContext()); - parent::postProcess(); - } - - function buildFieldList() { - $factory = dataprocessor_get_factory(); - $fields = array(); - $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($this->dataProcessorId); - $sources = CRM_Dataprocessor_BAO_Source::getValues(array('data_processor_id' => $this->dataProcessorId)); - foreach($sources as $source) { - $sourceClass = $factory->getDataSourceByName($source['type']); - $sourceClass->setDataProcessor($dataProcessor); - $sourceClass->initialize($source['configuration'], $source['name']); - $sourceFields = $sourceClass->getAvailableFields()->getFields(); - foreach($sourceFields as $sourceField) { - $fields[$source['name'] . '.' . $sourceField->name] = $source['title'] . ' :: ' . $sourceField->title; - } - - if ($source['id'] == $this->source_id) { - break; - } - } - asort($fields); - return $fields; - } - -} \ No newline at end of file diff --git a/CRM/Dataprocessor/Form/ManageDataProcessors.php b/CRM/Dataprocessor/Form/ManageDataProcessors.php index f03174ec62c45cb4e1aee24eea9184390eb21f46..5d5c8c7ccee63692b8d46507777ad22327a95bca 100644 --- a/CRM/Dataprocessor/Form/ManageDataProcessors.php +++ b/CRM/Dataprocessor/Form/ManageDataProcessors.php @@ -15,38 +15,24 @@ class CRM_Dataprocessor_Form_ManageDataProcessors extends CRM_Core_Form { $this->setTitle(E::ts('Manage Data Processors')); - $whereClauses = array("1"); + $apiParams = array(); if (isset($formValues['title']) && !empty($formValues['title'])) { - $whereClauses[] = "`title` LIKE '%". CRM_Utils_Type::escape($formValues['title'], 'String')."%'"; + $apiParams['title']['LIKE'] = $formValues['title']; } if (isset($formValues['description']) && !empty($formValues['description'])) { - $whereClauses[] = "`description` LIKE '%". CRM_Utils_Type::escape($formValues['description'], 'String')."%'"; + $apiParams['description']['LIKE'] = $formValues['description']; } if (isset($formValues['is_active']) && $formValues['is_active'] == '0') { - $whereClauses[] = "`is_active` = 0"; + $apiParams['is_active'] = 0; } elseif (isset($formValues['is_active']) && $formValues['is_active'] == '1') { - $whereClauses[] = "`is_active` = 1"; + $apiParams['is_active'] = 1; } + $apiParams['options']['limit'] = 0; + $dataProcessors = civicrm_api3('DataProcessor', 'get', $apiParams); + $dataProcessors = $dataProcessors['values']; - $whereStatement = implode(" AND ", $whereClauses); - $sql = "SELECT * FROM civicrm_data_processor WHERE {$whereStatement} ORDER BY is_active, title"; - $dataProcessors = array(); - $dao = CRM_Core_DAO::executeQuery($sql, array(), false, 'CRM_Dataprocessor_DAO_DataProcessor'); - while($dao->fetch()) { - $row = array(); - CRM_Dataprocessor_DAO_DataProcessor::storeValues($dao, $row); - switch ($row['status']) { - case CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_CODE: - $row['status_label'] = E::ts('In code'); - break; - case CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN: - $row['status_label'] = E::ts('Overridden'); - break; - case CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_DATABASE: - $row['status_label'] = E::ts('In database'); - break; - } - $dataProcessors[] = $row; + foreach($dataProcessors as $idx => $dataProcessor) { + $dataProcessors[$idx]['status_label'] = CRM_Dataprocessor_Status::statusToLabel($dataProcessor['status']); } $this->assign('data_processors', $dataProcessors); diff --git a/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php b/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php index e38fe3519aa0a1a95975c92304b1b4d8012441fc..27a04c7cd9a55d0feea5257273a89e5cd75856e9 100644 --- a/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php +++ b/CRM/Dataprocessor/Form/Output/AbstractUIOutputForm.php @@ -9,19 +9,19 @@ use CRM_Dataprocessor_ExtensionUtil as E; abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Core_Form_Search { /** - * @var \Civi\DataProcessor\ProcessorType\AbstractProcessorType; + * @var array */ protected $dataProcessor; /** - * @var int + * @var \Civi\DataProcessor\ProcessorType\AbstractProcessorType; */ - protected $dataProcessorId; + protected $dataProcessorClass; /** - * @var array + * @var int */ - protected $dataProcessorBAO; + protected $dataProcessorId; /** * @var \CRM_Dataprocessor_BAO_Output @@ -74,11 +74,10 @@ abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Co if (!$dao->fetch()) { throw new \Exception('Could not find Data Processor "' . $dataProcessorName.'"'); } - $this->dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dao->data_processor_id); - $this->dataProcessorId = $dao->data_processor_id; - $dataProcessorBAO = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId)); - $this->dataProcessorBAO = $dataProcessorBAO[$this->dataProcessorId]; + $this->dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dao->data_processor_id)); + $this->dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($this->dataProcessor); + $this->dataProcessorId = $dao->data_processor_id; $output = CRM_Dataprocessor_BAO_Output::getValues(['id' => $dao->output_id]); $this->dataProcessorOutput = $output[$dao->output_id]; @@ -96,8 +95,8 @@ abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Co * @return bool */ protected function hasRequiredFilters() { - if ($this->dataProcessor->getFilterHandlers()) { - foreach ($this->dataProcessor->getFilterHandlers() as $filter) { + if ($this->dataProcessorClass->getFilterHandlers()) { + foreach ($this->dataProcessorClass->getFilterHandlers() as $filter) { if ($filter->isRequired()) { return true; } @@ -113,8 +112,8 @@ abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Co */ protected function validateFilters() { $errors = array(); - if ($this->dataProcessor->getFilterHandlers()) { - foreach ($this->dataProcessor->getFilterHandlers() as $filter) { + if ($this->dataProcessorClass->getFilterHandlers()) { + foreach ($this->dataProcessorClass->getFilterHandlers() as $filter) { $errors = array_merge($errors, $filter->validateSubmittedFilterParams($this->_formValues)); } } @@ -139,8 +138,8 @@ abstract class CRM_Dataprocessor_Form_Output_AbstractUIOutputForm extends CRM_Co */ protected function buildCriteriaForm() { $filterElements = array(); - if ($this->dataProcessor->getFilterHandlers()) { - foreach ($this->dataProcessor->getFilterHandlers() as $filterHandler) { + if ($this->dataProcessorClass->getFilterHandlers()) { + foreach ($this->dataProcessorClass->getFilterHandlers() as $filterHandler) { $fieldSpec = $filterHandler->getFieldSpecification(); if (!$fieldSpec) { continue; diff --git a/CRM/Dataprocessor/Form/Source.php b/CRM/Dataprocessor/Form/Source.php index dd343ab329979bd41ec78966a802d5527f9aaad6..e89fbb7c970936db1f432dc88bfc143bacf76146 100644 --- a/CRM/Dataprocessor/Form/Source.php +++ b/CRM/Dataprocessor/Form/Source.php @@ -11,10 +11,12 @@ class CRM_Dataprocessor_Form_Source extends CRM_Core_Form { private $dataProcessorId; + private $dataProcessor; + /** * @var Civi\DataProcessor\ProcessorType\AbstractProcessorType */ - private $dataProcessor; + private $dataProcessorClass; private $id; @@ -54,7 +56,8 @@ class CRM_Dataprocessor_Form_Source extends CRM_Core_Form { $this->dataProcessorId = CRM_Utils_Request::retrieve('data_processor_id', 'Integer'); $this->assign('data_processor_id', $this->dataProcessorId); if ($this->dataProcessorId) { - $this->dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($this->dataProcessorId); + $this->dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $this->dataProcessorId)); + $this->dataProcessorClass = CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($this->dataProcessor); } $this->id = CRM_Utils_Request::retrieve('id', 'Integer'); @@ -143,8 +146,7 @@ class CRM_Dataprocessor_Form_Source extends CRM_Core_Form { )); if ($this->joinClass && $this->joinClass->hasConfiguration()) { $joinableToSources = array(); - $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($this->dataProcessorId); - foreach($dataProcessor->getDataSources() as $source) { + foreach($this->dataProcessorClass->getDataSources() as $source) { if ($this->sourceClass && $this->sourceClass->getSourceName() == $source->getSourceName()) { break; } @@ -225,24 +227,6 @@ class CRM_Dataprocessor_Form_Source extends CRM_Core_Form { } $result = civicrm_api3('DataProcessorSource', 'create', $params); - - if (!$this->isFirstDataSource && $this->_action == CRM_Core_Action::ADD) { - $joinClass = $factory->getJoinByName($values['join_type']); - if ($joinClass->getConfigurationUrl()) { - $joinUrl = CRM_Utils_System::url($joinClass->getConfigurationUrl(), [ - 'reset' => 1, - 'action' => 'add', - 'source_id' => $result['id'], - 'data_processor_id' => $this->dataProcessorId - ]); - $session->pushUserContext($backUrl); - $redirectUrl = $joinUrl; - } else { - $session->pushUserContext($backUrl); - } - } elseif ($this->_action == CRM_Core_Action::ADD) { - $session->pushUserContext($backUrl); - } CRM_Utils_System::redirect($redirectUrl); parent::postProcess(); } diff --git a/CRM/Dataprocessor/Status.php b/CRM/Dataprocessor/Status.php new file mode 100644 index 0000000000000000000000000000000000000000..ebe8295d332f15febc1f9db3dbb8eb17f048b020 --- /dev/null +++ b/CRM/Dataprocessor/Status.php @@ -0,0 +1,36 @@ +<?php +/** + * @author Jaap Jansma <jaap.jansma@civicoop.org> + * @license AGPL-3.0 + */ + +use CRM_Dataprocessor_ExtensionUtil as E; + +class CRM_Dataprocessor_Status { + + const STATUS_IN_DATABASE = 1; + const STATUS_IN_CODE = 2; + const STATUS_OVERRIDDEN = 3; + + /** + * Returns a textual representation of the status + * + * @param $status + * @return string + */ + public static function statusToLabel($status) { + switch ($status) { + case CRM_Dataprocessor_Status::STATUS_IN_CODE: + return E::ts('In code'); + break; + case CRM_Dataprocessor_Status::STATUS_OVERRIDDEN: + return E::ts('Overridden'); + break; + case CRM_Dataprocessor_Status::STATUS_IN_DATABASE: + return E::ts('In database'); + break; + } + return E::ts('Unknown'); + } + +} \ No newline at end of file diff --git a/CRM/Dataprocessor/Utils/DataSourceFields.php b/CRM/Dataprocessor/Utils/DataSourceFields.php index 5c4ff066a88714bea7b42a748e4510b02534a05b..acd5a9e19809358956a4c7d113f4fe7bc52731b7 100644 --- a/CRM/Dataprocessor/Utils/DataSourceFields.php +++ b/CRM/Dataprocessor/Utils/DataSourceFields.php @@ -16,9 +16,10 @@ class CRM_Dataprocessor_Utils_DataSourceFields { * @throws \Exception */ public static function getAvailableFieldsInDataSources($dataProcessorId) { - $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dataProcessorId); + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dataProcessorId)); + $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor); $fieldSelect = array(); - foreach($dataProcessor->getDataSources() as $dataSource) { + foreach($dataProcessorClass->getDataSources() as $dataSource) { $fieldSelect = array_merge($fieldSelect, self::getAvailableFieldsInDataSource($dataSource, $dataSource->getSourceTitle().' :: ', $dataSource->getSourceName().'::')); } return $fieldSelect; diff --git a/CRM/Dataprocessor/Utils/Importer.php b/CRM/Dataprocessor/Utils/Importer.php index 238362040888576f4e09f910c3f6d7141b222241..1d88647f45a897f1e145e05beb6d61db3ae12d57 100644 --- a/CRM/Dataprocessor/Utils/Importer.php +++ b/CRM/Dataprocessor/Utils/Importer.php @@ -6,28 +6,103 @@ class CRM_Dataprocessor_Utils_Importer { - public static function import($data, $filename) { - $data_processor_id = CRM_Dataprocessor_BAO_DataProcessor::getId($data['name']); - $status = CRM_Dataprocessor_BAO_DataProcessor::getStatus($data['name']); + /** + * Exports a data processor + * + * Returns the array with the whole configuration. + * + * @param $data_processor_id + * @return array + * @throws \Exception + */ + public static function export($data_processor_id) { + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $data_processor_id)); + unset($dataProcessor['id']); + unset($dataProcessor['status']); + unset($dataProcessor['source_file']); + + $sources = civicrm_api3('DataProcessorSource', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0))); + $dataProcessor['data_sources'] = array(); + foreach($sources['values'] as $i => $datasource) { + unset($datasource['id']); + unset($datasource['data_processor_id']); + $dataProcessor['data_sources'][] = $datasource; + } + $filters = civicrm_api3('DataProcessorFilter', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0))); + $dataProcessor['filters'] = array(); + foreach($filters['values'] as $i => $filter) { + unset($filter['id']); + unset($filter['data_processor_id']); + $dataProcessor['filters'][] = $filter; + } + $fields = civicrm_api3('DataProcessorField', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0))); + $dataProcessor['fields'] = array(); + foreach($fields['values'] as $i => $field) { + unset($field['id']); + unset($field['data_processor_id']); + $dataProcessor['fields'][] = $field; + } + $outputs = $outputs = civicrm_api3('DataProcessorOutput', 'get', array('data_processor_id' => $data_processor_id, 'options' => array('limit' => 0))); + $dataProcessor['outputs'] = array(); + foreach($outputs['values'] as $i => $output) { + unset($output['id']); + unset($output['data_processor_id']); + $dataProcessor['outputs'][] = $output; + } + + $eventData['data_processor'] = &$dataProcessor; + $event = \Civi\Core\Event\GenericHookEvent::create($eventData); + \Civi::dispatcher()->dispatch('hook_civicrm_dataprocessor_export', $event); + + return $dataProcessor; + } + + public static function import($data, $filename, $overWriteInDatabase=false) { $new_status = null; $new_id = null; - - CRM_Dataprocessor_BAO_DataProcessor::setDataProcessorToImportingState($data['name']); + $data_processor_id = null; + $status = null; + try { + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', ['name' => $data['name']]); + $data_processor_id = $dataProcessor['id']; + $status = $dataProcessor['status'] ? $dataProcessor['status'] : CRM_Dataprocessor_Status::STATUS_IN_DATABASE; + } catch (Exception $e) { + // Do nothing + } switch ($status) { - case CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_DATABASE: + case CRM_Dataprocessor_Status::STATUS_IN_DATABASE: // Update to overriden - CRM_Dataprocessor_BAO_DataProcessor::setStatusAndSourceFile($data['name'], CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN, $filename); - $new_id = $data_processor_id; - $new_status = CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN; + if (!$overWriteInDatabase) { + civicrm_api3('DataProcessor', 'create', array( + 'id' => $data_processor_id, + 'status' => CRM_Dataprocessor_Status::STATUS_OVERRIDDEN, + 'source_file' => $filename, + )); + $new_id = $data_processor_id; + $new_status = CRM_Dataprocessor_Status::STATUS_OVERRIDDEN; + } else { + $new_id = self::importDataProcessor($data, $filename, $data_processor_id, CRM_Dataprocessor_Status::STATUS_IN_DATABASE); + $new_status = CRM_Dataprocessor_Status::STATUS_IN_DATABASE; + } break; - case CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN: - $new_id = $data_processor_id; - $new_status = CRM_Dataprocessor_DAO_DataProcessor::STATUS_OVERRIDDEN; + case CRM_Dataprocessor_Status::STATUS_OVERRIDDEN: + if (!$overWriteInDatabase) { + $new_id = $data_processor_id; + $new_status = CRM_Dataprocessor_Status::STATUS_OVERRIDDEN; + } else { + $new_id = self::importDataProcessor($data, $filename, $data_processor_id, CRM_Dataprocessor_Status::STATUS_OVERRIDDEN); + $new_status = CRM_Dataprocessor_Status::STATUS_OVERRIDDEN; + } break; default: - $new_id = self::importDataProcessor($data, $filename, $data_processor_id); - $new_status = CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_CODE; + if (!$overWriteInDatabase) { + $new_id = self::importDataProcessor($data, $filename, $data_processor_id, CRM_Dataprocessor_Status::STATUS_IN_CODE); + $new_status = CRM_Dataprocessor_Status::STATUS_IN_CODE; + } else { + $new_id = self::importDataProcessor($data, $filename, $data_processor_id, CRM_Dataprocessor_Status::STATUS_OVERRIDDEN); + $new_status = CRM_Dataprocessor_Status::STATUS_OVERRIDDEN; + } break; } @@ -52,10 +127,12 @@ class CRM_Dataprocessor_Utils_Importer { * @return mixed * @throws \Exception */ - public static function importDataProcessor($data, $filename, $data_processor_id) { + public static function importDataProcessor($data, $filename, $data_processor_id, $status) { $params = $data; unset($params['data_sources']); unset($params['outputs']); + unset($params['fields']); + unset($params['filters']); if ($data_processor_id) { $params['id'] = $data_processor_id; } @@ -65,14 +142,13 @@ class CRM_Dataprocessor_Utils_Importer { if (!isset($params['storage_configuration'])) { $params['storage_configuration'] = array(); } - $params['status'] = CRM_Dataprocessor_DAO_DataProcessor::STATUS_IN_CODE; - $params['source_file'] = $filename; - CRM_Dataprocessor_BAO_DataProcessor::setDataProcessorToImportingState($params['name']); - $result = CRM_Dataprocessor_BAO_DataProcessor::add($params); + $params['status'] = $status; + $params['source_file'] = $filename ? $filename : null; + $result = civicrm_api3('DataProcessor', 'create', $params); $id = $result['id']; // Clear all existing data sources and outputs - CRM_Dataprocessor_BAO_Source::deleteWithDataProcessorId($id); + CRM_Dataprocessor_BAO_DataProcessorSource::deleteWithDataProcessorId($id); CRM_Dataprocessor_BAO_DataProcessorFilter::deleteWithDataProcessorId($id); CRM_Dataprocessor_BAO_DataProcessorField::deleteWithDataProcessorId($id); CRM_Dataprocessor_BAO_DataProcessorOutput::deleteWithDataProcessorId($id); @@ -80,7 +156,13 @@ class CRM_Dataprocessor_Utils_Importer { foreach($data['data_sources'] as $data_source) { $params = $data_source; $params['data_processor_id'] = $id; - $result = CRM_Dataprocessor_BAO_Source::add($params); + $params['debug'] = 1; + var_dump($params); + try { + civicrm_api3('DataProcessorSource', 'create', $params); + } catch (\CiviCRM_API3_Exception $e) { + echo $e->getTraceAsString(); exit(); + } } foreach($data['filters'] as $filter) { $params = $filter; diff --git a/CRM/DataprocessorOutputExport/CSV.php b/CRM/DataprocessorOutputExport/CSV.php index 6f269250306817343d625224121e21dbf3afdef2..49386c7f1374a8604d7cdb55eb9b941e58ea3398 100644 --- a/CRM/DataprocessorOutputExport/CSV.php +++ b/CRM/DataprocessorOutputExport/CSV.php @@ -90,32 +90,32 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { /** * Download export * - * @param \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor - * @param array $dataProcessorBAO + * @param \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass + * @param array $dataProcessor * @param array $outputBAO * @param array $formValues * @return string * @throws \Exception */ - public function downloadExport(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $dataProcessorBAO, $outputBAO, $formValues) { - if ($dataProcessor->getDataFlow()->recordCount() > self::MAX_DIRECT_SIZE) { - $this->startBatchJob($dataProcessor, $dataProcessorBAO, $outputBAO, $formValues); + public function downloadExport(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass, $dataProcessor, $outputBAO, $formValues) { + if ($dataProcessorClass->getDataFlow()->recordCount() > self::MAX_DIRECT_SIZE) { + $this->startBatchJob($dataProcessorClass, $dataProcessor, $outputBAO, $formValues); } else { - $this->doDirectDownload($dataProcessor, $dataProcessorBAO, $outputBAO); + $this->doDirectDownload($dataProcessorClass, $dataProcessor, $outputBAO); } } - protected function doDirectDownload(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $dataProcessorBAO, $outputBAO) { - $filename = date('Ymdhis').'_'.$dataProcessorBAO['id'].'_'.$outputBAO['id'].'_'.CRM_Core_Session::getLoggedInContactID().'_'.$dataProcessorBAO['name'].'.csv'; - $download_name = date('Ymdhis').'_'.$dataProcessorBAO['name'].'.csv'; + protected function doDirectDownload(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass, $dataProcessor, $outputBAO) { + $filename = date('Ymdhis').'_'.$dataProcessor['id'].'_'.$outputBAO['id'].'_'.CRM_Core_Session::getLoggedInContactID().'_'.$dataProcessor['name'].'.csv'; + $download_name = date('Ymdhis').'_'.$dataProcessor['name'].'.csv'; $basePath = CRM_Core_Config::singleton()->templateCompileDir . 'dataprocessor_export_csv'; CRM_Utils_File::createDir($basePath); CRM_Utils_File::restrictAccess($basePath.'/'); $path = CRM_Core_Config::singleton()->templateCompileDir . 'dataprocessor_export_csv/'. $filename; - self::createHeaderLine($path, $dataProcessor); - self::exportDataProcessor($path, $dataProcessor); + self::createHeaderLine($path, $dataProcessorClass); + self::exportDataProcessor($path, $dataProcessorClass); $mimeType = CRM_Utils_Request::retrieveValue('mime-type', 'String', '', FALSE); @@ -138,10 +138,10 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { ); } - protected function startBatchJob(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $dataProcessorBAO, $outputBAO, $formValues) { + protected function startBatchJob(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass, $dataProcessor, $outputBAO, $formValues) { $session = CRM_Core_Session::singleton(); - $name = date('Ymdhis').'_'.$dataProcessorBAO['id'].'_'.$outputBAO['id'].'_'.CRM_Core_Session::getLoggedInContactID().'_'.$dataProcessorBAO['name']; + $name = date('Ymdhis').'_'.$dataProcessor['id'].'_'.$outputBAO['id'].'_'.CRM_Core_Session::getLoggedInContactID().'_'.$dataProcessor['name']; $queue = CRM_Queue_Service::singleton()->create(array( 'type' => 'Sql', @@ -154,9 +154,9 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { CRM_Utils_File::restrictAccess($basePath.'/'); $filename = $basePath.'/'. $name.'.csv'; - self::createHeaderLine($filename, $dataProcessor); + self::createHeaderLine($filename, $dataProcessorClass); - $count = $dataProcessor->getDataFlow()->recordCount(); + $count = $dataProcessorClass->getDataFlow()->recordCount(); $recordsPerJob = self::RECORDS_PER_JOB; for($i=0; $i < $count; $i = $i + $recordsPerJob) { $title = E::ts('Exporting records %1/%2', array( @@ -170,7 +170,7 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { 'CRM_DataprocessorOutputExport_CSV', 'exportBatch' ), //call back method - array($filename,$formValues, $dataProcessorBAO['id'], $i, $recordsPerJob), //parameters, + array($filename,$formValues, $dataProcessor['id'], $i, $recordsPerJob), //parameters, $title ); //now add this task to the queue @@ -218,11 +218,12 @@ class CRM_DataprocessorOutputExport_CSV implements ExportOutputInterface { } public static function exportBatch(CRM_Queue_TaskContext $ctx, $filename, $params, $dataProcessorId, $offset, $limit) { - $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dataProcessorId); - CRM_Dataprocessor_Form_Output_AbstractUIOutputForm::applyFilters($dataProcessor, $params); - $dataProcessor->getDataFlow()->setOffset($offset); - $dataProcessor->getDataFlow()->setLimit($limit); - self::exportDataProcessor($filename, $dataProcessor); + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dataProcessorId)); + $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor); + CRM_Dataprocessor_Form_Output_AbstractUIOutputForm::applyFilters($dataProcessorClass, $params); + $dataProcessorClass->getDataFlow()->setOffset($offset); + $dataProcessorClass->getDataFlow()->setLimit($limit); + self::exportDataProcessor($filename, $dataProcessorClass); return TRUE; } diff --git a/CRM/DataprocessorSearch/ActivitySearch.php b/CRM/DataprocessorSearch/ActivitySearch.php index 501953ac5d3c4e14251c8d18facf5a0d24f37bf7..aa78f8edf2ea011fc3c1e51959a8eb65734ebc95 100644 --- a/CRM/DataprocessorSearch/ActivitySearch.php +++ b/CRM/DataprocessorSearch/ActivitySearch.php @@ -28,9 +28,10 @@ class CRM_DataprocessorSearch_ActivitySearch implements UIOutputInterface { */ public function buildConfigurationForm(\CRM_Core_Form $form, $output=array()) { $navigation = CRM_Dataprocessor_Utils_Navigation::singleton(); - $dataProcessor = \CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($output['data_processor_id']); + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $output['data_processor_id'])); + $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor); $fields = array(); - foreach($dataProcessor->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) { + foreach($dataProcessorClass->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) { $field = $outputFieldHandler->getOutputFieldSpecification(); $fields[$field->alias] = $field->title; } diff --git a/CRM/DataprocessorSearch/ContactSearch.php b/CRM/DataprocessorSearch/ContactSearch.php index 66ceeec511e9c1f1998c5627b17a770ef80c2230..7e34a5da2db94eda29b953fb17273820df10b485 100644 --- a/CRM/DataprocessorSearch/ContactSearch.php +++ b/CRM/DataprocessorSearch/ContactSearch.php @@ -27,9 +27,10 @@ class CRM_DataprocessorSearch_ContactSearch implements UIOutputInterface { */ public function buildConfigurationForm(\CRM_Core_Form $form, $output=array()) { $navigation = CRM_Dataprocessor_Utils_Navigation::singleton(); - $dataProcessor = \CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($output['data_processor_id']); + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $output['data_processor_id'])); + $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor); $fields = array(); - foreach($dataProcessor->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) { + foreach($dataProcessorClass->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) { $field = $outputFieldHandler->getOutputFieldSpecification(); $fields[$field->alias] = $field->title; } diff --git a/CRM/DataprocessorSearch/Form/AbstractSearch.php b/CRM/DataprocessorSearch/Form/AbstractSearch.php index eb5d56008cc844c529ae3bdcaa8f68ce1998e64d..51f08b22ba16a373f4017902858f9e46f3746ac8 100644 --- a/CRM/DataprocessorSearch/Form/AbstractSearch.php +++ b/CRM/DataprocessorSearch/Form/AbstractSearch.php @@ -165,11 +165,11 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce protected function runExport($export_id) { $factory = dataprocessor_get_factory(); - self::applyFilters($this->dataProcessor, $this->_formValues); + self::applyFilters($this->dataProcessorClass, $this->_formValues); $output = civicrm_api3("DataProcessorOutput", "getsingle", array('id' => $export_id)); $outputClass = $factory->getOutputByName($output['type']); if ($outputClass instanceof \Civi\DataProcessor\Output\ExportOutputInterface) { - $outputClass->downloadExport($this->dataProcessor, $this->dataProcessorBAO, $output, $this->_formValues); + $outputClass->downloadExport($this->dataProcessorClass, $this->dataProcessor, $output, $this->_formValues); } } @@ -190,9 +190,9 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce $this->assign('id_field', $id_field); $offset = ($pageId - 1) * $limit; - $this->dataProcessor->getDataFlow()->setLimit($limit); - $this->dataProcessor->getDataFlow()->setOffset($offset); - self::applyFilters($this->dataProcessor, $this->_formValues); + $this->dataProcessorClass->getDataFlow()->setLimit($limit); + $this->dataProcessorClass->getDataFlow()->setOffset($offset); + self::applyFilters($this->dataProcessorClass, $this->_formValues); // Set the sort $sortDirection = 'ASC'; @@ -201,19 +201,19 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce if ($this->sort->getCurrentSortDirection() == CRM_Utils_Sort::DESCENDING) { $sortDirection = 'DESC'; } - $this->dataProcessor->getDataFlow()->addSort($sortField['name'], $sortDirection); + $this->dataProcessorClass->getDataFlow()->addSort($sortField['name'], $sortDirection); } $pagerParams = $this->getPagerParams(); - $pagerParams['total'] = $this->dataProcessor->getDataFlow()->recordCount(); + $pagerParams['total'] = $this->dataProcessorClass->getDataFlow()->recordCount(); $pagerParams['pageID'] = $pageId; $this->pager = new CRM_Utils_Pager($pagerParams); $this->assign('pager', $this->pager); $i=0; try { - while($record = $this->dataProcessor->getDataFlow()->nextRecord()) { + while($record = $this->dataProcessorClass->getDataFlow()->nextRecord()) { $i ++; $row = array(); $row['id'] = $record[$id_field]->formattedValue; @@ -245,7 +245,7 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce $this->addElement('checkbox', 'toggleSelect', NULL, NULL, ['class' => 'select-rows']); $this->assign('rows', $rows); - $this->assign('debug_info', $this->dataProcessor->getDataFlow()->getDebugInformation()); + $this->assign('debug_info', $this->dataProcessorClass->getDataFlow()->getDebugInformation()); if ($this->usePrevNextCache()) { $cacheKey = "civicrm search {$this->controller->_key}"; CRM_DataprocessorSearch_Utils_PrevNextCache::fillWithArray($cacheKey, $prevnextData); @@ -263,7 +263,7 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce $idFieldVisible = $this->isIdFieldVisible(); $columnHeaders = array(); $sortColumnNr = 1; - foreach($this->dataProcessor->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) { + foreach($this->dataProcessorClass->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) { $field = $outputFieldHandler->getOutputFieldSpecification(); $hiddenField = true; if ($field->alias != $id_field) { @@ -315,9 +315,9 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce $outputClass = $factory->getOutputByName(($output['type'])); if ($outputClass instanceof \Civi\DataProcessor\Output\ExportOutputInterface) { $otherOutput = array(); - $otherOutput['title'] = $outputClass->getTitleForExport($output, $this->dataProcessorBAO); + $otherOutput['title'] = $outputClass->getTitleForExport($output, $this->dataProcessor); $otherOutput['url'] = $this->currentUrl.'&export_id='.$output['id']; - $otherOutput['icon'] = $outputClass->getExportFileIcon($output, $this->dataProcessorBAO); + $otherOutput['icon'] = $outputClass->getExportFileIcon($output, $this->dataProcessor); $otherOutputs[] = $otherOutput; } } diff --git a/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php b/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php index 563a93b0d5669fe62c3310d56066ea6d62a57398..87fccf17bd9d6bd30d8078bb1c787789a5469081 100644 --- a/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php +++ b/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php @@ -47,9 +47,11 @@ class SimpleSqlFilter extends AbstractFilterHandler { $this->is_required = $is_required; $this->dataSource = $this->data_processor->getDataSourceByName($configuration['datasource']); - $this->fieldSpecification = clone $this->dataSource->getAvailableFilterFields()->getFieldSpecificationByName($configuration['field']); - $this->fieldSpecification->alias = $alias; - $this->fieldSpecification->title = $title; + if ($this->dataSource) { + $this->fieldSpecification = clone $this->dataSource->getAvailableFilterFields()->getFieldSpecificationByName($configuration['field']); + $this->fieldSpecification->alias = $alias; + $this->fieldSpecification->title = $title; + } } /** diff --git a/Civi/DataProcessor/Output/Api.php b/Civi/DataProcessor/Output/Api.php index b15dd606f7f3e63d31b5cea1e098ad118e0770c5..be5c4b2bc67b6307f9144195a5a7c2d49e9ee67d 100644 --- a/Civi/DataProcessor/Output/Api.php +++ b/Civi/DataProcessor/Output/Api.php @@ -147,10 +147,11 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte if (!$dao->fetch()) { throw new \API_Exception("Could not find a data processor"); } - $dataProcessor = \CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dao->data_processor_id); + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dao->data_processor_id)); + $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor); - foreach ($dataProcessor->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) { + foreach ($dataProcessorClass->getDataFlow()->getOutputFieldHandlers() as $outputFieldHandler) { $fieldSpec = $outputFieldHandler->getOutputFieldSpecification(); $type = \CRM_Utils_Type::T_STRING; if (isset($types[$fieldSpec->type])) { @@ -171,7 +172,7 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte } $result['values'][$fieldSpec->alias] = $field; } - foreach($dataProcessor->getFilterHandlers() as $filterHandler) { + foreach($dataProcessorClass->getFilterHandlers() as $filterHandler) { $fieldSpec = $filterHandler->getFieldSpecification(); $type = \CRM_Utils_Type::T_STRING; if (isset($types[$fieldSpec->type])) { @@ -236,10 +237,11 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte if (strtolower($dao->api_count_action) == $apiRequest['action']) { $isCountAction = TRUE; } - $dataProcessor = \CRM_Dataprocessor_BAO_DataProcessor::getDataProcessorById($dao->data_processor_id); + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dao->data_processor_id)); + $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor); $params = $apiRequest['params']; - foreach($dataProcessor->getFilterHandlers() as $filter) { + foreach($dataProcessorClass->getFilterHandlers() as $filter) { $filterSpec = $filter->getFieldSpecification(); if ($filter->isRequired() && !isset($params[$filterSpec->alias])) { throw new \API_Exception('Field '.$filterSpec->alias.' is required'); @@ -262,27 +264,27 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte } if ($isCountAction) { - $count = $dataProcessor->getDataFlow()->recordCount(); + $count = $dataProcessorClass->getDataFlow()->recordCount(); return array('result' => $count, 'is_error' => 0); } else { $options = _civicrm_api3_get_options_from_params($apiRequest['params']); if (isset($options['limit']) && $options['limit'] > 0) { - $dataProcessor->getDataFlow()->setLimit($options['limit']); + $dataProcessorClass->getDataFlow()->setLimit($options['limit']); } if (isset($options['offset'])) { - $dataProcessor->getDataFlow()->setOffset($options['offset']); + $dataProcessorClass->getDataFlow()->setOffset($options['offset']); } if (isset($options['sort'])) { $sort = explode(', ', $options['sort']); foreach ($sort as $index => &$sortString) { // Get sort field and direction list($sortField, $dir) = array_pad(explode(' ', $sortString), 2, 'ASC'); - $dataProcessor->getDataFlow()->addSort($sortField, $dir); + $dataProcessorClass->getDataFlow()->addSort($sortField, $dir); } } - $records = $dataProcessor->getDataFlow()->allRecords(); + $records = $dataProcessorClass->getDataFlow()->allRecords(); $values = array(); foreach($records as $idx => $record) { foreach($record as $fieldname => $field) { @@ -295,7 +297,7 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte 'is_error' => 0, ); if (isset($apiRequest['params']['debug']) && $apiRequest['params']['debug']) { - $return['debug_info'] = $dataProcessor->getDataFlow()->getDebugInformation(); + $return['debug_info'] = $dataProcessorClass->getDataFlow()->getDebugInformation(); } return $return; } diff --git a/Civi/DataProcessor/Output/ExportOutputInterface.php b/Civi/DataProcessor/Output/ExportOutputInterface.php index 6f7dac9eb1f8ca887ccaefeb0a6df5076b206a26..b6962c37aee9dc34d409c75d0a3053b607d5429c 100644 --- a/Civi/DataProcessor/Output/ExportOutputInterface.php +++ b/Civi/DataProcessor/Output/ExportOutputInterface.php @@ -18,13 +18,13 @@ interface ExportOutputInterface extends OutputInterface { /** * Download export * - * @param \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor - * @param array $dataProcessorBAO + * @param \Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass + * @param array $dataProcessor * @param array $outputBAO * @param array $formValues * @return string */ - public function downloadExport(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessor, $dataProcessorBAO, $outputBAO, $formValues); + public function downloadExport(\Civi\DataProcessor\ProcessorType\AbstractProcessorType $dataProcessorClass, $dataProcessor, $outputBAO, $formValues); /** * Returns the mime type of the export file. diff --git a/api/v3/DataProcessor.php b/api/v3/DataProcessor.php new file mode 100644 index 0000000000000000000000000000000000000000..76f9a5478faa951975381d818c044fedb0c0a010 --- /dev/null +++ b/api/v3/DataProcessor.php @@ -0,0 +1,139 @@ +<?php +use CRM_Dataprocessor_ExtensionUtil as E; + +/** + * DataProcessor.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_create_spec(&$spec) { + $fields = CRM_Dataprocessor_DAO_DataProcessor::fields(); + foreach($fields as $fieldname => $field) { + $spec[$fieldname] = $field; + } +} + +/** + * DataProcessor.create API + * + * @param array $params + * @return array API result descriptor + * @throws API_Exception + */ +function civicrm_api3_data_processor_create($params) { + $id = null; + if (isset($params['id'])) { + $id = $params['id']; + } + if (isset($params['title'])) { + $params['name'] = CRM_Dataprocessor_BAO_DataProcessor::checkName($params['title'], $id, $params['name']); + } + return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params); +} + +/** + * DataProcessor.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_delete_spec(&$spec) { + $spec['id']['api.required'] = true; +} + +/** + * DataProcessor.delete API + * + * @param array $params + * @return array API result descriptor + * @throws API_Exception + */ +function civicrm_api3_data_processor_delete($params) { + CRM_Dataprocessor_BAO_DataProcessorOutput::deleteWithDataProcessorId($params['id']); + CRM_Dataprocessor_BAO_DataProcessorField::deleteWithDataProcessorId($params['id']); + CRM_Dataprocessor_BAO_DataProcessorFilter::deleteWithDataProcessorId($params['id']); + CRM_Dataprocessor_BAO_DataProcessorSource::deleteWithDataProcessorId($params['id']); + return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params); +} + +/** + * DataProcessor.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_get_spec(&$spec) { + $fields = CRM_Dataprocessor_DAO_DataProcessor::fields(); + foreach($fields as $fieldname => $field) { + $spec[$fieldname] = $field; + } +} + +/** + * DataProcessor.get API + * + * @param array $params + * @return array API result descriptor + * @throws API_Exception + */ +function civicrm_api3_data_processor_get($params) { + $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); + } else { + $return['values'][$id]['configuration'] = array(); + } + if (isset($value['aggregation'])) { + $return['values'][$id]['aggregation'] = json_decode($value['aggregation'], TRUE); + } else { + $return['values'][$id]['aggregation'] = array(); + } + if (isset($value['storage_configuration'])) { + $return['values'][$id]['storage_configuration'] = json_decode($value['storage_configuration'], TRUE); + } else { + $return['values'][$id]['storage_configuration'] = array(); + } + } + return $return; +} + +/** + * DataProcessor.check_name API specification + * + * @param $params + */ +function _civicrm_api3_data_processor_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['name'] = array( + 'name' => 'name', + 'title' => E::ts('Name'), + ); +} + +/** + * DataProcessor.check_name API + * + * @param $params + */ +function civicrm_api3_data_processor_check_name($params) { + $name = CRM_Dataprocessor_BAO_DataProcessor::checkName($params['title'], $params['id'], $params['name']); + return array( + 'name' => $name, + ); +} diff --git a/api/v3/DataProcessor/Create.php b/api/v3/DataProcessor/Create.php deleted file mode 100644 index 268aeb3255514247196a2e4f8c1aa6172e6c2153..0000000000000000000000000000000000000000 --- a/api/v3/DataProcessor/Create.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php - -use CRM_Dataprocessor_ExtensionUtil as E; - -/** - * DataProcessor.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/CRM/API+Architecture+Standards - */ -function _civicrm_api3_data_processor_create_spec(&$spec) { - $spec['id'] = array( - 'title' => E::ts('ID'), - 'type' => CRM_Utils_Type::T_INT, - 'api.required' => false - ); - $spec['title'] = array( - 'title' => E::ts('Title'), - '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['type'] = array( - 'title' => E::ts('Type'), - 'type' => CRM_Utils_Type::T_STRING, - 'api.required' => true - ); - $spec['is_active'] = array( - 'title' => E::ts('Is active'), - 'type' => CRM_Utils_Type::T_BOOLEAN, - 'api.required' => true, - 'api.default' => true, - ); - $spec['description'] = array( - 'title' => E::ts('Description'), - 'type' => CRM_Utils_Type::T_TEXT, - 'api.required' => false, - ); - $spec['configuration'] = array( - 'title' => E::ts('Configuration'), - '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, - 'api.required' => false - ); - $spec['storage_configuration'] = array( - 'title' => E::ts('Storage Configuration'), - 'type' => CRM_Utils_Type::T_TEXT, - 'api.required' => false, - ); -} - -/** - * DataProcessor.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_create($params) { - if (!isset($params['id']) && empty($params['title'])) { - return civicrm_api3_create_error('Title can not be empty when adding a new DataProcessor'); - } - - $returnValue = CRM_Dataprocessor_BAO_DataProcessor::add($params); - $returnValues[$returnValue['id']] = $returnValue; - return civicrm_api3_create_success($returnValues, $params, 'DataProcessor', 'Create'); -} - diff --git a/api/v3/DataProcessor/Delete.php b/api/v3/DataProcessor/Delete.php deleted file mode 100644 index 35dd1e3a46d7d05ab325f8687d59065980cca492..0000000000000000000000000000000000000000 --- a/api/v3/DataProcessor/Delete.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -use CRM_Dataprocessor_ExtensionUtil as E; - -/** - * DataProcessor.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_Delete_spec(&$spec) { - $spec['id'] = array( - 'title' => E::ts('ID'), - 'type' => CRM_Utils_Type::T_INT, - 'api.required' => true - ); -} - -/** - * DataProcessor.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_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_DataProcessor::deleteWithId($params['id']), $params, 'DataProcessor', 'Delete'); - } -} - diff --git a/api/v3/DataProcessor/Get.php b/api/v3/DataProcessor/Get.php deleted file mode 100644 index aab928b7534619ae13617493280efcef57017300..0000000000000000000000000000000000000000 --- a/api/v3/DataProcessor/Get.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php -/** - * DataProcessor.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_get($params) { - $returnValues = CRM_Dataprocessor_BAO_DataProcessor::getValues($params); - return civicrm_api3_create_success($returnValues, $params, 'DataProcessor', 'Get'); -} - -/** - * DataProcessor.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_get_spec(&$spec) { - $fields = CRM_Dataprocessor_BAO_DataProcessor::fields(); - foreach($fields as $fieldname => $field) { - $spec[$fieldname] = $field; - } -} - diff --git a/api/v3/DataProcessor/Import.mgd.php b/api/v3/DataProcessor/Import.mgd.php deleted file mode 100644 index c3b7bf019ec458a5577e877b3f7f4df71139c03c..0000000000000000000000000000000000000000 --- a/api/v3/DataProcessor/Import.mgd.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -// This file declares a managed database record of type "Job". -// The record will be automatically inserted, updated, or deleted from the -// database as appropriate. For more details, see "hook_civicrm_managed" at: -// http://wiki.civicrm.org/confluence/display/CRMDOC42/Hook+Reference -return array ( - 0 => - array ( - 'name' => 'Cron:DataProcessor.Import', - 'entity' => 'Job', - 'params' => - array ( - 'version' => 3, - 'name' => 'Import Data Processors', - 'description' => 'Updates the data processor(s) from source files. Run this job manually if you want to update your changes into the database.', - 'run_frequency' => 'Daily', - 'api_entity' => 'DataProcessor', - 'api_action' => 'Import', - 'parameters' => '', - ), - ), -); diff --git a/api/v3/DataProcessor/Import.php b/api/v3/DataProcessor/Import.php deleted file mode 100644 index b1fb4fbf9c0ea52c567a5669afbfe960b389e52f..0000000000000000000000000000000000000000 --- a/api/v3/DataProcessor/Import.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -use CRM_Dataprocessor_ExtensionUtil as E; - -/** - * DataProcessor.Import 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_Import_spec(&$spec) { -} - -/** - * DataProcessor.Import 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_Import($params) { - $returnValues = array(); - $returnValues['import'] = CRM_Dataprocessor_Utils_Importer::importFromExtensions(); - $returnValues['is_error'] = 0; - return $returnValues; -} diff --git a/dataprocessor.civix.php b/dataprocessor.civix.php index e4599a5daf0cc1a32e52ac873ff263a46d59c72f..b4cbf227932589c2da71f7a2ad05218a89cfcefc 100644 --- a/dataprocessor.civix.php +++ b/dataprocessor.civix.php @@ -457,6 +457,12 @@ function _dataprocessor_civix_civicrm_alterSettingsFolders(&$metaDataFolders = N function _dataprocessor_civix_civicrm_entityTypes(&$entityTypes) { $entityTypes = array_merge($entityTypes, array ( + 'CRM_Dataprocessor_DAO_DataProcessor' => + array ( + 'name' => 'DataProcessor', + 'class' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'table' => 'civicrm_data_processor', + ), 'CRM_Dataprocessor_DAO_DataProcessorField' => array ( 'name' => 'DataProcessorField', diff --git a/docs/hooks.md b/docs/hooks.md new file mode 100644 index 0000000000000000000000000000000000000000..abb29d198bdc2d062db2f89ce20ff3a9ac03f5da --- /dev/null +++ b/docs/hooks.md @@ -0,0 +1,3 @@ +# Available Hooks + +## hook_civicrm_dataprocessor_export \ No newline at end of file diff --git a/sql/alter.sql b/sql/alter.sql index 2f012583f8016792fec571a10b143f68faea5b21..0f226d081a2bc0d2a7583cf962a6d1f08d98375b 100644 --- a/sql/alter.sql +++ b/sql/alter.sql @@ -18,4 +18,10 @@ CHANGE `title` `title` VARCHAR(255) NOT NULL, CHANGE `join_type` `join_type` VARCHAR(255) NOT NULL, ADD `weight` int NULL; -UPDATE `civicrm_data_processor_source` SET `weight` = `id`; \ No newline at end of file +UPDATE `civicrm_data_processor_source` SET `weight` = `id`; + +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, +CHANGE `storage_type` `storage_type` VARCHAR(255) NOT NULL; \ No newline at end of file diff --git a/sql/auto_install.sql b/sql/auto_install.sql index fe9e6fd6710a46be12f32b2938e31a4e9755c7dd..8de37b3528bf1481772a3479ca4ebbeb7f4ced39 100644 --- a/sql/auto_install.sql +++ b/sql/auto_install.sql @@ -66,6 +66,7 @@ DROP TABLE IF EXISTS `civicrm_data_processor_source`; DROP TABLE IF EXISTS `civicrm_data_processor_output`; DROP TABLE IF EXISTS `civicrm_data_processor_filter`; DROP TABLE IF EXISTS `civicrm_data_processor_field`; +DROP TABLE IF EXISTS `civicrm_data_processor`; SET FOREIGN_KEY_CHECKS=1; -- /******************************************************* @@ -74,6 +75,33 @@ SET FOREIGN_KEY_CHECKS=1; -- * -- *******************************************************/ +-- /******************************************************* +-- * +-- * civicrm_data_processor +-- * +-- *******************************************************/ +CREATE TABLE `civicrm_data_processor` ( + + + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'Unique DataProcessor ID', + `name` varchar(255) NULL , + `title` varchar(255) NOT NULL , + `type` varchar(255) NOT NULL , + `configuration` text NULL , + `aggregation` text NULL , + `is_active` tinyint NOT NULL , + `description` text NULL , + `storage_type` varchar(255) NULL , + `storage_configuration` text NULL , + `status` int unsigned NULL DEFAULT 0 , + `source_file` varchar(255) NULL +, + PRIMARY KEY (`id`) + + + +) ; + -- /******************************************************* -- * -- * civicrm_data_processor_field diff --git a/sql/auto_uninstall.sql b/sql/auto_uninstall.sql index 7a2aea0b512f41c6748fdc958cebdc501fd319bc..5d4ba700faf99bb819dfb1cc8c56c4d71d385c9b 100644 --- a/sql/auto_uninstall.sql +++ b/sql/auto_uninstall.sql @@ -37,5 +37,6 @@ DROP TABLE IF EXISTS `civicrm_data_processor_source`; DROP TABLE IF EXISTS `civicrm_data_processor_output`; DROP TABLE IF EXISTS `civicrm_data_processor_filter`; DROP TABLE IF EXISTS `civicrm_data_processor_field`; +DROP TABLE IF EXISTS `civicrm_data_processor`; SET FOREIGN_KEY_CHECKS=1; diff --git a/sql/create_civicrm_data_processor.sql b/sql/create_civicrm_data_processor.sql deleted file mode 100644 index fecba390c460fe2192c05cd0ba3f96d9db720b5f..0000000000000000000000000000000000000000 --- a/sql/create_civicrm_data_processor.sql +++ /dev/null @@ -1,15 +0,0 @@ -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, - `description` TEXT NULL, - `storage_type` VARCHAR(128) NULL, - `storage_configuration` TEXT NULL, - `status` TINYINT NULL DEFAULT 1, - `source_file` VARCHAR(255) NOT NULL DEFAULT '', - PRIMARY KEY (`id`) -) ENGINE = InnoDB; \ No newline at end of file diff --git a/sql/uninstall.sql b/sql/uninstall.sql deleted file mode 100644 index 7fad9d6a9e220056fb55ae4806443e1c26d7881d..0000000000000000000000000000000000000000 --- a/sql/uninstall.sql +++ /dev/null @@ -1,3 +0,0 @@ -DROP TABLE IF EXISTS `civicrm_data_processor_output`; -DROP TABLE IF EXISTS `civicrm_data_processor_source`; -DROP TABLE IF EXISTS `civicrm_data_processor`; \ No newline at end of file diff --git a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl index deab84407c43b1f5a5baea02cf58fcfcfd4548ff..37fb223c35154a6857a3b2a975a16201444e5c45 100644 --- a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl +++ b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl @@ -24,10 +24,19 @@ <div class="crm-block crm-form-block crm-data-processor_title-block"> <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 ($dataProcessor)}{$dataProcessor.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} @@ -55,6 +64,26 @@ {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/Outputs.tpl"} {/if} + <script type="text/javascript"> + {literal} + CRM.$(function($) { + var id = {/literal}{if ($dataProcessor)}{$dataProcessor.id}{else}false{/if}{literal}; + + $('#title').on('blur', function() { + var title = $('#title').val(); + if ($('#nameSection').hasClass('hiddenElement') && !id) { + CRM.api3('DataProcessor', 'check_name', { + 'title': title + }).done(function (result) { + $('#systemName').html(result.name); + $('#name').val(result.name); + }); + } + }); + }); + {/literal} + </script> + {/if} <div class="crm-submit-buttons"> diff --git a/xml/Menu/dataprocessor.xml b/xml/Menu/dataprocessor.xml index f3b8e96762e196e63919807cb842f77deab4da34..8e58a5205603a4f8a98dd868aca0a53467efc42d 100644 --- a/xml/Menu/dataprocessor.xml +++ b/xml/Menu/dataprocessor.xml @@ -56,13 +56,6 @@ <access_arguments>access CiviCRM</access_arguments> <access_arguments>administer CiviCRM</access_arguments> </item> - <item> - <path>civicrm/dataprocessor/form/joins/simple_join</path> - <page_callback>CRM_Dataprocessor_Form_Join_Simple</page_callback> - <title>DataProcessor</title> - <access_arguments>access CiviCRM</access_arguments> - <access_arguments>administer CiviCRM</access_arguments> - </item> <item> <path>civicrm/dataprocessor/form/output/download</path> <title>Browse Uploaded files</title> diff --git a/xml/schema/CRM/Dataprocessor/DataProcessor.entityType.php b/xml/schema/CRM/Dataprocessor/DataProcessor.entityType.php new file mode 100644 index 0000000000000000000000000000000000000000..225f3335dc629df90ec6438b340326c0f3933508 --- /dev/null +++ b/xml/schema/CRM/Dataprocessor/DataProcessor.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' => 'DataProcessor', + 'class' => 'CRM_Dataprocessor_DAO_DataProcessor', + 'table' => 'civicrm_data_processor', + ), +); diff --git a/xml/schema/CRM/Dataprocessor/DataProcessor.xml b/xml/schema/CRM/Dataprocessor/DataProcessor.xml new file mode 100644 index 0000000000000000000000000000000000000000..ebcc8997a3632ed5b51337cf9bf18c9213aaa244 --- /dev/null +++ b/xml/schema/CRM/Dataprocessor/DataProcessor.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="iso-8859-1" ?> + +<table> + <base>CRM/Dataprocessor</base> + <class>DataProcessor</class> + <name>civicrm_data_processor</name> + <log>false</log> + + <field> + <name>id</name> + <type>int unsigned</type> + <required>true</required> + <comment>Unique DataProcessor ID</comment> + </field> + <primaryKey> + <name>id</name> + <autoincrement>true</autoincrement> + </primaryKey> + <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>configuration</name> + <title>Configuration</title> + <type>text</type> + <required>false</required> + <length>255</length> + <serialize>JSON</serialize> + </field> + <field> + <name>aggregation</name> + <title>Aggregation Fields</title> + <type>text</type> + <required>false</required> + <length>255</length> + <serialize>JSON</serialize> + </field> + <field> + <name>is_active</name> + <title>Is active</title> + <type>boolean</type> + <required>true</required> + </field> + <field> + <name>description</name> + <title>Description</title> + <type>text</type> + <required>false</required> + <length>255</length> + </field> + <field> + <name>storage_type</name> + <title>Storage Type</title> + <type>varchar</type> + <required>false</required> + <length>255</length> + </field> + <field> + <name>storage_configuration</name> + <title>Storage Configuration</title> + <type>text</type> + <required>false</required> + <length>255</length> + <serialize>JSON</serialize> + </field> + <field> + <name>status</name> + <title>Status</title> + <type>int unsigned</type> + <required>false</required> + <default>0</default> + </field> + <field> + <name>source_file</name> + <title>Source File</title> + <type>varchar</type> + <required>false</required> + <length>255</length> + </field> + +</table>