+--------------------------------------------------------------------+
*/
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- */
-
-
namespace Civi\Api4\Generic;
use Civi\API\Exception\NotImplementedException;
*
* @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);
}
}