Skip to content
Snippets Groups Projects
Commit a55eee87 authored by Javier Maties's avatar Javier Maties Committed by Sam Oltz
Browse files

Issue #3406685 by jmaties, pianomansam: Support for webform

parent fb9674f4
No related branches found
No related tags found
1 merge request!17Issue #3406685: support for webform
Pipeline #62724 passed
Showing
with 614 additions and 1 deletion
...@@ -5,5 +5,8 @@ ...@@ -5,5 +5,8 @@
"description": "Provides an 'or-able' token.", "description": "Provides an 'or-able' token.",
"require": { "require": {
"drupal/token": "^1.0" "drupal/token": "^1.0"
},
"require-dev": {
"drupal/webform": "^6.2"
} }
} }
<?php
namespace Drupal\token_or_webform;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\webform\WebformTokenManager;
/**
* Tokens Pre Alter Service.
*
* @property \Drupal\Core\Utility\Token $token
*/
class TokenOrWebformTokenManager extends WebformTokenManager {
/**
* {@inheritdoc}
*/
public function replace($text, EntityInterface $entity = NULL, array $data = [], array $options = [], BubbleableMetadata $bubbleable_metadata = NULL) {
if (!$text) {
return $text;
}
if (is_array($text) || strpos($text, '|') === FALSE) {
return parent::replace($text, $entity, $data, $options, $bubbleable_metadata);
}
$options['clear'] = 1;
// For anonymous users remove all [current-user] tokens to prevent
// anonymous user properties from being displayed.
// For example, the [current-user:display-name] token will return
// 'Anonymous', which is not an expected behavior.
//
// Updated to handle token_or's | syntax.
if ($this->currentUser->isAnonymous() && strpos($text, '[current-user:') !== FALSE) {
$text = preg_replace('/\[current-user:[^|]+\|/', '[', $text);
// Removing current-user: might leave a single string token.
// Let's clean that up.
$text = preg_replace('/\["([^]"]+)"\]/', '$1', $text);
}
return parent::replace($text, $entity, $data, $options, $bubbleable_metadata);
}
}
uuid: null
langcode: es
status: open
dependencies: { }
weight: 0
open: null
close: null
uid: 1
template: false
archive: false
id: test
title: Test
description: ''
categories: { }
elements: |-
current_page_query:
'#title': CID
'#type': textfield
'#required': true
'#default_value': 'Lorem lorem [current-page:query:cid|"foobar"]'
current_page_query_clear:
'#title': CID
'#type': textfield
'#required': true
'#default_value': 'Lorem lorem [current-page:query:cid:clear|"foobar"]'
current_user_display_name:
'#title': Display
'#type': textfield
'#required': true
'#default_value': 'Lorem lorem [current-user:display-name]'
current_user_display_name_fallback:
'#title': Display
'#type': textfield
'#required': true
'#default_value': 'Lorem lorem [current-user:display-name|"Nothing"]'
actions:
'#type': webform_actions
'#title': 'Submit button(s)'
'#submit__label': 'Send message'
css: ''
javascript: ''
settings:
ajax: false
ajax_scroll_top: form
ajax_progress_type: ''
ajax_effect: ''
ajax_speed: null
page: true
page_submit_path: ''
page_confirm_path: ''
page_theme_name: ''
form_title: both
form_submit_once: false
form_open_message: ''
form_close_message: ''
form_exception_message: ''
form_previous_submissions: true
form_confidential: false
form_confidential_message: ''
form_disable_remote_addr: false
form_convert_anonymous: false
form_prepopulate: false
form_prepopulate_source_entity: false
form_prepopulate_source_entity_required: false
form_prepopulate_source_entity_type: ''
form_unsaved: false
form_disable_back: false
form_submit_back: false
form_disable_autocomplete: false
form_novalidate: false
form_disable_inline_errors: false
form_required: false
form_autofocus: false
form_details_toggle: false
form_reset: false
form_access_denied: default
form_access_denied_title: ''
form_access_denied_message: ''
form_access_denied_attributes: { }
form_file_limit: ''
form_attributes: { }
form_method: ''
form_action: ''
share: false
share_node: false
share_theme_name: ''
share_title: true
share_page_body_attributes: { }
submission_label: ''
submission_exception_message: ''
submission_locked_message: ''
submission_log: false
submission_excluded_elements: { }
submission_exclude_empty: false
submission_exclude_empty_checkbox: false
submission_views: { }
submission_views_replace: { }
submission_user_columns: { }
submission_user_duplicate: false
submission_access_denied: default
submission_access_denied_title: ''
submission_access_denied_message: ''
submission_access_denied_attributes: { }
previous_submission_message: ''
previous_submissions_message: ''
autofill: false
autofill_message: ''
autofill_excluded_elements: { }
wizard_progress_bar: true
wizard_progress_pages: false
wizard_progress_percentage: false
wizard_progress_link: false
wizard_progress_states: false
wizard_start_label: ''
wizard_preview_link: false
wizard_confirmation: true
wizard_confirmation_label: ''
wizard_auto_forward: true
wizard_auto_forward_hide_next_button: false
wizard_keyboard: true
wizard_track: ''
wizard_prev_button_label: ''
wizard_next_button_label: ''
wizard_toggle: false
wizard_toggle_show_label: ''
wizard_toggle_hide_label: ''
wizard_page_type: container
wizard_page_title_tag: h2
preview: 0
preview_label: ''
preview_title: ''
preview_message: ''
preview_attributes: { }
preview_excluded_elements: { }
preview_exclude_empty: true
preview_exclude_empty_checkbox: false
draft: none
draft_multiple: false
draft_auto_save: false
draft_saved_message: ''
draft_loaded_message: ''
draft_pending_single_message: ''
draft_pending_multiple_message: ''
confirmation_type: page
confirmation_url: ''
confirmation_title: ''
confirmation_message: ''
confirmation_attributes: { }
confirmation_back: true
confirmation_back_label: ''
confirmation_back_attributes: { }
confirmation_exclude_query: false
confirmation_exclude_token: false
confirmation_update: false
limit_total: null
limit_total_interval: null
limit_total_message: ''
limit_total_unique: false
limit_user: null
limit_user_interval: null
limit_user_message: ''
limit_user_unique: false
entity_limit_total: null
entity_limit_total_interval: null
entity_limit_user: null
entity_limit_user_interval: null
purge: none
purge_days: null
results_disabled: false
results_disabled_ignore: false
results_customize: false
token_view: false
token_update: false
token_delete: false
serial_disabled: false
access:
create:
roles:
- anonymous
- authenticated
users: { }
permissions: { }
view_any:
roles: { }
users: { }
permissions: { }
update_any:
roles: { }
users: { }
permissions: { }
delete_any:
roles: { }
users: { }
permissions: { }
purge_any:
roles: { }
users: { }
permissions: { }
view_own:
roles: { }
users: { }
permissions: { }
update_own:
roles: { }
users: { }
permissions: { }
delete_own:
roles: { }
users: { }
permissions: { }
administer:
roles: { }
users: { }
permissions: { }
test:
roles: { }
users: { }
permissions: { }
configuration:
roles: { }
users: { }
permissions: { }
handlers: { }
variants: { }
name: 'Token Or Webform test'
type: module
description: 'Support module for webform testing.'
core_version_requirement: ^9 || ^10
dependencies:
- 'webform:webform'
\ No newline at end of file
<?php
namespace Drupal\Tests\token_or_webform\Functional;
use Drupal\Tests\BrowserTestBase;
use Drupal\user\Entity\Role;
/**
* Test that the issue exists without this module being enabled.
*
* @group token_or_webform
*/
class TokenOrWebformFunctionalBrokenTest extends BrowserTestBase {
/**
* Modules to enable.
*
* @var array
*/
protected static $modules = ['token_or', 'webform', 'token_or_webform_test'];
/**
* Theme to enable.
*
* @var string
*/
protected $defaultTheme = 'claro';
/**
* A user with permission to administer site configuration.
*
* @var \Drupal\user\UserInterface
*/
protected $user;
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$anon_role = Role::load(Role::ANONYMOUS_ID);
$this->grantPermissions($anon_role, ['access content']);
}
/**
* Tests token [current-page:query:cid|"foobar"] when get param is present.
*/
public function testCurrentPageGetParamPresent() {
$params = [
'cid' => 'param_cid',
'nid' => 'param_nid',
];
$this->drupalGet('webform/test', ['query' => $params]);
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-page-query"][@value="Lorem lorem param_cid"]');
}
/**
* Tests token [current-page:query:cid|"foobar"] when get param is missing.
*/
public function testCurrentPageGetParamMissing() {
// If not exists first param, use fallback.
$this->drupalGet('webform/test');
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-page-query"][@value="Lorem lorem [current-page:query:cid]"]');
}
/**
* Tests token [current-page:query:cid:clear|"foobar"]...
*
* When get param is missing.
*/
public function testCurrentPageGetParamMissingClear() {
// If not exists first param, use fallback.
$this->drupalGet('webform/test');
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-page-query-clear"][@value="Lorem lorem "]');
}
/**
* Tests token [current-user:display-name] still returns nothing.
*/
public function testAnonymousCurrentUser() {
$this->drupalGet('webform/test');
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-user-display-name"][@value="Lorem lorem "]');
}
/**
* Tests token [current-user:display-name|"Nothing"]...
*
* Does not return its fallback.
*/
public function testAnonymousCurrentUserFallback() {
$this->drupalGet('webform/test');
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-user-display-name-fallback"][@value="Lorem lorem "]');
}
}
<?php
namespace Drupal\Tests\token_or_webform\Functional;
use Drupal\Tests\BrowserTestBase;
use Drupal\user\Entity\Role;
/**
* Test that the module works.
*
* @group token_or_webform
*/
class TokenOrWebformFunctionalTest extends BrowserTestBase {
/**
* Modules to enable.
*
* @var array
*/
protected static $modules = [
'token_or',
'webform',
'token_or_webform_test',
'token_or_webform',
];
/**
* Theme to enable.
*
* @var string
*/
protected $defaultTheme = 'claro';
/**
* A user with permission to administer site configuration.
*
* @var \Drupal\user\UserInterface
*/
protected $user;
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$anon_role = Role::load(Role::ANONYMOUS_ID);
$this->grantPermissions($anon_role, ['access content']);
}
/**
* Tests token [current-page:query:cid|"foobar"] when get param is present.
*/
public function testCurrentPageGetParamPresent() {
$params = [
'cid' => 'param_cid',
];
$this->drupalGet('webform/test', ['query' => $params]);
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-page-query"][@value="Lorem lorem param_cid"]');
}
/**
* Tests token [current-page:query:cid|"foobar"] when get param is missing.
*/
public function testCurrentPageGetParamMissing() {
// If not exists first param, use fallback.
$this->drupalGet('webform/test');
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-page-query"][@value="Lorem lorem foobar"]');
}
/**
* Tests token [current-page:query:cid:clear|"foobar"]...
*
* When get param is missing.
*/
public function testCurrentPageGetParamMissingClear() {
// If not exists first param, use fallback.
$this->drupalGet('webform/test');
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-page-query-clear"][@value="Lorem lorem foobar"]');
}
/**
* Tests token [current-user:display-name] still returns nothing.
*/
public function testAnonymousCurrentUser() {
$this->drupalGet('webform/test');
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-user-display-name"][@value="Lorem lorem "]');
}
/**
* Tests token [current-user:display-name|"Nothing"] returns its fallback.
*/
public function testAnonymousCurrentUserFallback() {
$this->drupalGet('webform/test');
$this->assertSession()->statusCodeEquals(200);
$this->assertSession()->elementExists('xpath', '//*[@id="edit-current-user-display-name-fallback"][@value="Lorem lorem Nothing"]');
}
}
<?php
namespace Drupal\Tests\token_or_webform\Kernel;
use Drupal\KernelTests\KernelTestBase;
/**
* Tests the Token Or Webform module.
*
* @group token_or_webform
* @requires module token
*/
class TokenOrWebformKernelBrokenTest extends KernelTestBase {
/**
* Token service.
*
* @var \Drupal\token\Token
*/
protected $tokenService;
/**
* {@inheritdoc}
*/
protected static $modules = [
'webform',
'token',
'user',
'token_or',
];
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$this->tokenService = \Drupal::service('webform.token_manager');
}
/**
* Test that current user token does not fallback.
*/
public function testBrokenCurrentUserToken() {
$value = $this->tokenService->replace('[current-user:email|"foobar"]');
$this->assertEquals('', $value);
}
/**
* Test that current user token array does not fallback.
*/
public function testArrayToken() {
$value = $this->tokenService->replace(
['[current-user:email|"foobar"]', '[current-user:email|"foobar"]']
);
$this->assertEquals(['', ''], $value);
}
}
<?php
namespace Drupal\Tests\token_or_webform\Kernel;
use Drupal\KernelTests\KernelTestBase;
/**
* Tests the Token Or module.
*
* @group token_or_webform
* @requires module token
*/
class TokenOrWebformKernelTest extends KernelTestBase {
/**
* Token service.
*
* @var \Drupal\token\Token
*/
protected $tokenService;
/**
* {@inheritdoc}
*/
protected static $modules = [
'webform',
'token',
'user',
'token_or',
'token_or_webform',
];
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$this->tokenService = \Drupal::service('webform.token_manager');
}
/**
* Test that current user token does fallback.
*/
public function testToken() {
$value = $this->tokenService->replace('[current-user:display-name|"foobar"]');
$this->assertEquals('foobar', $value);
}
/**
* Test that current user token array does fallback.
*/
public function testArrayToken() {
$value = $this->tokenService->replace(
['[current-user:email|"foobar"]', '[current-user:email|"foobar"]']
);
$this->assertEquals(['foobar', 'foobar'], $value);
}
}
name: Token Or Webform
type: module
description: Support for token_or in webform.
core_version_requirement: ^9 || ^10
dependencies:
- webform:webform
- token_or:token_or
services:
token_or_webform.token_manager:
class: Drupal\token_or_webform\TokenOrWebformTokenManager
decorates: webform.token_manager
decoration_priority: 50
public: false
arguments: ['@current_user', '@language_manager', '@config.factory', '@module_handler', '@token']
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
namespace Drupal\token_or; namespace Drupal\token_or;
use Drupal\token\Token as OriginalToken;
use Drupal\Core\Render\BubbleableMetadata; use Drupal\Core\Render\BubbleableMetadata;
use Drupal\token\Token as OriginalToken;
/** /**
* Overrride class for tokens. * Overrride class for tokens.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment