ContextHandler.php in Zircon Profile 8.0
File
core/lib/Drupal/Core/Plugin/Context/ContextHandler.php
View source
<?php
namespace Drupal\Core\Plugin\Context;
use Drupal\Component\Plugin\Exception\ContextException;
use Drupal\Core\Cache\CacheableDependencyInterface;
use Drupal\Core\Plugin\ContextAwarePluginInterface;
class ContextHandler implements ContextHandlerInterface {
public function filterPluginDefinitionsByContexts(array $contexts, array $definitions) {
return array_filter($definitions, function ($plugin_definition) use ($contexts) {
if (!isset($plugin_definition['context'])) {
return TRUE;
}
return $this
->checkRequirements($contexts, $plugin_definition['context']);
});
}
public function checkRequirements(array $contexts, array $requirements) {
foreach ($requirements as $requirement) {
if ($requirement
->isRequired() && !$this
->getMatchingContexts($contexts, $requirement)) {
return FALSE;
}
}
return TRUE;
}
public function getMatchingContexts(array $contexts, ContextDefinitionInterface $definition) {
return array_filter($contexts, function (ContextInterface $context) use ($definition) {
$context_definition = $context
->getContextDefinition();
if ($definition
->getDataType() != 'any' && $definition
->getDataType() != $context_definition
->getDataType()) {
return FALSE;
}
foreach ($definition
->getConstraints() as $constraint_name => $constraint) {
if ($context_definition
->getConstraint($constraint_name) != $constraint) {
return FALSE;
}
}
return TRUE;
});
}
public function applyContextMapping(ContextAwarePluginInterface $plugin, $contexts, $mappings = array()) {
$mappings += $plugin
->getContextMapping();
$missing_value = [];
foreach ($plugin
->getContextDefinitions() as $plugin_context_id => $plugin_context_definition) {
$context_id = isset($mappings[$plugin_context_id]) ? $mappings[$plugin_context_id] : $plugin_context_id;
if (!empty($contexts[$context_id])) {
unset($mappings[$plugin_context_id]);
$plugin_context = $plugin
->getContext($plugin_context_id);
if ($plugin_context instanceof ContextInterface && $contexts[$context_id] instanceof CacheableDependencyInterface) {
$plugin_context
->addCacheableDependency($contexts[$context_id]);
}
if ($contexts[$context_id]
->hasContextValue()) {
$plugin
->setContextValue($plugin_context_id, $contexts[$context_id]
->getContextData());
}
elseif ($plugin_context_definition
->isRequired()) {
$missing_value[] = $plugin_context_id;
}
}
elseif ($plugin_context_definition
->isRequired()) {
$missing_value[] = $plugin_context_id;
}
else {
unset($mappings[$plugin_context_id]);
}
}
if ($missing_value) {
throw new ContextException(sprintf('Required contexts without a value: %s.', implode(', ', $missing_value)));
}
if (!empty($mappings)) {
throw new ContextException('Assigned contexts were not satisfied: ' . implode(',', array_keys($mappings)));
}
}
}