Task.php 6.71 KB
Newer Older
Matthew Wire's avatar
Matthew Wire committed
1 2 3 4 5
<?php
/*
 +--------------------------------------------------------------------+
 | CiviCRM version 4.7                                                |
 +--------------------------------------------------------------------+
yashodha's avatar
yashodha committed
6
 | Copyright CiviCRM LLC (c) 2004-2018                                |
Matthew Wire's avatar
Matthew Wire committed
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 +--------------------------------------------------------------------+
 | This file is a part of CiviCRM.                                    |
 |                                                                    |
 | CiviCRM is free software; you can copy, modify, and distribute it  |
 | under the terms of the GNU Affero General Public License           |
 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
 |                                                                    |
 | CiviCRM is distributed in the hope that it will be useful, but     |
 | WITHOUT ANY WARRANTY; without even the implied warranty of         |
 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
 | See the GNU Affero General Public License for more details.        |
 |                                                                    |
 | You should have received a copy of the GNU Affero General Public   |
 | License and the CiviCRM Licensing Exception along                  |
 | with this program; if not, contact CiviCRM LLC                     |
 | at info[AT]civicrm[DOT]org. If you have questions about the        |
 | GNU Affero General Public License or the licensing of CiviCRM,     |
 | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
 +--------------------------------------------------------------------+
 */

/**
 * @package CRM
yashodha's avatar
yashodha committed
30
 * @copyright CiviCRM LLC (c) 2004-2018
Matthew Wire's avatar
Matthew Wire committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
 */

/**
 * Class to represent the actions that can be performed on a group of contacts used by the search forms.
 */
abstract class CRM_Core_Task {

  /**
   * These constants are only used as enumerators for each of the batch tasks.
   */
  const
    // General (Implemented by more than one entity)
    GROUP_REMOVE = 1,
    GROUP_ADD = 2,
    PDF_LETTER = 3,
    TASK_DELETE = 4,
    TASK_PRINT = 5,
    BATCH_UPDATE = 6,
    TASK_SMS = 7,
    TASK_EXPORT = 8,
    TASK_EMAIL = 9,
    TAG_ADD = 10,
    TAG_REMOVE = 11,
    // Contact tasks
    SAVE_SEARCH = 12,
    SAVE_SEARCH_UPDATE = 13,
    CREATE_MAILING = 14,
    DELETE_PERMANENTLY = 15,
    LABEL_CONTACTS = 16;

  /**
   * The task array
   *
   * @var array
   */
  public static $_tasks = NULL;

  /**
   * @var string
   *   This must be defined in each child class.  It is passed to the searchTasks hook.
   *   Example: $objectType = 'event';
   */
  static $objectType = NULL;

  /**
   * Generates a list of batch tasks available for the current entities.
   * Each child class should populate $_tasks array and then call this parent function for shared functionality.
   *    * @return array The set of tasks for a group of contacts
   *            [ 'title' => The Task title,
   *              'class' => The Task Form class name,
   *              'result => Boolean.  FIXME: Not sure what this is for
   *            ]
   */
  public static function tasks() {
85
    CRM_Utils_Hook::searchTasks(static::$objectType, self::$_tasks);
Matthew Wire's avatar
Matthew Wire committed
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
    asort(self::$_tasks);

    return self::$_tasks;
  }

  /**
   * These tasks are the core set of tasks that the user can perform
   * on a contact / group of contacts
   *
   * @return array
   *   the set of tasks for a group of contacts
   */
  public static function taskTitles() {
    static::tasks();

    $titles = array();
    foreach (self::$_tasks as $id => $value) {
      $titles[$id] = $value['title'];
    }

    if (!CRM_Utils_Mail::validOutBoundMail()) {
      unset($titles[self::TASK_EMAIL]);
      unset($titles[self::CREATE_MAILING]);
    }

    // Users who do not have 'access deleted contacts' should NOT have the 'Delete Permanently' option in search result tasks
    if (!CRM_Core_Permission::check('access deleted contacts') ||
      !CRM_Core_Permission::check('delete contacts')
    ) {
      unset($titles[self::DELETE_PERMANENTLY]);
    }
    return $titles;
  }

  /**
   * Show tasks selectively based on the permission level
   * of the user
123
   * This function should be overridden by the child class which would normally call parent::corePermissionedTaskTitles
Matthew Wire's avatar
Matthew Wire committed
124 125 126 127 128 129 130 131
   *
   * @param int $permission
   * @param array $params
   *             "ssID: Saved Search ID": If !empty we are in saved search context
   *
   * @return array
   *   set of tasks that are valid for the user
   */
132 133 134
  public static function permissionedTaskTitles($permission, $params) {
    return self::corePermissionedTaskTitles(self::tasks(), $permission, $params);
  }
Matthew Wire's avatar
Matthew Wire committed
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204

  /**
   * Show tasks selectively based on the permission level
   * of the user
   * This function should be called by permissionedTaskTitles in children
   *
   * @param array $tasks The array of tasks generated by permissionedTaskTitles
   * @param int $permission
   * @param array $params
   *             "ssID: Saved Search ID": If !empty we are in saved search context
   *
   * @return array
   *   set of tasks that are valid for the user
   */
  public static function corePermissionedTaskTitles($tasks, $permission, $params) {
    // Only offer the "Update Smart Group" task if a smart group/saved search is already in play and we have edit permissions
    if (!empty($params['ssID']) && ($permission == CRM_Core_Permission::EDIT)) {
      $tasks[self::SAVE_SEARCH_UPDATE] = self::$_tasks[self::SAVE_SEARCH_UPDATE]['title'];
    }
    else {
      unset($tasks[self::SAVE_SEARCH_UPDATE]);
    }

    asort($tasks);
    return $tasks;
  }

  /**
   * These tasks are the core set of tasks that the user can perform
   * on participants
   *
   * @param int $value
   *
   * @return array
   *   the set of tasks for a group of participants
   */
  public static function getTask($value) {
    static::tasks();

    if (!CRM_Utils_Array::value($value, self::$_tasks)) {
      // Children can specify a default task (eg. print), we don't here
      return array();
    }
    return array(
      CRM_Utils_Array::value('class', self::$_tasks[$value]),
      CRM_Utils_Array::value('result', self::$_tasks[$value]),
    );
  }

  /**
   * Function to return the task information on basis of provided task's form name
   *
   * @param string $className
   *
   * @return array [ 0 => Task ID, 1 => Task Title ]
   */
  public static function getTaskAndTitleByClass($className) {
    static::tasks();

    foreach (self::$_tasks as $task => $value) {
      if ((!empty($value['url']) || $task == self::TASK_EXPORT)
          && ((is_array($value['class']) && in_array($className, $value['class']))
          || ($value['class'] == $className))) {
        return array($task, CRM_Utils_Array::value('title', $value));
      }
    }
    return array();
  }

}