diff --git a/core/modules/block/js/block.es6.js b/core/modules/block/js/block.es6.js index 68af99546b..2421444217 100644 --- a/core/modules/block/js/block.es6.js +++ b/core/modules/block/js/block.es6.js @@ -46,7 +46,7 @@ } $( - '[data-drupal-selector="edit-visibility-node-type"], [data-drupal-selector="edit-visibility-language"], [data-drupal-selector="edit-visibility-user-role"]', + '[data-drupal-selector="edit-visibility-node-type"], [data-drupal-selector="edit-visibility-language"], [data-drupal-selector="edit-visibility-user-role"], [data-drupal-selector="edit-visibility-status-code"]', ).drupalSetSummary(checkboxesSummary); $( diff --git a/core/modules/block/js/block.js b/core/modules/block/js/block.js index 9612dfdbf3..208a1b27c4 100644 --- a/core/modules/block/js/block.js +++ b/core/modules/block/js/block.js @@ -25,7 +25,7 @@ return vals.join(', '); } - $('[data-drupal-selector="edit-visibility-node-type"], [data-drupal-selector="edit-visibility-language"], [data-drupal-selector="edit-visibility-user-role"]').drupalSetSummary(checkboxesSummary); + $('[data-drupal-selector="edit-visibility-node-type"], [data-drupal-selector="edit-visibility-language"], [data-drupal-selector="edit-visibility-user-role"], [data-drupal-selector="edit-visibility-status-code"]').drupalSetSummary(checkboxesSummary); $('[data-drupal-selector="edit-visibility-request-path"]').drupalSetSummary(function (context) { var $pages = $(context).find('textarea[name="visibility[request_path][pages]"]'); diff --git a/core/modules/block/src/BlockForm.php b/core/modules/block/src/BlockForm.php index 5624fc577e..0c3ca4a955 100644 --- a/core/modules/block/src/BlockForm.php +++ b/core/modules/block/src/BlockForm.php @@ -286,6 +286,10 @@ protected function buildVisibilityInterface(array $form, FormStateInterface $for $form['language']['negate']['#type'] = 'value'; $form['language']['negate']['#value'] = $form['language']['negate']['#default_value']; } + if (isset($form['status_code'])) { + $form['status_code']['negate']['#type'] = 'value'; + $form['status_code']['negate']['#value'] = $form['status_code']['negate']['#default_value']; + } return $form; } diff --git a/core/modules/system/src/Plugin/Condition/StatusCode.php b/core/modules/system/src/Plugin/Condition/StatusCode.php index e69de29bb2..6f0dbc77a6 100644 --- a/core/modules/system/src/Plugin/Condition/StatusCode.php +++ b/core/modules/system/src/Plugin/Condition/StatusCode.php @@ -0,0 +1,121 @@ +requestStack = $request_stack; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $container->get('request_stack'), + $configuration, + $plugin_id, + $plugin_definition); + } + + /** + * {@inheritdoc} + */ + public function defaultConfiguration() { + return ['status_codes' => []] + parent::defaultConfiguration(); + } + + /** + * {@inheritdoc} + */ + public function buildConfigurationForm(array $form, FormStateInterface $form_state) { + $status_codes = ['200', '403', '404']; + $form['status_codes'] = [ + '#type' => 'checkboxes', + '#title' => $this->t('Show on status code'), + '#options' => array_combine($status_codes, $status_codes), + '#default_value' => $this->configuration['status_codes'], + '#description' => $this->t('Select status codes to enforce. If none are selected, all status codes will be allowed.'), + ]; + return parent::buildConfigurationForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { + $this->configuration['status_codes'] = array_filter($form_state->getValue('status_codes')); + parent::submitConfigurationForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function summary() { + $config = $this->configuration['status_codes']; + $status_codes = ['200', '403', '404']; + $result = empty($config) ? $status_codes : $config; + $codes = implode(', ', $result); + if (!empty($this->configuration['negate'])) { + return $this->t('Do not return true on the following status code(s): @codes', ['@codes' => $codes]); + } + return $this->t('Return true on the following status code(s): @codes', ['@codes' => $codes]); + } + + /** + * {@inheritdoc} + */ + public function evaluate() { + if (empty($this->configuration['status_codes']) && !$this->isNegated()) { + return TRUE; + } + $status = $this->requestStack->getCurrentRequest()->attributes->get('exception'); + return ($status instanceof HttpExceptionInterface && in_array($status->getStatusCode(), $this->configuration['status_codes'])); + } + + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + $contexts = parent::getCacheContexts(); + $contexts[] = 'url.path'; + return $contexts; + } + +}