/** * Method to execute a single action * * @param object CRM_Civirules_TriggerData_TriggerData $triggerData * @param array $ruleAction * @access protected * @static */ protected static function executeAction(CRM_Civirules_TriggerData_TriggerData $triggerData, $ruleAction) { $object = CRM_Civirules_BAO_Action::getActionObjectById($ruleAction['action_id'], true); if (!$object) { return; } $object->setRuleActionData($ruleAction); //determine if the action should be executed with a delay $delay = self::getActionDelay($ruleAction, $object); if ($delay instanceof DateTime) { self::delayAction($delay, $object, $triggerData); } else { //there is no delay so process action immediatly $object->processAction($triggerData); } }
/** * CiviRuleAction.Create API * * @param array $params * @return array API result descriptor * @see civicrm_api3_create_success * @see civicrm_api3_create_error */ function civicrm_api3_civi_rule_action_create($params) { if (!isset($params['id']) && empty($params['label'])) { return civicrm_api3_create_error('Label can not be empty when adding a new CiviRule Action'); } if (empty($params['class_name']) && !isset($params['id'])) { return civicrm_api3_create_error('Class_name can not be empty'); } /* * set created or modified date and user_id */ $session = CRM_Core_Session::singleton(); $userId = $session->get('userID'); if (isset($params['id'])) { $params['modified_date'] = date('Ymd'); $params['modified_user_id'] = $userId; } else { $params['created_date'] = date('Ymd'); $params['created_user_id'] = $userId; } $returnValues = CRM_Civirules_BAO_Action::add($params); return civicrm_api3_create_success($returnValues, $params, 'CiviRuleAction', 'Create'); }
/** * Function to perform post save processing (extends parent function) * * @access public */ function postProcess() { $saveParams = array('rule_id' => $this->_submitValues['rule_id'], 'action_id' => $this->_submitValues['rule_action_select'], 'delay' => 'null'); if ($this->ruleActionId) { $saveParams['id'] = $this->ruleActionId; } if (!empty($this->_submitValues['delay_select'])) { $delayClass = CRM_Civirules_Delay_Factory::getDelayClassByName($this->_submitValues['delay_select']); $delayClass->setValues($this->_submitValues); $saveParams['delay'] = serialize($delayClass); } $ruleAction = CRM_Civirules_BAO_RuleAction::add($saveParams); $session = CRM_Core_Session::singleton(); $session->setStatus('Action added to CiviRule ' . CRM_Civirules_BAO_Rule::getRuleLabelWithId($this->_submitValues['rule_id']), 'Action added', 'success'); $action = CRM_Civirules_BAO_Action::getActionObjectById($ruleAction['action_id'], true); $redirectUrl = $action->getExtraDataInputUrl($ruleAction['id']); if (empty($redirectUrl) || $this->ruleActionId) { $redirectUrl = CRM_Utils_System::url('civicrm/civirule/form/rule', 'action=update&id=' . $this->_submitValues['rule_id'], TRUE); } elseif (!$this->ruleActionId) { $redirectUrl .= '&action=add'; } CRM_Utils_System::redirect($redirectUrl); }
/** * Function to get the rule actions for the rule * * @return array $ruleActions * @access protected */ protected function getRuleActions() { $actionParams = array('is_active' => 1, 'rule_id' => $this->ruleId); $ruleActions = CRM_Civirules_BAO_RuleAction::getValues($actionParams); foreach ($ruleActions as $ruleActionId => $ruleAction) { $actionClass = CRM_Civirules_BAO_Action::getActionObjectById($ruleAction['action_id']); $actionClass->setRuleActionData($ruleAction); $ruleActions[$ruleActionId]['label'] = CRM_Civirules_BAO_Action::getActionLabelWithId($ruleAction['action_id']); $ruleActions[$ruleActionId]['actions'] = $this->setRuleActionActions($ruleActionId, $actionClass); $ruleActions[$ruleActionId]['formattedConditionParams'] = $actionClass->userFriendlyConditionParams(); $ruleActions[$ruleActionId]['formattedDelay'] = ''; if (!empty($ruleAction['delay'])) { $delayClass = unserialize($ruleAction['delay']); $ruleActions[$ruleActionId]['formattedDelay'] = $delayClass->getDelayExplanation(); } } return $ruleActions; }
/** * CiviRuleAction.Get API * * @param array $params * @return array API result descriptor * @see civicrm_api3_create_success * @see civicrm_api3_create_error * @throws API_Exception */ function civicrm_api3_civi_rule_action_get($params) { $returnValues = CRM_Civirules_BAO_Action::getValues($params); return civicrm_api3_create_success($returnValues, $params, 'CiviRuleAction', 'Get'); }
/** * CiviRuleAction.Create API * * @param array $params * @return array API result descriptor * @see civicrm_api3_create_success * @see civicrm_api3_create_error */ function civicrm_api3_civi_rule_action_delete($params) { CRM_Civirules_BAO_Action::deleteWithId($params['id']); $returnValues[$params['id']] = array(); return civicrm_api3_create_success($returnValues, $params, 'CiviRuleAction', 'Create'); }
/** * Function to build the action list * * @return array $actionList * @access public * @static */ public static function buildActionList() { $actionList = array(); $actions = CRM_Civirules_BAO_Action::getValues(array()); foreach ($actions as $actionId => $action) { $actionList[$actionId] = $action['label']; } return $actionList; }
/** * Get the action class for this condition * * @param $actionId * @param bool $abort if true this function will throw an exception if class could not be instantiated * @return CRM_Civirules_Action * @throws Exception if abort is set to true and class does not exist or is not valid */ public static function getActionObjectById($actionId, $abort = true) { $action = new CRM_Civirules_BAO_Action(); $action->id = $actionId; if (!$action->find(true)) { if ($abort) { throw new Exception('CiviRule could not find action'); } return false; } $className = $action->class_name; if (!class_exists($className)) { if ($abort) { throw new Exception('CiviRule action class "' . $className . '" does not exist'); } return false; } $object = new $className(); if (!$object instanceof CRM_Civirules_Action) { if ($abort) { throw new Exception('CiviRule action class "' . $className . '" is not a subclass of CRM_Civirules_Action'); } return false; } $actionData = array(); CRM_Core_DAO::storeValues($action, $actionData); $object->setActionData($actionData); return $object; }
/** * Logs a message to the logger * * @param $message * @param \CRM_Civirules_TriggerData_TriggerData|NULL $triggerData * @param string $level Should be one of \Psr\Log\LogLevel */ protected function logAction($message, CRM_Civirules_TriggerData_TriggerData $triggerData = null, $level = \Psr\Log\LogLevel::INFO) { $context = array(); $context['message'] = $message; $context['rule_id'] = $this->ruleAction['rule_id']; $rule = new CRM_Civirules_BAO_Rule(); $rule->id = $this->ruleAction['rule_id']; $context['rule_title'] = ''; if ($rule->find(true)) { $context['rule_title'] = $rule->label; } $context['rule_action_id'] = $this->ruleAction['id']; $context['action_label'] = CRM_Civirules_BAO_Action::getActionLabelWithId($this->ruleAction['action_id']); $context['action_parameters'] = $this->userFriendlyConditionParams(); $context['contact_id'] = $triggerData ? $triggerData->getContactId() : -1; $msg = "{action_label} (ID: {rule_action_id})\r\n\r\n{message}\r\n\r\nRule: '{rule_title}' with id {rule_id}"; if ($context['contact_id'] > 0) { $msg .= "\r\nFor contact: {contact_id}"; } CRM_Civirules_Utils_LoggerFactory::log($msg, $context, $level); }