acquia_vwo-1.0.x-dev/src/Service/Condition/ConditionResolver.php
src/Service/Condition/ConditionResolver.php
<?php
namespace Drupal\acquia_vwo\Service\Condition;
use Drupal\Core\Condition\ConditionAccessResolverTrait;
use Drupal\Core\Condition\ConditionManager;
use Drupal\Core\Condition\ConditionPluginCollection;
use Drupal\Core\Plugin\Context\ContextHandlerInterface;
use Drupal\Core\Plugin\Context\ContextRepositoryInterface;
use Drupal\Core\Plugin\ContextAwarePluginInterface;
/**
* Class to manage and evaluate conditions.
*/
class ConditionResolver {
use ConditionAccessResolverTrait;
/**
* The list of condition used by this module.
*
* @var string[]
*/
protected $conditionsMapping = [
'request_path' => [
'context_mapping' => [],
],
'user_role' => [
'context_mapping' => [
'user' => '@user.current_user_context:current_user',
],
],
'entity_bundle:node' => [
'context_mapping' => [
'node' => '@node.node_route_context:node',
],
],
];
/**
* The insertion condition collection.
*
* @var \Drupal\Core\Condition\ConditionPluginCollection|null
*/
protected $conditionCollection;
/**
* The condition plugin manager.
*
* @var \Drupal\Core\Condition\ConditionManager
*/
protected $conditionManager;
/**
* The Context Repository Service.
*
* @var \Drupal\Core\Plugin\Context\ContextRepositoryInterface
*/
private ContextRepositoryInterface $contextRepository;
/**
* The Context Handler.
*
* @var \Drupal\Core\Plugin\Context\ContextHandlerInterface
*/
private ContextHandlerInterface $contextHandler;
/**
* Constructs a ContainerForm object.
*
* @param \Drupal\Core\Condition\ConditionManager $condition_manager
* The ConditionManager for building the insertion conditions.
* @param \Drupal\Core\Plugin\Context\ContextRepositoryInterface $contextRepository
* Context repository.
* @param \Drupal\Core\Plugin\Context\ContextHandlerInterface $contextHandler
* Context handler.
*/
public function __construct(
ConditionManager $condition_manager,
ContextRepositoryInterface $contextRepository,
ContextHandlerInterface $contextHandler,
) {
$this->conditionManager = $condition_manager;
$this->contextRepository = $contextRepository;
$this->contextHandler = $contextHandler;
}
/**
* Creates instances of config conditions.
*
* @param array $visibility_conditions
* Array of visibility conditions.
*
* @return array
* A list of config conditions.
*/
public function getConfigConditions($visibility_conditions) {
$conditions = [];
$configs = array_merge($this->conditionsMapping, $visibility_conditions);
foreach ($configs as $condition_id => $configuration) {
$condition = $this->conditionManager->createInstance($condition_id, $configuration ?? []);
$conditions[$condition_id] = $condition;
}
return $conditions;
}
/**
* Evaluates visibility conditions.
*
* @param array $visibility_conditions
* An array of visibility conditions.
*
* @return bool
* True if all evaluations are true, else false.
*/
public function evaluateConditions(array $visibility_conditions) {
$conditions = [];
foreach ($this->getConditions($visibility_conditions) as $condition_id => $condition) {
if ($condition instanceof ContextAwarePluginInterface) {
$this->setConditionContextMapping($condition);
}
$conditions[$condition_id] = $condition;
}
return $this->resolveConditions($conditions, 'and');
}
/**
* Returns the set of insertion conditions.
*
* @param array $visibility_conditions
* Array of visibility conditions.
*
* @return \Drupal\Core\Condition\ConditionPluginCollection
* A collection of configured condition plugins.
*/
public function getConditions($visibility_conditions) {
if ($this->conditionCollection === NULL) {
$this->conditionCollection = new ConditionPluginCollection($this->conditionManager, $visibility_conditions);
}
return $this->conditionCollection;
}
/**
* Add context mapping and data to the conditions.
*
* @param \Drupal\Core\Plugin\ContextAwarePluginInterface $condition
* The condition.
*
* @throws \Drupal\Component\Plugin\Exception\ContextException
* @throws \Drupal\Component\Plugin\Exception\MissingValueContextException
*/
private function setConditionContextMapping(ContextAwarePluginInterface $condition) {
$id = $condition->getPluginId();
if (isset($this->conditionsMapping[$id])) {
$condition->setContextMapping($this->conditionsMapping[$id]['context_mapping']);
$context_ids = array_values($condition->getContextMapping());
$contexts = $this->contextRepository->getRuntimeContexts($context_ids);
foreach ($contexts as $key => $context) {
// Remove contexts without context value.
if (empty($context->getContextValue())) {
unset($contexts[$key]);
};
}
if (!empty($contexts)) {
$this->contextHandler->applyContextMapping($condition, $contexts);
}
}
}
}
