* @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))
+ );
+ }
}
/**
*/
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;
}
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);
}
}
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;