From f99a2e5d664e0bae71fbb71fafd10f57af9b9aea Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Mon, 2 Jun 2014 23:03:23 -0700 Subject: [PATCH] CRM-14727 - SequenceListener fixes 1. Fire the case-change event outside the main transaction. When case-change listeners query the DB, they'll more understandable results. 2. Determine list of case-activities using $case['activities'] rather than trying to call Activity.get(case_id=X). Activity.get does not support filtering on case_id. --- CRM/Core/Transaction.php | 17 ++++++++++++----- Civi/CCase/Analyzer.php | 15 +++++++++++++-- Civi/CCase/Events.php | 17 ++++++++++++++++- Civi/Core/Container.php | 2 +- 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/CRM/Core/Transaction.php b/CRM/Core/Transaction.php index 63493f151e..17f7e9a88d 100644 --- a/CRM/Core/Transaction.php +++ b/CRM/Core/Transaction.php @@ -198,11 +198,18 @@ class CRM_Core_Transaction { * @param mixed $params Optional values to pass to callback. * See php manual call_user_func_array for details. */ - static public function addCallback($phase, $callback, $params = null) { - self::$_callbacks[$phase][] = array( - 'callback' => $callback, - 'parameters' => (is_array($params) ? $params : array($params)) - ); + static public function addCallback($phase, $callback, $params = null, $id = NULL) { + if ($id) { + self::$_callbacks[$phase][$id] = array( + 'callback' => $callback, + 'parameters' => (is_array($params) ? $params : array($params)) + ); + } else { + self::$_callbacks[$phase][] = array( + 'callback' => $callback, + 'parameters' => (is_array($params) ? $params : array($params)) + ); + } } /** diff --git a/Civi/CCase/Analyzer.php b/Civi/CCase/Analyzer.php index b16cedcd9f..2d94873126 100644 --- a/Civi/CCase/Analyzer.php +++ b/Civi/CCase/Analyzer.php @@ -102,8 +102,19 @@ class Analyzer { */ public function getActivities() { if ($this->activities === NULL) { - $result = civicrm_api3('Activity', 'get', array('case_id' => $this->caseId)); - $this->activities = $result['values']; + // TODO find batch-oriented API for getting all activities in a case + $case = $this->getCase(); + $activities = array(); + if (isset($case['activities'])) { + foreach ($case['activities'] as $actId) { + $result = civicrm_api3('Activity', 'get', array( + 'id' => $actId, + 'is_current_revision' => 1, + )); + $activities = array_merge($activities, $result['values']); + } + } + $this->activities = $activities; } return $this->activities; } diff --git a/Civi/CCase/Events.php b/Civi/CCase/Events.php index 85b6336820..472ac9f647 100644 --- a/Civi/CCase/Events.php +++ b/Civi/CCase/Events.php @@ -55,11 +55,26 @@ class Events { throw new \CRM_Core_Exception("CRM_Case_Listener does not support entity {$event->entity}"); } - if ($caseId && !isset(self::$isActive[$caseId])) { + if ($caseId) { + if (!isset(self::$isActive[$caseId])) { + \CRM_Core_Transaction::addCallback( + \CRM_Core_Transaction::PHASE_POST_COMMIT, + array(__CLASS__, 'fireCaseChangeForRealz'), + array($caseId), + "Civi_CCase_Events::fire::{$caseId}" + ); + } + } + } + + public static function fireCaseChangeForRealz($caseId) { + if (!isset(self::$isActive[$caseId])) { + $tx = new \CRM_Core_Transaction(); self::$isActive[$caseId] = 1; $analyzer = new \Civi\CCase\Analyzer($caseId); \CRM_Utils_Hook::caseChange($analyzer); unset(self::$isActive[$caseId]); + unset($tx); } } diff --git a/Civi/Core/Container.php b/Civi/Core/Container.php index faecd4b407..d1a0578c37 100644 --- a/Civi/Core/Container.php +++ b/Civi/Core/Container.php @@ -90,7 +90,7 @@ class Container { public function createEventDispatcher() { $dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher(); $dispatcher->addListener('hook_civicrm_post::Activity', array('\Civi\CCase\Events', 'fireCaseChange')); - $dispatcher->addListener('hook_civicrm_post::Case', array('\Civi\CCase\Events', 'fireCaseChange')); + //$dispatcher->addListener('hook_civicrm_post::Case', array('\Civi\CCase\Events', 'fireCaseChange')); $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\Events', 'delegateToXmlListeners')); $dispatcher->addListener('hook_civicrm_caseChange', array('\Civi\CCase\SequenceListener', 'onCaseChange_static')); return $dispatcher; -- 2.25.1