diff --git a/config/install/webform.settings.yml b/config/install/webform.settings.yml index 1a16206a7..cc04ef810 100644 --- a/config/install/webform.settings.yml +++ b/config/install/webform.settings.yml @@ -1,5 +1,6 @@ settings: default_status: open + default_page: true default_page_base_path: /form default_ajax: false default_ajax_effect: fade @@ -30,7 +31,7 @@ settings: messages messages--error messages messages--warning messages messages--status - + button_classes: '' default_wizard_prev_button_label: '< Previous' default_wizard_next_button_label: 'Next >' @@ -76,15 +77,15 @@ settings: messages messages--error messages messages--warning messages messages--status - + confirmation_classes: | messages messages--error messages messages--warning messages messages--status - + confirmation_back_classes: | button - + default_limit_total_message: 'No more submissions are permitted.' default_limit_user_message: 'No more submissions are permitted.' default_share: false @@ -166,14 +167,14 @@ element: messages messages--error messages messages--warning messages messages--status - + classes: | container-inline clearfix form--inline clearfix messages messages--error messages messages--warning messages messages--status - + horizontal_rule_classes: | webform-horizontal-rule--solid webform-horizontal-rule--dashed @@ -184,7 +185,7 @@ element: webform-horizontal-rule--thick webform-horizontal-rule--flaired webform-horizontal-rule--glyph - + default_description_display: '' default_more_title: More default_section_title_tag: h2 @@ -227,16 +228,16 @@ mail: default_body_text: | Submitted on [webform_submission:created] Submitted by: [webform_submission:user] - + Submitted values are: [webform_submission:values] - + default_body_html: | <p>Submitted on [webform_submission:created]</p> <p>Submitted by: [webform_submission:user]</p> <p>Submitted values are:</p> [webform_submission:values] - + roles: { } test: types: | @@ -279,7 +280,7 @@ test: webform_time: - '09:00' - '17:00' - + names: | first_name: - 'John' @@ -319,7 +320,7 @@ test: - 'Loremipsum' - 'Oratione' - 'Dixisset' - + ui: video_display: dialog details_save: true diff --git a/config/schema/webform.settings.schema.yml b/config/schema/webform.settings.schema.yml index 7f692386d..829eaa813 100644 --- a/config/schema/webform.settings.schema.yml +++ b/config/schema/webform.settings.schema.yml @@ -9,6 +9,9 @@ webform.settings: default_status: type: string label: 'Default status' + default_page: + type: boolean + label: 'Default enable page' default_page_base_path: type: string label: 'Default base path' diff --git a/includes/webform.install.update.inc b/includes/webform.install.update.inc index 5062865c5..2c1a0a40b 100644 --- a/includes/webform.install.update.inc +++ b/includes/webform.install.update.inc @@ -4303,3 +4303,10 @@ function webform_update_8636() { return implode(PHP_EOL, $messages); } + +/** + * Issue #3249092: Disable 'Allow users to post submissions from a dedicated URL' for all webforms. + */ +function webform_update_8637() { + _webform_update_admin_settings(); +} diff --git a/src/Entity/Webform.php b/src/Entity/Webform.php index 84feec57b..d830be62c 100644 --- a/src/Entity/Webform.php +++ b/src/Entity/Webform.php @@ -779,8 +779,12 @@ class Webform extends ConfigEntityBundleBase implements WebformInterface { * {@inheritdoc} */ public function hasPage() { - $settings = $this->getSettings(); - return $settings['page'] ? TRUE : FALSE; + if (\Drupal::config('webform.settings')->get('settings.default_page') === FALSE) { + return FALSE; + } + else { + return (boolean) $this->getSetting('page'); + } } /** @@ -2420,7 +2424,7 @@ class Webform extends ConfigEntityBundleBase implements WebformInterface { // If 'Allow users to post submission from a dedicated URL' is disabled, // delete all existing paths. - if (empty($this->getSetting('page'))) { + if (empty($this->hasPage())) { $this->deletePaths(); return; } diff --git a/src/EntitySettings/WebformEntitySettingsGeneralForm.php b/src/EntitySettings/WebformEntitySettingsGeneralForm.php index 6fd9d9738..919c13444 100644 --- a/src/EntitySettings/WebformEntitySettingsGeneralForm.php +++ b/src/EntitySettings/WebformEntitySettingsGeneralForm.php @@ -167,6 +167,7 @@ class WebformEntitySettingsGeneralForm extends WebformEntitySettingsBaseForm { '#type' => 'details', '#title' => $this->t('URL path settings'), '#open' => TRUE, + '#access' => ($this->config('webform.settings')->get('settings.default_page') !== FALSE), ]; $default_page_base_path = $default_settings['default_page_base_path']; if ($default_page_base_path) { diff --git a/src/Form/AdminConfig/WebformAdminConfigFormsForm.php b/src/Form/AdminConfig/WebformAdminConfigFormsForm.php index aa6d8f7b7..9ad3b62af 100644 --- a/src/Form/AdminConfig/WebformAdminConfigFormsForm.php +++ b/src/Form/AdminConfig/WebformAdminConfigFormsForm.php @@ -137,6 +137,13 @@ class WebformAdminConfigFormsForm extends WebformAdminConfigBaseForm { '#open' => TRUE, '#tree' => TRUE, ]; + $form['page_settings']['default_page'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Allow users to post submissions from a dedicated URL for all webform'), + '#description' => $this->t('If unchecked, all webform must added to your webform using a node, block, or paragraph.'), + '#return_value' => TRUE, + '#default_value' => $settings['default_page'], + ]; $form['page_settings']['default_page_base_path'] = [ '#type' => 'textfield', '#title' => $this->t('Default base path for webform URLs'), diff --git a/src/Theme/WebformThemeNegotiator.php b/src/Theme/WebformThemeNegotiator.php index d0804de09..679fe25fa 100644 --- a/src/Theme/WebformThemeNegotiator.php +++ b/src/Theme/WebformThemeNegotiator.php @@ -99,7 +99,7 @@ class WebformThemeNegotiator implements ThemeNegotiatorInterface { // If webform route and page is disabled, apply admin theme to // the webform routes. - if ($is_webform_route && !$webform->getSetting('page')) { + if ($is_webform_route && !$webform->hasPage()) { return ($this->user->hasPermission('view the administration theme')) ? $this->configFactory->get('system.theme')->get('admin') : ''; diff --git a/src/WebformEntityAccessControlHandler.php b/src/WebformEntityAccessControlHandler.php index 78ac24ccf..29bfc35cc 100644 --- a/src/WebformEntityAccessControlHandler.php +++ b/src/WebformEntityAccessControlHandler.php @@ -227,7 +227,7 @@ class WebformEntityAccessControlHandler extends EntityAccessControlHandler imple } // Block access if the webform does not have a page URL. - if (!$entity->getSetting('page')) { + if (!$entity->hasPage()) { $source_entity = $this->webformSourceEntityManager->getSourceEntity('webform'); if (!$source_entity) { return WebformAccessResult::forbidden($entity); diff --git a/src/WebformInterface.php b/src/WebformInterface.php index a9ab5ff5a..593dce097 100644 --- a/src/WebformInterface.php +++ b/src/WebformInterface.php @@ -171,7 +171,7 @@ interface WebformInterface extends ConfigEntityInterface, EntityWithPluginCollec * Determine if the webform has page or is attached to other entities. * * @return bool - * TRUE if the webform is a page with dedicated path. + * TRUE if the webform has a page with dedicated path. */ public function hasPage(); diff --git a/src/WebformSubmissionForm.php b/src/WebformSubmissionForm.php index ee206df41..53cb1354b 100644 --- a/src/WebformSubmissionForm.php +++ b/src/WebformSubmissionForm.php @@ -1095,7 +1095,7 @@ class WebformSubmissionForm extends ContentEntityForm { if ($this->isGet() && $this->isRoute('webform.canonical') && $this->getRouteMatch()->getRawParameter('webform') === $webform->id() - && !$this->getWebform()->getSetting('page')) { + && !$this->getWebform()->hasPage()) { $this->getMessageManager()->display(WebformMessageManagerInterface::ADMIN_PAGE, 'info'); } diff --git a/tests/src/Unit/WebformEntityAccessControlHandlerTest.php b/tests/src/Unit/WebformEntityAccessControlHandlerTest.php index e30071d2c..8653fcc8c 100644 --- a/tests/src/Unit/WebformEntityAccessControlHandlerTest.php +++ b/tests/src/Unit/WebformEntityAccessControlHandlerTest.php @@ -165,8 +165,8 @@ class WebformEntityAccessControlHandlerTest extends UnitTestCase { ->willReturnMap([ ['create', $account, TRUE, AccessResult::allowed()], ]); - $webform->method('getSetting')->willReturnMap([ - ['page', FALSE, TRUE], + $webform->method('hasPage')->willReturnOnConsecutiveCalls([ + FALSE, TRUE, ]); $webform->method('getCacheMaxAge') ->willReturn(Cache::PERMANENT);