ConditionExpressionContainer.php in Rules 8.3
File
src/Engine/ConditionExpressionContainer.php
View source
<?php
namespace Drupal\rules\Engine;
use Drupal\Core\Logger\LoggerChannelInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\rules\Context\ContextConfig;
use Drupal\rules\Context\ExecutionStateInterface;
use Drupal\rules\Exception\InvalidExpressionException;
abstract class ConditionExpressionContainer extends ExpressionContainerBase implements ConditionExpressionContainerInterface, ContainerFactoryPluginInterface {
protected $conditions = [];
public function __construct(array $configuration, $plugin_id, array $plugin_definition, ExpressionManagerInterface $expression_manager, LoggerChannelInterface $logger) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->expressionManager = $expression_manager;
$this->rulesDebugLogger = $logger;
$configuration += [
'conditions' => [],
];
foreach ($configuration['conditions'] as $condition_config) {
$condition = $this->expressionManager
->createInstance($condition_config['id'], $condition_config);
$this->conditions[] = $condition;
}
}
public function addExpressionObject(ExpressionInterface $expression) {
if (!$expression instanceof ConditionExpressionInterface) {
throw new InvalidExpressionException('Only condition expressions can be added to a condition container.');
}
$uuid = $expression
->getUuid();
if ($this
->getExpression($uuid)) {
throw new InvalidExpressionException("A condition with UUID {$uuid} already exists in the container.");
}
$this->conditions[] = $expression;
return $this;
}
public function addCondition($condition_id, ContextConfig $config = NULL) {
return $this
->addExpressionObject($this->expressionManager
->createCondition($condition_id)
->setConfiguration($config ? $config
->toArray() : []));
}
public function executeWithState(ExecutionStateInterface $rules_state) {
$result = $this
->evaluate($rules_state);
return $this
->isNegated() ? !$result : $result;
}
public abstract function evaluate(ExecutionStateInterface $rules_state);
public function negate($negate = TRUE) {
$this->configuration['negate'] = $negate;
return $this;
}
public function isNegated() {
return !empty($this->configuration['negate']);
}
public function getConfiguration() {
$configuration = parent::getConfiguration();
$configuration['conditions'] = [];
foreach ($this as $condition) {
$configuration['conditions'][] = $condition
->getConfiguration();
}
return $configuration;
}
public function getIterator() {
$iterator = new \ArrayIterator($this->conditions);
$iterator
->uasort([
ExpressionContainerBase::class,
'sortByWeightProperty',
]);
return $iterator;
}
public function __clone() {
foreach ($this->conditions as &$condition) {
$condition = clone $condition;
}
}
public function getExpression($uuid) {
foreach ($this->conditions as $condition) {
if ($condition
->getUuid() === $uuid) {
return $condition;
}
if ($condition instanceof ExpressionContainerInterface) {
$nested_condition = $condition
->getExpression($uuid);
if ($nested_condition) {
return $nested_condition;
}
}
}
return FALSE;
}
public function deleteExpression($uuid) {
foreach ($this->conditions as $index => $condition) {
if ($condition
->getUuid() === $uuid) {
unset($this->conditions[$index]);
return TRUE;
}
if ($condition instanceof ExpressionContainerInterface && $condition
->deleteExpression($uuid)) {
return TRUE;
}
}
return FALSE;
}
}