Mercurial > hg > isophonics-drupal-site
diff core/modules/system/src/Plugin/Condition/RequestPath.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 129ea1e6d783 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/system/src/Plugin/Condition/RequestPath.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,166 @@ +<?php + +namespace Drupal\system\Plugin\Condition; + +use Drupal\Component\Utility\Unicode; +use Drupal\Core\Condition\ConditionPluginBase; +use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Path\AliasManagerInterface; +use Drupal\Core\Path\CurrentPathStack; +use Drupal\Core\Path\PathMatcherInterface; +use Drupal\Core\Plugin\ContainerFactoryPluginInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpFoundation\RequestStack; + +/** + * Provides a 'Request Path' condition. + * + * @Condition( + * id = "request_path", + * label = @Translation("Request Path"), + * ) + */ +class RequestPath extends ConditionPluginBase implements ContainerFactoryPluginInterface { + + /** + * An alias manager to find the alias for the current system path. + * + * @var \Drupal\Core\Path\AliasManagerInterface + */ + protected $aliasManager; + + /** + * The path matcher. + * + * @var \Drupal\Core\Path\PathMatcherInterface + */ + protected $pathMatcher; + + /** + * The request stack. + * + * @var \Symfony\Component\HttpFoundation\RequestStack + */ + protected $requestStack; + + /** + * The current path. + * + * @var \Drupal\Core\Path\CurrentPathStack + */ + protected $currentPath; + + /** + * Constructs a RequestPath condition plugin. + * + * @param \Drupal\Core\Path\AliasManagerInterface $alias_manager + * An alias manager to find the alias for the current system path. + * @param \Drupal\Core\Path\PathMatcherInterface $path_matcher + * The path matcher service. + * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack + * The request stack. + * @param \Drupal\Core\Path\CurrentPathStack $current_path + * The current path. + * @param array $configuration + * A configuration array containing information about the plugin instance. + * @param string $plugin_id + * The plugin_id for the plugin instance. + * @param array $plugin_definition + * The plugin implementation definition. + */ + public function __construct(AliasManagerInterface $alias_manager, PathMatcherInterface $path_matcher, RequestStack $request_stack, CurrentPathStack $current_path, array $configuration, $plugin_id, array $plugin_definition) { + parent::__construct($configuration, $plugin_id, $plugin_definition); + $this->aliasManager = $alias_manager; + $this->pathMatcher = $path_matcher; + $this->requestStack = $request_stack; + $this->currentPath = $current_path; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $container->get('path.alias_manager'), + $container->get('path.matcher'), + $container->get('request_stack'), + $container->get('path.current'), + $configuration, + $plugin_id, + $plugin_definition); + } + + /** + * {@inheritdoc} + */ + public function defaultConfiguration() { + return ['pages' => ''] + parent::defaultConfiguration(); + } + + /** + * {@inheritdoc} + */ + public function buildConfigurationForm(array $form, FormStateInterface $form_state) { + $form['pages'] = [ + '#type' => 'textarea', + '#title' => $this->t('Pages'), + '#default_value' => $this->configuration['pages'], + '#description' => $this->t("Specify pages by using their paths. Enter one path per line. The '*' character is a wildcard. An example path is %user-wildcard for every user page. %front is the front page.", [ + '%user-wildcard' => '/user/*', + '%front' => '<front>', + ]), + ]; + return parent::buildConfigurationForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { + $this->configuration['pages'] = $form_state->getValue('pages'); + parent::submitConfigurationForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function summary() { + $pages = array_map('trim', explode("\n", $this->configuration['pages'])); + $pages = implode(', ', $pages); + if (!empty($this->configuration['negate'])) { + return $this->t('Do not return true on the following pages: @pages', ['@pages' => $pages]); + } + return $this->t('Return true on the following pages: @pages', ['@pages' => $pages]); + } + + /** + * {@inheritdoc} + */ + public function evaluate() { + // Convert path to lowercase. This allows comparison of the same path + // with different case. Ex: /Page, /page, /PAGE. + $pages = Unicode::strtolower($this->configuration['pages']); + if (!$pages) { + return TRUE; + } + + $request = $this->requestStack->getCurrentRequest(); + // Compare the lowercase path alias (if any) and internal path. + $path = $this->currentPath->getPath($request); + // Do not trim a trailing slash if that is the complete path. + $path = $path === '/' ? $path : rtrim($path, '/'); + $path_alias = Unicode::strtolower($this->aliasManager->getAliasByPath($path)); + + return $this->pathMatcher->matchPath($path_alias, $pages) || (($path != $path_alias) && $this->pathMatcher->matchPath($path, $pages)); + } + + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + $contexts = parent::getCacheContexts(); + $contexts[] = 'url.path'; + return $contexts; + } + +}