Chris@0: aliasManager = $alias_manager; Chris@0: $this->pathMatcher = $path_matcher; Chris@0: $this->requestStack = $request_stack; Chris@0: $this->currentPath = $current_path; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { Chris@0: return new static( Chris@0: $container->get('path.alias_manager'), Chris@0: $container->get('path.matcher'), Chris@0: $container->get('request_stack'), Chris@0: $container->get('path.current'), Chris@0: $configuration, Chris@0: $plugin_id, Chris@0: $plugin_definition); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function defaultConfiguration() { Chris@0: return ['pages' => ''] + parent::defaultConfiguration(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function buildConfigurationForm(array $form, FormStateInterface $form_state) { Chris@0: $form['pages'] = [ Chris@0: '#type' => 'textarea', Chris@0: '#title' => $this->t('Pages'), Chris@0: '#default_value' => $this->configuration['pages'], Chris@0: '#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: '%user-wildcard' => '/user/*', Chris@0: '%front' => '', Chris@0: ]), Chris@0: ]; Chris@0: return parent::buildConfigurationForm($form, $form_state); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { Chris@0: $this->configuration['pages'] = $form_state->getValue('pages'); Chris@0: parent::submitConfigurationForm($form, $form_state); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function summary() { Chris@0: $pages = array_map('trim', explode("\n", $this->configuration['pages'])); Chris@0: $pages = implode(', ', $pages); Chris@0: if (!empty($this->configuration['negate'])) { Chris@0: return $this->t('Do not return true on the following pages: @pages', ['@pages' => $pages]); Chris@0: } Chris@0: return $this->t('Return true on the following pages: @pages', ['@pages' => $pages]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function evaluate() { Chris@0: // Convert path to lowercase. This allows comparison of the same path Chris@0: // with different case. Ex: /Page, /page, /PAGE. Chris@17: $pages = mb_strtolower($this->configuration['pages']); Chris@0: if (!$pages) { Chris@0: return TRUE; Chris@0: } Chris@0: Chris@0: $request = $this->requestStack->getCurrentRequest(); Chris@0: // Compare the lowercase path alias (if any) and internal path. Chris@0: $path = $this->currentPath->getPath($request); Chris@0: // Do not trim a trailing slash if that is the complete path. Chris@0: $path = $path === '/' ? $path : rtrim($path, '/'); Chris@17: $path_alias = mb_strtolower($this->aliasManager->getAliasByPath($path)); Chris@0: Chris@0: return $this->pathMatcher->matchPath($path_alias, $pages) || (($path != $path_alias) && $this->pathMatcher->matchPath($path, $pages)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getCacheContexts() { Chris@0: $contexts = parent::getCacheContexts(); Chris@0: $contexts[] = 'url.path'; Chris@0: return $contexts; Chris@0: } Chris@0: Chris@0: }