Skip to content
Snippets Groups Projects
UIOutputHelper.php 8.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • jaapjansma's avatar
    jaapjansma committed
    <?php
    /**
     * @author Jaap Jansma <jaap.jansma@civicoop.org>
     * @license AGPL-3.0
     */
    
    
    jaapjansma's avatar
    jaapjansma committed
    namespace Civi\DataProcessor\Output;
    
    jaapjansma's avatar
    jaapjansma committed
    
    
    jaapjansma's avatar
    jaapjansma committed
    /**
     * Class UIOutputHelper
     *
     * An helper class for the UIOutput
     *
     * @package Civi\DataProcessor\Output
     */
    class UIOutputHelper {
    
    jaapjansma's avatar
    jaapjansma committed
    
    
      private static $rebuildMenu = false;
    
      /**
       * Delegation of the alter menu hook. Add the search outputs to the menu system.
       *
       * @param $items
       */
      public static function alterMenu(&$items) {
    
    jaapjansma's avatar
    jaapjansma committed
        $factory = dataprocessor_get_factory();
    
        // Check whether the factory exists. Usually just after
        // installation the factory does not exists but then no
        // outputs exists either. So we can safely return this function.
        if (!$factory) {
          return;
        }
    
    jaapjansma's avatar
    jaapjansma committed
    
    
        $sql = "
    
    jaapjansma's avatar
    jaapjansma committed
        SELECT o.permission, p.id, p.title, o.configuration, o.type, o.id as output_id 
    
        FROM civicrm_data_processor_output o 
        INNER JOIN civicrm_data_processor p ON o.data_processor_id = p.id 
    
    jaapjansma's avatar
    jaapjansma committed
        WHERE p.is_active = 1";
    
    jaapjansma's avatar
    jaapjansma committed
        $dao = \CRM_Core_DAO::executeQuery($sql);
    
        while ($dao->fetch()) {
    
    jaapjansma's avatar
    jaapjansma committed
          $outputClass = $factory->getOutputByName($dao->type);
    
    jaapjansma's avatar
    jaapjansma committed
          if ($outputClass instanceof \Civi\DataProcessor\Output\UIOutputInterface) {
    
    jaapjansma's avatar
    jaapjansma committed
            $output = civicrm_api3('DataProcessorOutput', 'getsingle', array('id' => $dao->output_id));
    
    jaapjansma's avatar
    jaapjansma committed
            $dataprocessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dao->id));
    
    jaapjansma's avatar
    jaapjansma committed
            $url = $outputClass->getUrlToUi($output, $dataprocessor);
    
    jaapjansma's avatar
    jaapjansma committed
    
            $configuration = json_decode($dao->configuration, TRUE);
            $title = $dao->title;
            if (isset($configuration['title'])) {
              $title = $configuration['title'];
            }
            $item = [
              'title' => $title,
    
    jaapjansma's avatar
    jaapjansma committed
              'page_callback' => $outputClass->getCallbackForUi(),
    
              'access_arguments' => [[$dao->permission], 'and'],
    
    jaapjansma's avatar
    jaapjansma committed
            ];
            $items[$url] = $item;
    
    jaapjansma's avatar
    jaapjansma committed
      /**
       * Update the navigation data when an output is saved/deleted from the database.
       *
       * @param $op
       * @param $objectName
       * @param $objectId
       * @param $objectRef
       */
      public static function preHook($op, $objectName, $id, &$params) {
    
    jaapjansma's avatar
    jaapjansma committed
        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
    
              $configuration = array_merge($output['configuration'], $params['configuration']);
    
    jaapjansma's avatar
    jaapjansma committed
              $output = array_merge($output, $params);
    
              $output['configuration'] = $configuration;
    
    jaapjansma's avatar
    jaapjansma committed
              $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;
            }
    
    jaapjansma's avatar
    jaapjansma committed
          }
    
    jaapjansma's avatar
    jaapjansma committed
        } 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);
    
    jaapjansma's avatar
    jaapjansma committed
              }
            }
          }
        }
    
    jaapjansma's avatar
    jaapjansma committed
      }
    
      /**
       * 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;
    
        }
      }
    
      /**
       * Update the navigation data when an output is saved/deleted from the database.
       *
       * @param $op
       * @param $objectName
       * @param $objectId
       * @param $objectRef
       */
      public static function postHook($op, $objectName, $id, &$objectRef) {
        if ($objectName != 'DataProcessorOutput') {
          return;
    
    jaapjansma's avatar
    jaapjansma committed
        }
    
    
        if (self::$rebuildMenu) {
    
    jaapjansma's avatar
    jaapjansma committed
          // Rebuild the CiviCRM Menu (which holds all the pages)
    
    jaapjansma's avatar
    jaapjansma committed
          \CRM_Core_Menu::store();
    
    
          // also reset navigation
    
    jaapjansma's avatar
    jaapjansma committed
          \CRM_Core_BAO_Navigation::resetNavigation();
    
          self::$rebuildMenu = false;
    
    jaapjansma's avatar
    jaapjansma committed
        }
      }
    
      /**
       * Convert the navigation_id to the parent path of the navigation
       * @param $dataProcessor
       */
      public static function hookExport(&$dataProcessor) {
    
    jaapjansma's avatar
    jaapjansma committed
        $navigation = \CRM_Dataprocessor_Utils_Navigation::singleton();
    
    jaapjansma's avatar
    jaapjansma committed
        foreach($dataProcessor['outputs'] as $idx => $output) {
          if (isset($output['configuration']['navigation_id'])) {
            $dataProcessor['outputs'][$idx]['configuration']['navigation_parent_path'] = $navigation->getNavigationParentPathById($output['configuration']['navigation_id']);
            unset($dataProcessor['outputs'][$idx]['configuration']['navigation_id']);
          }
        }
      }
    
      /**
       * Inserts/updates an navigation item.
       * @param $params
       * @param $dataProcessor
       *
    
    jaapjansma's avatar
    jaapjansma committed
       * @return array
    
    jaapjansma's avatar
    jaapjansma committed
       */
    
    jaapjansma's avatar
    jaapjansma committed
      private static function createOrUpdateNavigationItem($output, $dataProcessor) {
    
    jaapjansma's avatar
    jaapjansma committed
        $url = "";
        $factory = dataprocessor_get_factory();
    
    jaapjansma's avatar
    jaapjansma committed
        if (!isset($output['type'])) {
          return false;
    
    jaapjansma's avatar
    jaapjansma committed
        }
    
    jaapjansma's avatar
    jaapjansma committed
        $outputClass = $factory->getOutputByName($output['type']);
        $configuration = $output['configuration'];
    
    jaapjansma's avatar
    jaapjansma committed
        if ($outputClass && $outputClass instanceof \Civi\DataProcessor\Output\UIOutputInterface) {
    
    jaapjansma's avatar
    jaapjansma committed
          $url = $outputClass->getUrlToUi($output, $dataProcessor);
    
    jaapjansma's avatar
    jaapjansma committed
        $navigation = \CRM_Dataprocessor_Utils_Navigation::singleton();
    
    jaapjansma's avatar
    jaapjansma committed
        $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;
          }
        }
    
    
    jaapjansma's avatar
    jaapjansma committed
        $navigationParams['domain_id'] = \CRM_Core_Config::domainID();
    
    jaapjansma's avatar
    jaapjansma committed
        $navigationParams['permission'] = array();
    
    jaapjansma's avatar
    jaapjansma committed
        $navigationParams['label'] = isset($configuration['title']) ? $configuration['title'] : $dataProcessor['title'];
    
    jaapjansma's avatar
    jaapjansma committed
        $navigationParams['name'] = $dataProcessor['name'];
    
    
    jaapjansma's avatar
    jaapjansma committed
        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'];
    
    jaapjansma's avatar
    jaapjansma committed
    
    
    jaapjansma's avatar
    jaapjansma committed
        if (isset($output['permission'])) {
          $navigationParams['permission'][] = $output['permission'];
    
    jaapjansma's avatar
    jaapjansma committed
        }
    
    
    jaapjansma's avatar
    jaapjansma committed
        unset($configuration['navigation_parent_path']);
    
    jaapjansma's avatar
    jaapjansma committed
    
    
    jaapjansma's avatar
    jaapjansma committed
        $navigationParams['url'] = $url.'?reset=1';
    
    jaapjansma's avatar
    jaapjansma committed
        $navigation = \CRM_Core_BAO_Navigation::add($navigationParams);
        \CRM_Core_BAO_Navigation::resetNavigation();
    
    jaapjansma's avatar
    jaapjansma committed
    
    
    jaapjansma's avatar
    jaapjansma committed
        $configuration['navigation_id'] = $navigation->id;
    
        self::$rebuildMenu = TRUE;
    
    jaapjansma's avatar
    jaapjansma committed
    
    
    jaapjansma's avatar
    jaapjansma committed
        return $configuration;
    
    jaapjansma's avatar
    jaapjansma committed
      }
    
    }