diff --git a/CRM/Dataprocessor/Upgrader.php b/CRM/Dataprocessor/Upgrader.php index f829cda13b3f93bd7f7399440db850703fe0177f..0a663251837286198bc5ed64d602326d5be43ee9 100644 --- a/CRM/Dataprocessor/Upgrader.php +++ b/CRM/Dataprocessor/Upgrader.php @@ -11,7 +11,16 @@ class CRM_Dataprocessor_Upgrader extends CRM_Dataprocessor_Upgrader_Base { } public function uninstall() { - + // Remove output from menu + $dao = CRM_Core_DAO::executeQuery("SELECT configuration FROM civicrm_data_processor_output"); + while($dao->fetch()) { + $configuration = json_decode($dao->configuration, true); + if (isset($configuration['navigation_id']) && $configuration['navigation_id']) { + $navId = $configuration['navigation_id']; + \CRM_Core_BAO_Navigation::processDelete($navId); + } + } + \CRM_Core_BAO_Navigation::resetNavigation(); } } diff --git a/Civi/DataProcessor/Output/UIOutputHelper.php b/Civi/DataProcessor/Output/UIOutputHelper.php index 5a3eefd66f1e47efbfeff2eaa99f8a3f3ece6044..e89a54d50ece1df360c75f861a2615f615845143 100644 --- a/Civi/DataProcessor/Output/UIOutputHelper.php +++ b/Civi/DataProcessor/Output/UIOutputHelper.php @@ -68,49 +68,62 @@ class UIOutputHelper { * @param $objectRef */ public static function preHook($op, $objectName, $id, &$params) { - if ($objectName != 'DataProcessorOutput') { - return; - } - if ($op == 'delete') { - $output = civicrm_api3('DataProcessorOutput', 'getsingle', array('id' => $id)); - if (isset($output['configuration']['navigation_id'])) { - $navId = $output['configuration']['navigation_id']; - \CRM_Core_BAO_Navigation::processDelete($navId); - \CRM_Core_BAO_Navigation::resetNavigation(); - self::$rebuildMenu = TRUE; + if ($objectName == 'DataProcessorOutput') { + if ($op == 'delete') { + $output = civicrm_api3('DataProcessorOutput', 'getsingle', ['id' => $id]); + self::removeOutputFromNavigation($output['configuration']); + } + elseif ($op == 'edit') { + $output = civicrm_api3('DataProcessorOutput', 'getsingle', ['id' => $id]); + if (!isset($output['configuration']['navigation_id']) && !isset($params['configuration']['navigation_parent_path'])) { + return; + } + elseif (!isset($params['configuration']['navigation_parent_path'])) { + self::removeOutputFromNavigation($output['configuration']); + } + else { + // Merge the current output from the database with the updated values + $output = array_merge($output, $params); + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', ['id' => $output['data_processor_id']]); + $configuration = self::createOrUpdateNavigationItem($output, $dataProcessor); + if ($configuration) { + $params['configuration'] = $configuration; + } + } + } + elseif ($op == 'create' && isset($params['configuration']['navigation_parent_path'])) { + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', ['id' => $params['data_processor_id']]); + $configuration = self::createOrUpdateNavigationItem($params, $dataProcessor); + if ($configuration) { + $params['configuration'] = $configuration; + } } - } elseif ($op == 'edit') { - $output = civicrm_api3('DataProcessorOutput', 'getsingle', array('id' => $id)); - if (!isset($output['configuration']['navigation_id']) && !isset($params['configuration']['navigation_parent_path'])) { - return; - } elseif (!isset($params['configuration']['navigation_parent_path'])) { - // Delete the navigation item - $navId = $output['configuration']['navigation_id']; - \CRM_Core_BAO_Navigation::processDelete($navId); - \CRM_Core_BAO_Navigation::resetNavigation(); - self::$rebuildMenu = TRUE; - } else { - $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $output['data_processor_id'])); - - // Retrieve the current navigation params. - $navigationParams = []; - if (isset($output['configuration']['navigation_id'])) { - // Get the default navigation parent id. - $navigationDefaults = []; - $navParams = ['id' => $output['configuration']['navigation_id']]; - \CRM_Core_BAO_Navigation::retrieve($navParams, $navigationDefaults); - if (!empty($navigationDefaults['id'])) { - $navigationParams['id'] = $navigationDefaults['id']; - $navigationParams['current_parent_id'] = !empty($navigationDefaults['parent_id']) ? $navigationDefaults['parent_id'] : NULL; - $navigationParams['parent_id'] = !empty($navigationDefaults['parent_id']) ? $navigationDefaults['parent_id'] : NULL; + } elseif ($objectName == 'DataProcessor' && $op == 'edit') { + $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', ['id' => $id]); + if (isset($params['is_active']) && $params['is_active'] != $dataProcessor['is_active']) { + // Only update navigation when is active is changed + $dataProcessor = array_merge($dataProcessor, $params); + $outputs = civicrm_api3('DataProcessorOutput', 'get', ['data_processor_id' => $id, 'options' => ['limit' => 0]]); + foreach($outputs['values'] as $output) { + if (isset($output['configuration']['navigation_id'])) { + self::createOrUpdateNavigationItem($output, $dataProcessor); } } - self::$rebuildMenu = self::newNavigationItem($params, $dataProcessor, $navigationParams, $output); } } - elseif ($op == 'create' && isset($params['configuration']['navigation_parent_path'])) { - $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $params['data_processor_id'])); - self::$rebuildMenu = self::newNavigationItem($params, $dataProcessor); + } + + /** + * Remove an output from the navigation menu. + * + * @param array $configuration + */ + private static function removeOutputFromNavigation($configuration) { + if (isset($configuration['navigation_id'])) { + $navId = $configuration['navigation_id']; + \CRM_Core_BAO_Navigation::processDelete($navId); + \CRM_Core_BAO_Navigation::resetNavigation(); + self::$rebuildMenu = TRUE; } } @@ -155,46 +168,63 @@ class UIOutputHelper { * Inserts/updates an navigation item. * @param $params * @param $dataProcessor - * @param array $navigationParams * - * @return bool + * @return array */ - private static function newNavigationItem(&$params, $dataProcessor, $navigationParams=array(), $output=null) { + private static function createOrUpdateNavigationItem($output, $dataProcessor) { $url = ""; $factory = dataprocessor_get_factory(); - $outputClass = FALSE; - if (isset($params['type'])) { - $outputClass = $factory->getOutputByName($params['type']); - } elseif(isset($output['type'])) { - $outputClass = $factory->getOutputByName($output['type']); + if (!isset($output['type'])) { + return false; } + $outputClass = $factory->getOutputByName($output['type']); + $configuration = $output['configuration']; if ($outputClass && $outputClass instanceof \Civi\DataProcessor\Output\UIOutputInterface) { - $url = $outputClass->getUrlToUi($params, $dataProcessor); + $url = $outputClass->getUrlToUi($output, $dataProcessor); } $navigation = \CRM_Dataprocessor_Utils_Navigation::singleton(); + $navigationParams = array(); + + // Retrieve the current navigation ID. + if (isset($configuration['navigation_id'])) { + // Get the default navigation parent id. + $navigationDefaults = []; + $retrieveNavParams = ['id' => $configuration['navigation_id']]; + \CRM_Core_BAO_Navigation::retrieve($retrieveNavParams, $navigationDefaults); + if (!empty($navigationDefaults['id'])) { + $navigationParams['id'] = $navigationDefaults['id']; + $navigationParams['current_parent_id'] = !empty($navigationDefaults['parent_id']) ? $navigationDefaults['parent_id'] : NULL; + $navigationParams['parent_id'] = !empty($navigationDefaults['parent_id']) ? $navigationDefaults['parent_id'] : NULL; + } + } + $navigationParams['domain_id'] = \CRM_Core_Config::domainID(); $navigationParams['permission'] = array(); - $navigationParams['label'] = isset($params['configuration']['title']) ? $params['configuration']['title'] : $dataProcessor['title']; + $navigationParams['label'] = isset($configuration['title']) ? $configuration['title'] : $dataProcessor['title']; $navigationParams['name'] = $dataProcessor['name']; - $navigationParams['parent_id'] = $navigation->getNavigationIdByPath($params['configuration']['navigation_parent_path']); - $navigationParams['is_active'] = 1; + if (!isset($navigationParams['parent_id']) && isset($configuration['navigation_parent_path'])) { + $navigationParams['parent_id'] = $navigation->getNavigationIdByPath($configuration['navigation_parent_path']); + } + $navigationParams['is_active'] = $dataProcessor['is_active']; - if (isset($params['permission'])) { - $navigationParams['permission'][] = $params['permission']; + if (isset($output['permission'])) { + $navigationParams['permission'][] = $output['permission']; } - unset($params['configuration']['navigation_parent_path']); + unset($configuration['navigation_parent_path']); $navigationParams['url'] = $url.'?reset=1'; $navigation = \CRM_Core_BAO_Navigation::add($navigationParams); \CRM_Core_BAO_Navigation::resetNavigation(); - $params['configuration']['navigation_id'] = $navigation->id; + $configuration['navigation_id'] = $navigation->id; + + self::$rebuildMenu = TRUE; - return true; + return $configuration; } } \ No newline at end of file