Add abstract core Task class
authorMatthew Wire <devel@mrwire.co.uk>
Tue, 2 Jan 2018 09:00:40 +0000 (16:00 +0700)
committerMatthew Wire <devel@mrwire.co.uk>
Fri, 19 Jan 2018 03:29:08 +0000 (10:29 +0700)
CRM/Core/Task.php [new file with mode: 0644]

diff --git a/CRM/Core/Task.php b/CRM/Core/Task.php
new file mode 100644 (file)
index 0000000..96a64e8
--- /dev/null
@@ -0,0 +1,202 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 4.7                                                |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2017                                |
+ +--------------------------------------------------------------------+
+ | 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
+ * @copyright CiviCRM LLC (c) 2004-2017
+ */
+
+/**
+ * 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() {
+    CRM_Utils_Hook::searchTasks(self::$objectType, self::$_tasks);
+    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
+   * This function should be call parent::corePermissionedTaskTitles
+   *
+   * @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
+   */
+  abstract public static function permissionedTaskTitles($permission, $params);
+
+  /**
+   * 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();
+  }
+
+}