You are here

protected function ContextHandlerIntegrityTrait::checkContextConfigIntegrity in Rules 8.3

Performs the integrity check.

Parameters

\Drupal\Core\Plugin\ContextAwarePluginInterface $plugin: The plugin with its defined context.

\Drupal\rules\Context\ExecutionMetadataStateInterface $metadata_state: The current configuration state with all defined variables that are available.

Return value

\Drupal\rules\Engine\IntegrityViolationList The list of integrity violations.

2 calls to ContextHandlerIntegrityTrait::checkContextConfigIntegrity()
ActionExpression::checkIntegrity in src/Plugin/RulesExpression/ActionExpression.php
Verifies that this expression is configured correctly.
ConditionExpression::checkIntegrity in src/Plugin/RulesExpression/ConditionExpression.php
Verifies that this expression is configured correctly.

File

src/Context/ContextHandlerIntegrityTrait.php, line 35

Class

ContextHandlerIntegrityTrait
Extends the context handler trait with support for checking integrity.

Namespace

Drupal\rules\Context

Code

protected function checkContextConfigIntegrity(CoreContextAwarePluginInterface $plugin, ExecutionMetadataStateInterface $metadata_state) {
  $violation_list = new IntegrityViolationList();
  $context_definitions = $plugin
    ->getContextDefinitions();

  // Make sure that all provided variables by this plugin are added to the
  // execution metadata state.
  $this
    ->addProvidedContextDefinitions($plugin, $metadata_state);
  foreach ($context_definitions as $name => $context_definition) {

    // Check if a data selector is configured that maps to the state.
    if (isset($this->configuration['context_mapping'][$name])) {
      try {
        $data_definition = $this
          ->getMappedDefinition($name, $metadata_state);
        $this
          ->checkDataTypeCompatible($context_definition, $data_definition, $name, $violation_list);
      } catch (IntegrityException $e) {
        $violation = new IntegrityViolation();
        $violation
          ->setMessage($this
          ->t('Data selector %selector for context %context_name is invalid. @message', [
          '%selector' => $this->configuration['context_mapping'][$name],
          '%context_name' => $context_definition
            ->getLabel(),
          '@message' => $e
            ->getMessage(),
        ]));
        $violation
          ->setContextName($name);
        $violation
          ->setUuid($this
          ->getUuid());
        $violation_list
          ->add($violation);
      }
      if ($context_definition instanceof RulesContextDefinitionInterface && $context_definition
        ->getAssignmentRestriction() === RulesContextDefinitionInterface::ASSIGNMENT_RESTRICTION_INPUT) {
        $violation = new IntegrityViolation();
        $violation
          ->setMessage($this
          ->t('The context %context_name may not be configured using a selector.', [
          '%context_name' => $context_definition
            ->getLabel(),
        ]));
        $violation
          ->setContextName($name);
        $violation
          ->setUuid($this
          ->getUuid());
        $violation_list
          ->add($violation);
      }
    }
    elseif (isset($this->configuration['context_values'][$name])) {
      if ($context_definition instanceof RulesContextDefinitionInterface && $context_definition
        ->getAssignmentRestriction() === RulesContextDefinitionInterface::ASSIGNMENT_RESTRICTION_SELECTOR) {
        $violation = new IntegrityViolation();
        $violation
          ->setMessage($this
          ->t('The context %context_name may only be configured using a selector.', [
          '%context_name' => $context_definition
            ->getLabel(),
        ]));
        $violation
          ->setContextName($name);
        $violation
          ->setUuid($this
          ->getUuid());
        $violation_list
          ->add($violation);
      }
    }
    elseif ($context_definition
      ->isRequired() && $context_definition
      ->getDefaultValue() === NULL) {
      $violation = new IntegrityViolation();
      $violation
        ->setMessage($this
        ->t('The required context %context_name is missing.', [
        '%context_name' => $context_definition
          ->getLabel(),
      ]));
      $violation
        ->setContextName($name);
      $violation
        ->setUuid($this
        ->getUuid());
      $violation_list
        ->add($violation);
    }
  }
  if ($plugin instanceof ContextProviderInterface) {
    $provided_context_definitions = $plugin
      ->getProvidedContextDefinitions();
    foreach ($provided_context_definitions as $name => $context_definition) {
      if (isset($this->configuration['provides_mapping'][$name]) && !preg_match('/^[0-9a-zA-Z_]*$/', $this->configuration['provides_mapping'][$name])) {
        $violation = new IntegrityViolation();
        $violation
          ->setMessage($this
          ->t('Provided variable name %name contains not allowed characters.', [
          '%name' => $this->configuration['provides_mapping'][$name],
        ]));
        $violation
          ->setContextName($name);
        $violation
          ->setUuid($this
          ->getUuid());
        $violation_list
          ->add($violation);
      }
    }
  }
  return $violation_list;
}