annotate core/modules/system/src/Plugin/Condition/RequestPath.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\system\Plugin\Condition;
Chris@0 4
Chris@0 5 use Drupal\Core\Condition\ConditionPluginBase;
Chris@0 6 use Drupal\Core\Form\FormStateInterface;
Chris@0 7 use Drupal\Core\Path\AliasManagerInterface;
Chris@0 8 use Drupal\Core\Path\CurrentPathStack;
Chris@0 9 use Drupal\Core\Path\PathMatcherInterface;
Chris@0 10 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
Chris@0 11 use Symfony\Component\DependencyInjection\ContainerInterface;
Chris@0 12 use Symfony\Component\HttpFoundation\RequestStack;
Chris@0 13
Chris@0 14 /**
Chris@0 15 * Provides a 'Request Path' condition.
Chris@0 16 *
Chris@0 17 * @Condition(
Chris@0 18 * id = "request_path",
Chris@0 19 * label = @Translation("Request Path"),
Chris@0 20 * )
Chris@0 21 */
Chris@0 22 class RequestPath extends ConditionPluginBase implements ContainerFactoryPluginInterface {
Chris@0 23
Chris@0 24 /**
Chris@0 25 * An alias manager to find the alias for the current system path.
Chris@0 26 *
Chris@0 27 * @var \Drupal\Core\Path\AliasManagerInterface
Chris@0 28 */
Chris@0 29 protected $aliasManager;
Chris@0 30
Chris@0 31 /**
Chris@0 32 * The path matcher.
Chris@0 33 *
Chris@0 34 * @var \Drupal\Core\Path\PathMatcherInterface
Chris@0 35 */
Chris@0 36 protected $pathMatcher;
Chris@0 37
Chris@0 38 /**
Chris@0 39 * The request stack.
Chris@0 40 *
Chris@0 41 * @var \Symfony\Component\HttpFoundation\RequestStack
Chris@0 42 */
Chris@0 43 protected $requestStack;
Chris@0 44
Chris@0 45 /**
Chris@0 46 * The current path.
Chris@0 47 *
Chris@0 48 * @var \Drupal\Core\Path\CurrentPathStack
Chris@0 49 */
Chris@0 50 protected $currentPath;
Chris@0 51
Chris@0 52 /**
Chris@0 53 * Constructs a RequestPath condition plugin.
Chris@0 54 *
Chris@0 55 * @param \Drupal\Core\Path\AliasManagerInterface $alias_manager
Chris@0 56 * An alias manager to find the alias for the current system path.
Chris@0 57 * @param \Drupal\Core\Path\PathMatcherInterface $path_matcher
Chris@0 58 * The path matcher service.
Chris@0 59 * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
Chris@0 60 * The request stack.
Chris@0 61 * @param \Drupal\Core\Path\CurrentPathStack $current_path
Chris@0 62 * The current path.
Chris@0 63 * @param array $configuration
Chris@0 64 * A configuration array containing information about the plugin instance.
Chris@0 65 * @param string $plugin_id
Chris@0 66 * The plugin_id for the plugin instance.
Chris@0 67 * @param array $plugin_definition
Chris@0 68 * The plugin implementation definition.
Chris@0 69 */
Chris@0 70 public function __construct(AliasManagerInterface $alias_manager, PathMatcherInterface $path_matcher, RequestStack $request_stack, CurrentPathStack $current_path, array $configuration, $plugin_id, array $plugin_definition) {
Chris@0 71 parent::__construct($configuration, $plugin_id, $plugin_definition);
Chris@0 72 $this->aliasManager = $alias_manager;
Chris@0 73 $this->pathMatcher = $path_matcher;
Chris@0 74 $this->requestStack = $request_stack;
Chris@0 75 $this->currentPath = $current_path;
Chris@0 76 }
Chris@0 77
Chris@0 78 /**
Chris@0 79 * {@inheritdoc}
Chris@0 80 */
Chris@0 81 public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
Chris@0 82 return new static(
Chris@0 83 $container->get('path.alias_manager'),
Chris@0 84 $container->get('path.matcher'),
Chris@0 85 $container->get('request_stack'),
Chris@0 86 $container->get('path.current'),
Chris@0 87 $configuration,
Chris@0 88 $plugin_id,
Chris@0 89 $plugin_definition);
Chris@0 90 }
Chris@0 91
Chris@0 92 /**
Chris@0 93 * {@inheritdoc}
Chris@0 94 */
Chris@0 95 public function defaultConfiguration() {
Chris@0 96 return ['pages' => ''] + parent::defaultConfiguration();
Chris@0 97 }
Chris@0 98
Chris@0 99 /**
Chris@0 100 * {@inheritdoc}
Chris@0 101 */
Chris@0 102 public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
Chris@0 103 $form['pages'] = [
Chris@0 104 '#type' => 'textarea',
Chris@0 105 '#title' => $this->t('Pages'),
Chris@0 106 '#default_value' => $this->configuration['pages'],
Chris@0 107 '#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.", [
Chris@0 108 '%user-wildcard' => '/user/*',
Chris@0 109 '%front' => '<front>',
Chris@0 110 ]),
Chris@0 111 ];
Chris@0 112 return parent::buildConfigurationForm($form, $form_state);
Chris@0 113 }
Chris@0 114
Chris@0 115 /**
Chris@0 116 * {@inheritdoc}
Chris@0 117 */
Chris@0 118 public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
Chris@0 119 $this->configuration['pages'] = $form_state->getValue('pages');
Chris@0 120 parent::submitConfigurationForm($form, $form_state);
Chris@0 121 }
Chris@0 122
Chris@0 123 /**
Chris@0 124 * {@inheritdoc}
Chris@0 125 */
Chris@0 126 public function summary() {
Chris@0 127 $pages = array_map('trim', explode("\n", $this->configuration['pages']));
Chris@0 128 $pages = implode(', ', $pages);
Chris@0 129 if (!empty($this->configuration['negate'])) {
Chris@0 130 return $this->t('Do not return true on the following pages: @pages', ['@pages' => $pages]);
Chris@0 131 }
Chris@0 132 return $this->t('Return true on the following pages: @pages', ['@pages' => $pages]);
Chris@0 133 }
Chris@0 134
Chris@0 135 /**
Chris@0 136 * {@inheritdoc}
Chris@0 137 */
Chris@0 138 public function evaluate() {
Chris@0 139 // Convert path to lowercase. This allows comparison of the same path
Chris@0 140 // with different case. Ex: /Page, /page, /PAGE.
Chris@17 141 $pages = mb_strtolower($this->configuration['pages']);
Chris@0 142 if (!$pages) {
Chris@0 143 return TRUE;
Chris@0 144 }
Chris@0 145
Chris@0 146 $request = $this->requestStack->getCurrentRequest();
Chris@0 147 // Compare the lowercase path alias (if any) and internal path.
Chris@0 148 $path = $this->currentPath->getPath($request);
Chris@0 149 // Do not trim a trailing slash if that is the complete path.
Chris@0 150 $path = $path === '/' ? $path : rtrim($path, '/');
Chris@17 151 $path_alias = mb_strtolower($this->aliasManager->getAliasByPath($path));
Chris@0 152
Chris@0 153 return $this->pathMatcher->matchPath($path_alias, $pages) || (($path != $path_alias) && $this->pathMatcher->matchPath($path, $pages));
Chris@0 154 }
Chris@0 155
Chris@0 156 /**
Chris@0 157 * {@inheritdoc}
Chris@0 158 */
Chris@0 159 public function getCacheContexts() {
Chris@0 160 $contexts = parent::getCacheContexts();
Chris@0 161 $contexts[] = 'url.path';
Chris@0 162 return $contexts;
Chris@0 163 }
Chris@0 164
Chris@0 165 }