/** * This function acts as a listener to dao->save, * and creates entries for linked entities in recurring entity table * * @param object $event * An object of /Civi/Core/DAO/Event/PostUpdate containing dao object that was just inserted . * * * @return void */ public static function triggerInsert($event) { $obj =& $event->object; if (!array_key_exists($obj->__table, self::$_linkedEntitiesInfo)) { return FALSE; } // if DB version is earlier than 4.6 skip any processing static $currentVer = NULL; if (!$currentVer) { $currentVer = CRM_Core_BAO_Domain::version(); } if (version_compare($currentVer, '4.6.alpha1') < 0) { return; } static $processedEntities = array(); if (empty($obj->id) || empty($obj->__table)) { return FALSE; } $key = "{$obj->__table}_{$obj->id}"; if (array_key_exists($key, $processedEntities)) { // already being processed. Exit recursive calls. return NULL; } if (self::getStatus() == self::RUNNING) { // if recursion->generate() is doing some work, lets not intercept return NULL; } // mark being processed $processedEntities[$key] = 1; // get related entities for table being saved $hasaRecurringRecord = self::getParentFor($obj->id, $obj->__table); if (empty($hasaRecurringRecord)) { // check if its a linked entity if (array_key_exists($obj->__table, self::$_linkedEntitiesInfo) && !CRM_Utils_Array::value('is_multirecord', self::$_linkedEntitiesInfo[$obj->__table])) { $linkedDAO = new self::$_tableDAOMapper[$obj->__table](); $linkedDAO->id = $obj->id; if ($linkedDAO->find(TRUE)) { $idCol = self::$_linkedEntitiesInfo[$obj->__table]['entity_id_col']; $tableCol = self::$_linkedEntitiesInfo[$obj->__table]['entity_table_col']; $pEntityID = $linkedDAO->{$idCol}; $pEntityTable = $linkedDAO->{$tableCol}; // find all parent recurring entity set $pRepeatingEntities = self::getEntitiesFor($pEntityID, $pEntityTable); if (!empty($pRepeatingEntities)) { // for each parent entity in the set, find out a similar linked entity, // if doesn't exist create one, and also create entries in recurring_entity table foreach ($pRepeatingEntities as $key => $val) { if (array_key_exists($key, $processedEntities)) { // this graph is already being processed return NULL; } $processedEntities[$key] = 1; } // start with first entry with just itself CRM_Core_BAO_RecurringEntity::quickAdd($obj->id, $obj->id, $obj->__table); foreach ($pRepeatingEntities as $key => $val) { $rlinkedDAO = new self::$_tableDAOMapper[$obj->__table](); $rlinkedDAO->{$idCol} = $val['id']; $rlinkedDAO->{$tableCol} = $val['table']; if ($rlinkedDAO->find(TRUE)) { CRM_Core_BAO_RecurringEntity::quickAdd($obj->id, $rlinkedDAO->id, $obj->__table); } else { // linked entity doesn't exist. lets create them $newCriteria = array($idCol => $val['id'], $tableCol => $val['table']); $linkedObj = CRM_Core_BAO_RecurringEntity::copyCreateEntity($obj->__table, array('id' => $obj->id), $newCriteria, TRUE); if ($linkedObj->id) { CRM_Core_BAO_RecurringEntity::quickAdd($obj->id, $linkedObj->id, $obj->__table); } } } } } } } // done with processing. lets unset static var. unset($processedEntities); }