View source
<?php
namespace Drupal\route_condition\Plugin\Condition;
use Drupal\Core\Condition\ConditionInterface;
use Drupal\Core\Condition\ConditionPluginBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Routing\CurrentRouteMatch;
use Symfony\Component\DependencyInjection\ContainerInterface;
class RouteCondition extends ConditionPluginBase implements ConditionInterface, ContainerFactoryPluginInterface {
protected $currentRouteMatch;
public function __construct(CurrentRouteMatch $current_route_match, array $configuration, $plugin_id, array $plugin_definition) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->currentRouteMatch = $current_route_match;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($container
->get('current_route_match'), $configuration, $plugin_id, $plugin_definition);
}
public function defaultConfiguration() {
return [
'routes' => '',
] + parent::defaultConfiguration();
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form['routes'] = [
'#type' => 'textarea',
'#title' => $this
->t('Routes'),
'#default_value' => $this->configuration['routes'],
'#description' => $this
->t("Specify route names. Enter one route per line. The '*' character is a wildcard. An example route is %canonical-wildcard for every entity's canonical view. Prepend the ~ character (tilde) to exclude the route.", [
'%canonical-wildcard' => 'entity.*.canonical',
]),
'#attached' => [
'library' => [
'route_condition/drupal.routeCondition',
],
],
];
return parent::buildConfigurationForm($form, $form_state);
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$this->configuration['routes'] = $form_state
->getValue('routes');
parent::submitConfigurationForm($form, $form_state);
}
public function summary() {
$routes = array_map('trim', explode("\n", $this->configuration['routes']));
$routes = implode(', ', $routes);
if (!empty($this->configuration['negate'])) {
return $this
->t('Do not return true on the following routes: @routes', [
'@routes' => $routes,
]);
}
return $this
->t('Return true on the following routes: @routes', [
'@routes' => $routes,
]);
}
public function evaluate() {
$routes = mb_strtolower($this->configuration['routes']);
$routes = str_replace([
"\r\n",
"\r",
], "\n", $routes);
$routes = explode("\n", $routes);
if (!$routes) {
return TRUE;
}
$current_route = $this->currentRouteMatch
->getCurrentRouteMatch();
$current_route_name = $current_route
->getRouteName();
foreach ($routes as $route) {
$negate = isset($route[0]) && $route[0] === '~';
$route = ltrim($route, '~');
if ($route === $current_route_name || $this
->evaluateRouteWildcards($route, $current_route_name)) {
return !$negate;
}
}
return FALSE;
}
protected function evaluateRouteWildcards($route_pattern, $current_route_name) {
if (strpos($route_pattern, '*') === FALSE) {
return FALSE;
}
$escaped_route_pattern = str_replace('.', '\\.', $route_pattern);
$route_pattern_wildcards = str_replace('*', '.*', $escaped_route_pattern);
$regex = "{^{$route_pattern_wildcards}\$}";
return (bool) preg_match($regex, $current_route_name);
}
}