function rules_element_invoke_component
Action and condition callback: Invokes a rules component.
We do not use the execute() method, but handle executing ourself. That way we can utilize the existing state for saving passed variables.
Related topics
2 string references to 'rules_element_invoke_component'
- rules_rules_core_action_info in modules/
rules_core.rules.inc - Implements hook_rules_action_info() on behalf of the pseudo rules_core module.
- rules_rules_core_condition_info in modules/
rules_core.rules.inc - Implements hook_rules_condition_info() on behalf of the pseudo rules_core module.
File
-
modules/
rules_core.eval.inc, line 18
Code
function rules_element_invoke_component($arguments, RulesPlugin $element) {
$info = $element->info();
$state = $arguments['state'];
$wrapped_args = $state->currentArguments;
if ($component = rules_get_cache('comp_' . $info['#config_name'])) {
$replacements = array(
'%label' => $component->label(),
'@plugin' => $component->plugin(),
);
// Handle recursion prevention.
if ($state->isBlocked($component)) {
return rules_log('Not evaluating @plugin %label to prevent recursion.', $replacements, RulesLog::INFO, $component);
}
$state->block($component);
rules_log('Evaluating @plugin %label.', $replacements, RulesLog::INFO, $component, TRUE);
module_invoke_all('rules_config_execute', $component);
// Manually create a new evaluation state and evaluate the component.
$args = array_intersect_key($wrapped_args, $component->parameterInfo());
$new_state = $component->setUpState($wrapped_args);
$return = $component->evaluate($new_state);
// Care for the right return value in case we have to provide vars.
if ($component instanceof RulesActionInterface && !empty($info['provides'])) {
$return = array();
foreach ($info['provides'] as $var => $var_info) {
$return[$var] = $new_state->get($var);
}
}
// Now merge the info about to be saved variables in the parent state.
$state->mergeSaveVariables($new_state, $component, $element->settings);
$state->unblock($component);
// Cleanup the state, what saves not mergeable variables now.
$new_state->cleanup();
rules_log('Finished evaluation of @plugin %label.', $replacements, RulesLog::INFO, $component, FALSE);
return $return;
}
else {
throw new RulesEvaluationException('Unable to get the component %name', array(
'%name' => $info['#config_name'],
), $element, RulesLog::ERROR);
}
}