class ActionExpression

Provides an executable action expression.

This plugin is used to wrap action plugins and is responsible to setup all the context necessary, instantiate the action plugin and to execute it.

Plugin annotation


@RulesExpression(
  id = "rules_action",
  label = @Translation("Action"),
  form_class = "\Drupal\rules\Form\Expression\ActionForm"
)

Hierarchy

Expanded class hierarchy of ActionExpression

2 files declare their use of ActionExpression
ActionSetExpressionTest.php in tests/src/Unit/ActionSetExpressionTest.php
RuleExpressionTest.php in tests/src/Unit/RuleExpressionTest.php

File

src/Plugin/RulesExpression/ActionExpression.php, line 30

Namespace

Drupal\rules\Plugin\RulesExpression
View source
class ActionExpression extends ExpressionBase implements ContainerFactoryPluginInterface, ActionExpressionInterface {
    use ContextHandlerIntegrityTrait;
    
    /**
     * The action manager used to instantiate the action plugin.
     *
     * @var \Drupal\rules\Core\RulesActionManagerInterface
     */
    protected $actionManager;
    
    /**
     * The rules debug logger channel.
     *
     * @var \Drupal\Core\Logger\LoggerChannelInterface
     */
    protected $rulesDebugLogger;
    
    /**
     * Constructs a new class instance.
     *
     * @param array $configuration
     *   A configuration array containing information about the plugin instance.
     *   Contains the following entries:
     *   - action_id: The action plugin ID.
     * @param string $plugin_id
     *   The plugin ID for the plugin instance.
     * @param mixed $plugin_definition
     *   The plugin implementation definition.
     * @param \Drupal\rules\Core\RulesActionManagerInterface $action_manager
     *   The Rules action manager.
     * @param \Drupal\rules\Context\DataProcessorManager $processor_manager
     *   The data processor plugin manager.
     * @param \Drupal\Core\Logger\LoggerChannelInterface $logger
     *   The Rules debug logger channel.
     */
    public function __construct(array $configuration, $plugin_id, $plugin_definition, RulesActionManagerInterface $action_manager, DataProcessorManager $processor_manager, LoggerChannelInterface $logger) {
        parent::__construct($configuration, $plugin_id, $plugin_definition);
        $this->actionManager = $action_manager;
        $this->processorManager = $processor_manager;
        $this->rulesDebugLogger = $logger;
    }
    
    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
        return new static($configuration, $plugin_id, $plugin_definition, $container->get('plugin.manager.rules_action'), $container->get('plugin.manager.rules_data_processor'), $container->get('logger.channel.rules_debug'));
    }
    
    /**
     * {@inheritdoc}
     */
    public function setConfiguration(array $configuration) {
        // If the plugin id has been set already, keep it if not specified.
        if (isset($this->configuration['action_id'])) {
            $configuration += [
                'action_id' => $this->configuration['action_id'],
            ];
        }
        return parent::setConfiguration($configuration);
    }
    
    /**
     * {@inheritdoc}
     */
    public function executeWithState(ExecutionStateInterface $state) {
        $this->rulesDebugLogger
            ->info('Evaluating the action %name.', [
            '%name' => $this->getLabel(),
            'element' => $this,
        ]);
        $action = $this->actionManager
            ->createInstance($this->configuration['action_id']);
        $this->prepareContext($action, $state);
        $action->execute();
        $auto_saves = $action->autoSaveContext();
        foreach ($auto_saves as $context_name) {
            // Mark parameter contexts for auto saving in the Rules state.
            $state->saveChangesLater($this->configuration['context_mapping'][$context_name]);
        }
        // Now that the action has been executed it can provide additional
        // context which we will have to pass back in the evaluation state.
        $this->addProvidedContext($action, $state);
    }
    
    /**
     * {@inheritdoc}
     */
    public function getLabel() {
        if (!empty($this->configuration['action_id'])) {
            $definition = $this->actionManager
                ->getDefinition($this->configuration['action_id']);
            return $definition['label'];
        }
        return parent::getLabel();
    }
    
    /**
     * {@inheritdoc}
     */
    public function getFormHandler() {
        if (isset($this->pluginDefinition['form_class'])) {
            $class_name = $this->pluginDefinition['form_class'];
            return new $class_name($this, $this->actionManager);
        }
    }
    
    /**
     * {@inheritdoc}
     */
    public function checkIntegrity(ExecutionMetadataStateInterface $metadata_state, $apply_assertions = TRUE) {
        $violation_list = new IntegrityViolationList();
        if (empty($this->configuration['action_id'])) {
            $violation_list->addViolationWithMessage($this->t('Action plugin ID is missing'), $this->getUuid());
            return $violation_list;
        }
        if (!$this->actionManager
            ->hasDefinition($this->configuration['action_id'])) {
            $violation_list->addViolationWithMessage($this->t('Action plugin %plugin_id does not exist', [
                '%plugin_id' => $this->configuration['action_id'],
            ]), $this->getUuid());
            return $violation_list;
        }
        $action = $this->actionManager
            ->createInstance($this->configuration['action_id']);
        // Prepare and refine the context before checking integrity, such that any
        // context definition changes are respected while checking.
        $this->prepareContextWithMetadata($action, $metadata_state);
        $result = $this->checkContextConfigIntegrity($action, $metadata_state);
        $this->prepareExecutionMetadataState($metadata_state, NULL, $apply_assertions);
        return $result;
    }
    
    /**
     * {@inheritdoc}
     */
    public function prepareExecutionMetadataState(ExecutionMetadataStateInterface $metadata_state, ExpressionInterface $until = NULL, $apply_assertions = TRUE) {
        if ($until && $this->getUuid() === $until->getUuid()) {
            return TRUE;
        }
        $action = $this->actionManager
            ->createInstance($this->configuration['action_id']);
        // Make sure to refine context first, such that possibly refined definitions
        // of provided context are respected.
        $this->prepareContextWithMetadata($action, $metadata_state);
        $this->addProvidedContextDefinitions($action, $metadata_state);
        if ($apply_assertions) {
            $this->assertMetadata($action, $metadata_state);
        }
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
ActionExpression::$actionManager protected property The action manager used to instantiate the action plugin.
ActionExpression::$rulesDebugLogger protected property The rules debug logger channel.
ActionExpression::checkIntegrity public function Verifies that this expression is configured correctly. Overrides ExpressionInterface::checkIntegrity
ActionExpression::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create
ActionExpression::executeWithState public function Execute the expression with a given Rules state. Overrides ExpressionInterface::executeWithState
ActionExpression::getFormHandler public function Returns the form handling class for this expression. Overrides ExpressionBase::getFormHandler
ActionExpression::getLabel public function The label of this expression element that can be shown in the UI. Overrides ExpressionBase::getLabel
ActionExpression::prepareExecutionMetadataState public function Prepares the execution metadata state by adding metadata to it. Overrides ExpressionInterface::prepareExecutionMetadataState
ActionExpression::setConfiguration public function Sets the configuration for this plugin instance. Overrides ExpressionBase::setConfiguration
ActionExpression::__construct public function Constructs a new class instance. Overrides ExpressionBase::__construct
ContextHandlerIntegrityTrait::checkContextConfigIntegrity protected function Performs the integrity check.
ContextHandlerIntegrityTrait::checkDataTypeCompatible protected function Checks that the data type of a mapped variable matches the expectation.
ContextHandlerTrait::$processorManager protected property The data processor plugin manager used to process context variables.
ContextHandlerTrait::addProvidedContext protected function Adds provided context values from the plugin to the execution state.
ContextHandlerTrait::addProvidedContextDefinitions protected function Adds the definitions of provided context to the execution metadata state.
ContextHandlerTrait::assertMetadata protected function Asserts additional metadata.
ContextHandlerTrait::getMappedDefinition protected function Gets the definition of the data that is mapped to the given context.
ContextHandlerTrait::getSelectedData protected function Gets definitions of all selected data at configuration time.
ContextHandlerTrait::prepareContext protected function Prepares plugin context based upon the set context configuration.
ContextHandlerTrait::prepareContextWithMetadata protected function Prepares plugin context based upon the set context configuration.
ContextHandlerTrait::processData protected function Process data context on the plugin, usually before it gets executed.
ContextHandlerTrait::processValue protected function Processes a single value.
ExpressionBase::$configEntityId protected property The config entity this expression is associated with, if any.
ExpressionBase::$configuration protected property The plugin configuration.
ExpressionBase::$root protected property The root expression if this object is nested.
ExpressionBase::$uuid protected property The UUID of this expression.
ExpressionBase::$weight protected property The weight (list order) of this expression.
ExpressionBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies
ExpressionBase::defaultConfiguration public function Gets default configuration for this plugin. Overrides ConfigurableInterface::defaultConfiguration 2
ExpressionBase::execute public function Executes a rules expression. Overrides ExecutableInterface::execute
ExpressionBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration 3
ExpressionBase::getRoot public function Returns the root expression if this expression is nested. Overrides ExpressionInterface::getRoot
ExpressionBase::getUuid public function Returns the UUID of this expression if it is nested in another expression. Overrides ExpressionInterface::getUuid
ExpressionBase::getWeight public function Returns the list order of this expression. Overrides ExpressionInterface::getWeight
ExpressionBase::setRoot public function Set the root expression for this expression if it is nested. Overrides ExpressionInterface::setRoot
ExpressionBase::setUuid public function Sets the UUID of this expression in an expression tree. Overrides ExpressionInterface::setUuid
ExpressionBase::setWeight public function Sets the list order of this expression in an expression tree. Overrides ExpressionInterface::setWeight
PluginInspectionInterface::getPluginDefinition public function Gets the definition of the plugin implementation. 6
PluginInspectionInterface::getPluginId public function Gets the plugin_id of the plugin instance. 2