Merge pull request #23348 from colemanw/getFieldsSuffixes
[civicrm-core.git] / Civi / Api4 / Generic / BasicBatchAction.php
index afe8458014911f6ff971e75769d51a965995f5ef..e9c02e69402e138df2da5b1781f3ebe8606c31f0 100644 (file)
@@ -43,26 +43,52 @@ class BasicBatchAction extends AbstractBatchAction {
    *
    * @param string $entityName
    * @param string $actionName
-   * @param string|array $select
-   *   One or more fields to select from each matching item.
    * @param callable $doer
    */
-  public function __construct($entityName, $actionName, $select = 'id', $doer = NULL) {
-    parent::__construct($entityName, $actionName, $select);
+  public function __construct($entityName, $actionName, $doer = NULL) {
+    parent::__construct($entityName, $actionName);
     $this->doer = $doer;
+    // Accept doer as 4th param for now, but emit deprecated warning
+    $this->doer = func_get_args()[3] ?? NULL;
+    if ($this->doer) {
+      \CRM_Core_Error::deprecatedWarning(__CLASS__ . ' constructor received $doer as 4th param; it should be the 3rd as the $select param has been removed');
+    }
+    else {
+      $this->doer = $doer;
+    }
   }
 
   /**
-   * We pass the doTask function an array representing one item to update.
-   * We expect to get the same format back.
+   * Checks permissions and then delegates to processBatch.
+   *
+   * Note: Unconditional logic must go here in the run function, as delegated functions may be overridden.
    *
    * @param \Civi\Api4\Generic\Result $result
    */
   public function _run(Result $result) {
-    foreach ($this->getBatchRecords() as $item) {
+    $items = $this->getBatchRecords();
+    foreach ($items as $item) {
       if ($this->checkPermissions && !CoreUtil::checkAccessRecord($this, $item, \CRM_Core_Session::getLoggedInContactID() ?: 0)) {
         throw new UnauthorizedException("ACL check failed");
       }
+    }
+    $this->processBatch($result, $items);
+  }
+
+  /**
+   * Calls doTask once per item and stores the result.
+   *
+   * We pass the doTask function an array representing one item to process.
+   * We expect to get the same format back.
+   *
+   * Note: This function may be overridden by the end api.
+   *
+   * @param Result $result
+   * @param array $items
+   * @throws NotImplementedException
+   */
+  protected function processBatch(Result $result, array $items) {
+    foreach ($items as $item) {
       $result[] = $this->doTask($item);
     }
   }