webform.theme.template.inc in Webform 8.5
Same filename and directory in other branches
Preprocessors and helper functions to make theming easier.
File
includes/webform.theme.template.incView source
<?php
/**
* @file
* Preprocessors and helper functions to make theming easier.
*/
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Crypt;
use Drupal\Core\Link;
use Drupal\Core\Render\Element;
use Drupal\Core\Render\Markup;
use Drupal\Core\Url;
use Drupal\Core\Render\Element\RenderElement;
use Drupal\Core\Template\Attribute;
use Drupal\image\Entity\ImageStyle;
use Drupal\webform\Element\WebformCodeMirror;
use Drupal\webform\Element\WebformHtmlEditor;
use Drupal\webform\WebformMessageManagerInterface;
use Drupal\webform\WebformSubmissionInterface;
use Drupal\webform\Utility\WebformDateHelper;
use Drupal\webform\Utility\WebformDialogHelper;
use Drupal\webform\Utility\WebformElementHelper;
/**
* Prepares variables for webform help templates.
*
* Default template: webform_help.html.twig.
*
* @param array $variables
* An associative array containing:
* - title: Help title.
* - content: Help content.
*/
function template_preprocess_webform_help(array &$variables) {
/** @var \Drupal\webform\WebformHelpManagerInterface $help_manager */
$help_manager = \Drupal::service('webform.help_manager');
$help_info = $variables['info'];
$variables += $help_info;
$help = [];
// Content.
if (is_array($help_info['content'])) {
$help['content'] = $help_info['content'];
}
else {
$help['content'] = [
'#markup' => $help_info['content'],
];
}
// Video.
$video_info = isset($help_info['video_id']) ? $help_manager
->getVideo($help_info['video_id']) : $help_info;
if (isset($video_info['id'])) {
$help['link'] = $help_manager
->buildVideoLink($video_info['id']);
}
$variables['help'] = $help;
}
/**
* Prepares variables for webform templates.
*
* Default template: webform.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
* Properties used: #action, #method, #attributes, #webform_children.
*/
function template_preprocess_webform(array &$variables) {
template_preprocess_form($variables);
}
/**
* Prepares variables for webform actions templates.
*
* Default template: webform-actions.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties and buttons.
*
* @see \Drupal\webform\WebformSubmissionForm::actionsElement
* @see \Drupal\webform\WebformSubmissionForm::actions
*/
function template_preprocess_webform_actions(array &$variables) {
$element = $variables['element'];
// Buttons include submit, previous, next, and draft.
foreach (Element::children($element) as $key) {
$variables[$key] = $element[$key];
}
}
/**
* Prepares variables for webform confirmation templates.
*
* Default template: webform-confirmation.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - webform: A webform.
* - webform_submission: A webform submission.
* - source_entity: A webform submission source entity.
*/
function template_preprocess_webform_confirmation(array &$variables) {
/** @var \Drupal\webform\WebformInterface $webform */
$webform = $variables['webform'];
/** @var \Drupal\Core\Entity\EntityInterface $source_entity */
$source_entity = $variables['source_entity'];
/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = $variables['webform_submission'];
/** @var \Drupal\webform\WebformMessageManagerInterface $message_manager */
$message_manager = \Drupal::service('webform.message_manager');
$message_manager
->setWebformSubmission($webform_submission);
// Must set webform and source entity because webform submission could be
// NULL.
$message_manager
->setWebform($webform);
$message_manager
->setSourceEntity($source_entity);
// Assets: Add custom shared and webform specific CSS and JS.
// @see webform_css_alter()
// @see webform_js_alter()
$assets = $webform
->getAssets();
foreach ($assets as $type => $value) {
if ($value) {
$variables['#attached']['library'][] = "webform/webform.assets.{$type}";
$variables['#attached']['drupalSettings']['webform']['assets'][$type][$webform
->id()] = Crypt::hashBase64($value);
}
}
$settings = $webform
->getSettings();
// Set progress.
if ($webform
->getPages() && $settings['wizard_confirmation'] && ($settings['wizard_progress_bar'] || $settings['wizard_progress_pages'] || $settings['wizard_progress_percentage'])) {
$variables['progress'] = [
'#theme' => 'webform_progress',
'#webform' => $webform,
'#webform_submission' => $webform_submission,
'#current_page' => 'webform_confirmation',
];
}
// Set message.
$variables['message'] = $message_manager
->build(WebformMessageManagerInterface::SUBMISSION_CONFIRMATION_MESSAGE);
// Set attributes.
$variables['attributes'] = new Attribute($settings['confirmation_attributes']);
// Set back.
$variables['back'] = $settings['confirmation_back'];
$variables['back_label'] = $settings['confirmation_back_label'] ?: \Drupal::config('webform.settings')
->get('settings.default_confirmation_back_label');
$variables['back_attributes'] = new Attribute($settings['confirmation_back_attributes']);
// Get query string parameters.
$query = \Drupal::request()->query
->all();
// Add Ajax trigger to back link except for webform with unique limits which
// break the ajax callback.
// @see \Drupal\webform\WebformSubmissionForm::getCustomForm
// @see Drupal.behaviors.webformConfirmationBackAjax (js/webform.ajax.js)
$is_ajax = !empty($query['ajax_form']) ? TRUE : FALSE;
$is_limit_unique = $webform && ($webform
->getSetting('limit_total_unique') || $webform
->getSetting('limit_user_unique'));
if (!empty($is_ajax) && !$is_limit_unique) {
$variables['back_attributes']
->addClass('js-webform-confirmation-back-link-ajax');
}
// Apply all passed query string parameters to the 'Back to form' link.
unset($query['webform_id'], $query['ajax_form'], $query['_wrapper_format'], $query['token'], $query['page']);
$options = $query ? [
'query' => $query,
] : [];
// Set back_url.
if ($source_entity && $source_entity
->hasLinkTemplate('canonical')) {
$source_entity = \Drupal::service('entity.repository')
->getTranslationFromContext($source_entity);
$variables['back_url'] = $source_entity
->toUrl('canonical', $options)
->toString();
}
elseif ($webform_submission) {
$source_url = $webform_submission
->getSourceUrl();
$query = $source_url
->getOption('query');
unset($query['webform_id'], $query['ajax_form'], $query['_wrapper_format'], $query['token'], $query['page']);
$source_url
->setOption('query', $query);
$variables['back_url'] = $source_url
->toString();
}
else {
$variables['back_url'] = $webform
->toUrl('canonical', $options)
->toString();
}
$webform
->invokeHandlers('preprocessConfirmation', $variables);
}
/**
* Prepares variables for webform submission navigation templates.
*
* Default template: webform-submission-navigation.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - webform_submission: A webform submission.
* - rel: Webform submission link template.
* (canonical, edit-form, resend-form, html, text, or yaml).
*/
function template_preprocess_webform_submission_navigation(array &$variables) {
/** @var \Drupal\webform\WebformRequestInterface $request_handler */
$request_handler = \Drupal::service('webform.request');
/** @var \Drupal\webform\WebformSubmissionStorageInterface $webform_submission_storage */
$webform_submission_storage = \Drupal::entityTypeManager()
->getStorage('webform_submission');
/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = $variables['webform_submission'];
$webform = $webform_submission
->getWebform();
// Webform id and title for context.
$variables['webform_id'] = $webform
->id();
$variables['webform_title'] = $webform
->label();
// Get the route name, parameters, and source entity for the current page.
// This ensures that the user stays within their current context as they are
// paging through submission.
$route_name = \Drupal::routeMatch()
->getRouteName();
$route_parameters = \Drupal::routeMatch()
->getRawParameters()
->all();
$source_entity = $request_handler
->getCurrentSourceEntity('webform_submission');
if (strpos(\Drupal::routeMatch()
->getRouteName(), 'webform.user.submission') !== FALSE) {
$account = \Drupal::currentUser();
$options = [
'in_draft' => FALSE,
];
}
else {
$account = NULL;
$options = [
'in_draft' => NULL,
];
}
if ($previous_submission = $webform_submission_storage
->getPreviousSubmission($webform_submission, $source_entity, $account, $options)) {
$variables['prev_url'] = Url::fromRoute($route_name, [
'webform_submission' => $previous_submission
->id(),
] + $route_parameters)
->toString();
}
if ($next_submission = $webform_submission_storage
->getNextSubmission($webform_submission, $source_entity, $account, $options)) {
$variables['next_url'] = Url::fromRoute($route_name, [
'webform_submission' => $next_submission
->id(),
] + $route_parameters)
->toString();
}
$variables['#attached']['library'][] = 'webform/webform.navigation';
// Never cache navigation because previous and next submission will change
// as submissions are added and deleted.
$variables['#cache'] = [
'max-age' => 0,
];
}
/**
* Prepares variables for webform submission templates.
*
* Default template: webform-submission.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An array of elements to display in view mode.
* - webform_submission: The webform submissions object.
* - view_mode: View mode; e.g., 'html', 'text', 'table', 'yaml', etc.
*/
function template_preprocess_webform_submission(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
$variables['navigation'] = $variables['elements']['navigation'];
$variables['information'] = $variables['elements']['information'];
$variables['submission'] = $variables['elements']['submission'];
$variables['webform_submission'] = $variables['elements']['#webform_submission'];
if ($variables['webform_submission'] instanceof WebformSubmissionInterface) {
$variables['webform'] = $variables['webform_submission']
->getWebform();
}
}
/**
* Prepares variables for webform submission data templates.
*
* Default template: webform-submission-data.html.twig.
*
* @param array $variables
* An associative array containing:
* - data: An array of elements to display in view mode.
* - webform_submission: The webform submissions object.
* - view_mode: View mode; e.g., 'html', 'text', 'table', 'yaml', etc.
*/
function template_preprocess_webform_submission_data(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
$variables['webform_submission'] = $variables['elements']['#webform_submission'];
if ($variables['webform_submission'] instanceof WebformSubmissionInterface) {
$variables['webform'] = $variables['webform_submission']
->getWebform();
}
}
/**
* Prepares variables for webform submission information template.
*
* Default template: webform-submission-information.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - webform_submission: A webform submission.
*/
function template_preprocess_webform_submission_information(array &$variables) {
/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = $variables['webform_submission'];
$webform = $webform_submission
->getWebform();
$variables['serial'] = $webform_submission
->serial();
$variables['sid'] = $webform_submission
->id();
$variables['uuid'] = $webform_submission
->uuid();
$variables['is_draft'] = $webform_submission
->isDraft() ? t('Yes') : t('No');
$variables['current_page'] = $webform_submission
->getCurrentPageTitle();
$variables['remote_addr'] = $webform_submission
->getRemoteAddr();
$variables['submitted_by'] = $webform_submission
->getOwner()
->toLink();
$variables['webform'] = $webform
->toLink();
$variables['created'] = WebformDateHelper::format($webform_submission
->getCreatedTime());
$variables['completed'] = WebformDateHelper::format($webform_submission
->getCompletedTime());
$variables['changed'] = WebformDateHelper::format($webform_submission
->getChangedTime());
$variables['sticky'] = $webform_submission
->isSticky() ? t('Yes') : '';
$variables['locked'] = $webform_submission
->isLocked() ? t('Yes') : '';
$variables['notes'] = $webform_submission
->getNotes();
// @see \Drupal\Core\Field\Plugin\Field\FieldFormatter\LanguageFormatter::viewValue()
$languages = \Drupal::languageManager()
->getNativeLanguages();
$langcode = $webform_submission
->get('langcode')->value;
$variables['language'] = isset($languages[$langcode]) ? $languages[$langcode]
->getName() : $langcode;
if ($source_url = $webform_submission
->getSourceUrl()) {
$variables['uri'] = Link::fromTextAndUrl($source_url
->setAbsolute(FALSE)
->toString(), $source_url);
}
$token_operations = [
'view',
'update',
'delete',
];
foreach ($token_operations as $token_operation) {
if ($webform
->getSetting('token_' . $token_operation)) {
$token_url = $webform_submission
->getTokenUrl($token_operation);
$variables['token_' . $token_operation] = Link::fromTextAndUrl($token_url
->setAbsolute(FALSE)
->toString(), $token_url);
}
}
if (($source_entity = $webform_submission
->getSourceEntity()) && $source_entity
->hasLinkTemplate('canonical')) {
$variables['submitted_to'] = $source_entity
->toLink();
}
$variables['submissions_view'] = FALSE;
if ($webform
->access('submission_view_any')) {
$variables['submissions_view'] = TRUE;
}
elseif ($source_entity) {
$entity_type = $source_entity
->getEntityTypeId();
if (\Drupal::currentUser()
->hasPermission("view webform node submissions any {$entity_type}")) {
$variables['submissions_view'] = TRUE;
}
elseif (\Drupal::currentUser()
->hasPermission("view webform node submissions own {$entity_type}") && method_exists($source_entity, 'getOwnerId') && (int) $source_entity
->getOwnerId() === (int) \Drupal::currentUser()
->id()) {
$variables['submissions_view'] = TRUE;
}
}
if ($webform_submission
->access('delete')) {
/** @var \Drupal\webform\WebformRequestInterface $request_handler */
$request_handler = \Drupal::service('webform.request');
$current_url = Url::fromRoute('<current>')
->toString();
$source_entity_url = $webform_submission
->getSourceUrl()
->setAbsolute(FALSE)
->toString();
$route_options = [];
if ($current_url === $source_entity_url) {
$base_route_name = 'webform.user.submission.delete';
$route_options = [
'query' => \Drupal::destination()
->getAsArray(),
];
}
elseif (strpos(\Drupal::routeMatch()
->getRouteName(), 'webform.user.submission') !== FALSE || !$webform
->access('submission_view_any')) {
$base_route_name = 'webform.user.submission.delete';
}
else {
$base_route_name = 'webform_submission.delete_form';
}
// Append token to delete URL.
$token = \Drupal::request()->query
->get('token');
if ($webform
->getSetting('token_delete') && $token === $webform_submission
->getToken()) {
$route_options['query']['token'] = $token;
}
$url = $request_handler
->getUrl($webform_submission, $source_entity, $base_route_name, $route_options);
$variables['delete'] = [
'#type' => 'link',
'#title' => t('Delete submission'),
'#url' => $url,
'#attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW, [
'button',
'button--danger',
]),
];
WebformDialogHelper::attachLibraries($variables['delete']);
}
}
/**
* Prepares variables for webform CodeMirror templates.
*
* Default template: webform-codemirror.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - code: The code.
* - type: The type of code.
*/
function template_preprocess_webform_codemirror(array &$variables) {
$variables['mode'] = WebformCodeMirror::getMode($variables['type']);
if (is_string($variables['code'])) {
// Encode all HTML entities include tags.
$variables['code'] = Markup::create(htmlentities($variables['code']));
}
}
/**
* Prepares variables for webform element base HTML templates.
*
* Default template: webform-element-base-html.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
* - value: The content for the element.
* - options Associative array of options for element.
* - multiline: Flag to determine if value spans multiple lines.
* - email: Flag to determine if element is for an email.
*/
function template_preprocess_webform_element_base_html(array &$variables) {
$element = $variables['element'];
// Set title.
_template_progress_webform_set_title($variables);
// Build form (item) element for HTML display.
// @see form-element.html.twig
// @see template_preprocess_form_element
if (empty($variables['options']['email']) && isset($element['#type'])) {
$type = $element['#type'];
$attributes = isset($element['#format_attributes']) ? $element['#format_attributes'] : [];
$attributes += [
'class' => [],
];
// Use wrapper attributes for the id instead of #id,
// this stops the <label> from having a 'for' attribute.
$attributes += [
'id' => $element['#webform_id'],
];
$attributes['class'][] = 'webform-element';
$attributes['class'][] = 'webform-element-type-' . str_replace('_', '-', $type);
$variables['item'] = [
'#type' => 'item',
'#title' => $variables['title'],
'#name' => $element['#webform_key'],
'#wrapper_attributes' => $attributes,
];
if (is_array($variables['value'])) {
$variables['item']['value'] = $variables['value'];
}
else {
$variables['item']['#markup'] = $variables['value'];
}
}
else {
$variables['title'] = [
'#markup' => $variables['title'],
];
}
}
/**
* Prepares variables for webform element base text templates.
*
* Default template: webform-element-base-text.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
* - value: The content for the element.
* - options Associative array of options for element.
* - multiline: Flag to determine if value spans multiple lines.
* - email: Flag to determine if element is for an email.
*/
function template_preprocess_webform_element_base_text(array &$variables) {
// Set title.
_template_progress_webform_set_title($variables, TRUE);
}
/**
* Set variables title to element #title or #admin_title.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
* @param bool $strip_tags
* Remove HTML tags from title.
*/
function _template_progress_webform_set_title(array &$variables, $strip_tags = FALSE) {
$element = $variables['element'];
// Set title.
$variables['title'] = WebformElementHelper::isTitleDisplayed($element) ? $element['#title'] : NULL;
if (empty($variables['title']) && !empty($element['#admin_title'])) {
$variables['title'] = $element['#admin_title'];
}
// Strip all HTML tags from the title.
if ($strip_tags) {
$variables['title'] = strip_tags($variables['title']);
}
}
/******************************************************************************/
// Preprocess templates.
/******************************************************************************/
/**
* Prepares variables for webform 'wizard' progress templates.
*
* Default template: webform-progress.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - webform: A webform.
* - current_page: The current wizard page.
*/
function template_preprocess_webform_progress(array &$variables) {
/** @var \Drupal\webform\WebformLibrariesManagerInterface $libraries_manager */
$libraries_manager = \Drupal::service('webform.libraries_manager');
/** @var \Drupal\webform\WebformInterface $webform */
$webform = $variables['webform'];
/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = $variables['webform_submission'];
$current_page = $variables['current_page'];
$operation = $variables['operation'];
$pages = $variables['pages'] ?: $webform
->getPages($operation, $webform_submission);
$page_keys = array_keys($pages);
$page_indexes = array_flip($page_keys);
$current_index = $page_indexes[$current_page];
$total = count($page_keys);
$variables['index'] = $current_index + 1;
$variables['total'] = $total;
if ($webform
->getSetting('wizard_progress_bar')) {
$variables['bar'] = [
'#theme' => $libraries_manager
->isIncluded('progress-tracker') ? 'webform_progress_tracker' : 'webform_progress_bar',
'#webform' => $webform,
'#webform_submission' => $webform_submission,
'#current_page' => $current_page,
'#operation' => $operation,
'#pages' => $variables['pages'],
];
}
if ($webform
->getSetting('wizard_progress_pages')) {
$variables['summary'] = t('@start of @end', [
'@start' => $current_index + 1,
'@end' => $total,
]);
}
if ($webform
->getSetting('wizard_progress_percentage')) {
$variables['percentage'] = number_format($current_index / ($total - 1) * 100, 0) . '%';
}
}
/**
* Prepares variables for webform 'wizard' progress bar templates.
*
* Default template: webform-progress-bar.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - webform: A webform.
* - current_page: The current wizard page.
*/
function template_preprocess_webform_progress_bar(array &$variables) {
_template_preprocess_webform_progress($variables);
}
/**
* Prepares variables for webform 'wizard' progress tracker templates.
*
* Default template: webform-progress-tracker.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - webform: A webform.
* - current_page: The current wizard page.
*/
function template_preprocess_webform_progress_tracker(array &$variables) {
_template_preprocess_webform_progress($variables);
}
/**
* Prepares variables for webform 'wizard' progress bar & tracker templates.
*
* @param array $variables
* An associative array containing the following key:
* - webform: A webform.
* - current_page: The current wizard page.
*/
function _template_preprocess_webform_progress(array &$variables) {
/** @var \Drupal\webform\WebformInterface $webform */
$webform = $variables['webform'];
/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = $variables['webform_submission'];
$current_page = $variables['current_page'];
$operation = $variables['operation'];
$pages = $variables['pages'] ?: $webform
->getPages($operation, $webform_submission);
$page_keys = array_keys($pages);
$page_indexes = array_flip($page_keys);
$current_index = $page_indexes[$current_page];
$variables['current_index'] = $current_index;
// Reset the pages variable.
$variables['progress'] = [];
foreach ($pages as $key => $page) {
$variables['progress'][] = [
'name' => $key,
'title' => isset($page['#title']) ? $page['#title'] : '',
'type' => isset($page['#type']) ? $page['#type'] : 'page',
];
}
}
/******************************************************************************/
// Element templates.
/******************************************************************************/
/**
* Prepares variables for webform message templates.
*
* Default template: webform-message.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
* Properties used: #id, #attributes, #children.
*
* @see template_preprocess_container()
*/
function template_preprocess_webform_message(array &$variables) {
$variables['has_parent'] = FALSE;
$element = $variables['element'];
// Ensure #attributes is set.
$element += [
'#attributes' => [],
];
// Special handling for webform elements.
if (isset($element['#array_parents'])) {
// Assign an html ID.
if (!isset($element['#attributes']['id'])) {
$element['#attributes']['id'] = $element['#id'];
}
$variables['has_parent'] = TRUE;
}
$variables['message'] = $element['#message'];
$variables['attributes'] = $element['#attributes'];
if (isset($element['#closed'])) {
$variables['closed'] = $element['#closed'];
}
}
/**
* Prepares variables for webform HTML Editor markup templates.
*
* Default template: webform-html-editor-markup.html.twig.
*
* @param array $variables
* An associative array containing:
* - markup: HTML markup.
* - allowed_tags: Allowed tags.
*/
function template_preprocess_webform_html_editor_markup(array &$variables) {
$variables['content'] = [
'#markup' => $variables['markup'],
'#allowed_tags' => $variables['allowed_tags'],
];
}
/**
* Prepares variables for webform horizontal rule templates.
*
* Default template: webform-horizontal-rule.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
* Properties used: #id, #attributes.
*/
function template_preprocess_webform_horizontal_rule(array &$variables) {
$element = $variables['element'];
if (!empty($element['#id'])) {
$variables['attributes']['id'] = $element['#id'];
}
}
/**
* Prepares variables for webform section element templates.
*
* Default template: webform-section.html.twig.
*
* Copied from: template_preprocess_fieldset()
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
* Properties used: #attributes, #children, #description, #id, #title,
* #value.
*/
function template_preprocess_webform_section(array &$variables) {
$element = $variables['element'];
Element::setAttributes($element, [
'id',
]);
RenderElement::setAttributes($element);
$variables['attributes'] = isset($element['#attributes']) ? $element['#attributes'] : [];
$variables['prefix'] = isset($element['#field_prefix']) ? $element['#field_prefix'] : NULL;
$variables['suffix'] = isset($element['#field_suffix']) ? $element['#field_suffix'] : NULL;
$variables['title_display'] = isset($element['#title_display']) ? $element['#title_display'] : NULL;
$variables['title_tag'] = isset($element['#title_tag']) ? $element['#title_tag'] : 'h2';
$variables['title_attributes'] = isset($element['#title_attributes']) ? $element['#title_attributes'] : [];
$variables['description_display'] = isset($element['#description_display']) ? $element['#description_display'] : 'before';
$variables['children'] = $element['#children'];
$variables['required'] = !empty($element['#required']) ? $element['#required'] : NULL;
// Allow markup in title.
if (isset($element['#title']) && $element['#title'] !== '') {
$variables['title'] = [
'#markup' => $element['#title'],
];
}
// Add 'visually-hidden' class to title attributes.
if ($variables['title_display'] === 'invisible') {
$variables['title_attributes']['class'][] = 'visually-hidden';
}
$variables['title_attributes'] = new Attribute($variables['title_attributes']);
if (!empty($element['#description'])) {
$description_id = $element['#attributes']['id'] . '--description';
$description_attributes['id'] = $description_id;
$variables['description']['attributes'] = new Attribute($description_attributes);
$variables['description']['content'] = $element['#description'];
// Add the description's id to the fieldset aria attributes.
$variables['attributes']['aria-describedby'] = $description_id;
}
// Suppress error messages.
$variables['errors'] = NULL;
// Setup description, help, and more.
_webform_preprocess_element($variables);
}
/******************************************************************************/
// Composite templates
/******************************************************************************/
/**
* Prepares variables for webform composite templates.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
*/
function _template_preprocess_webform_composite(array &$variables) {
$element = $variables['element'];
// Copy all accessible element children to content.
foreach (Element::children($element) as $key) {
if (!isset($element[$key]['#access']) || $element[$key]['#access']) {
$variables['content'][$key] = $element[$key];
}
}
// Set flexbox variable used for multi column element layout.
$variables['flexbox'] = isset($element['#flexbox']) ? $element['#flexbox'] : FALSE;
}
/**
* Prepares variables for composite address templates.
*
* Default template: webform-composite-address.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
*/
function template_preprocess_webform_composite_address(array &$variables) {
_template_preprocess_webform_composite($variables);
}
/**
* Prepares variables for composite contact templates.
*
* Default template: webform-composite-contact.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
*/
function template_preprocess_webform_composite_contact(array &$variables) {
_template_preprocess_webform_composite($variables);
}
/**
* Prepares variables for composite link templates.
*
* Default template: webform-composite-link.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
*/
function template_preprocess_webform_composite_link(array &$variables) {
$variables['content'] = $variables['element'];
}
/**
* Prepares variables for composite location templates.
*
* Default template: webform-composite-location.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
*/
function template_preprocess_webform_composite_location(array &$variables) {
$variables['content'] = $variables['element'];
}
/**
* Prepares variables for composite name templates.
*
* Default template: webform-composite-name.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
*/
function template_preprocess_webform_composite_name(array &$variables) {
_template_preprocess_webform_composite($variables);
}
/**
* Prepares variables for composite telephone templates.
*
* Default template: webform-composite-telephone.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
*/
function template_preprocess_webform_composite_telephone(array &$variables) {
_template_preprocess_webform_composite($variables);
}
/******************************************************************************/
// Element templates
/******************************************************************************/
/**
* Prepares variables for webform element help templates.
*
* Default template: webform-element-help.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
* - help: The help content.
* - attributes: The help attributes.
*/
function template_preprocess_webform_element_help(array &$variables) {
$attributes = isset($variables['attributes']) ? $variables['attributes'] : [];
$attributes['class'][] = 'webform-element-help';
$attributes['class'][] = 'js-webform-element-help';
$attributes['role'] = 'tooltip';
$attributes['tabindex'] = '0';
$attributes['aria-label'] = $variables['help_title'] ?: t('Help tooltip');
$content = is_array($variables['help']) ? \Drupal::service('renderer')
->render($variables['help']) : $variables['help'];
$help = '';
if (!empty($variables['help_title'])) {
$help .= '<div class="webform-element-help--title">' . WebformHtmlEditor::stripTags($variables['help_title']) . '</div>';
}
$help .= '<div class="webform-element-help--content">' . WebformHtmlEditor::stripTags($content) . '</div>';
$attributes['data-webform-help'] = $help;
$variables['attributes'] = new Attribute($attributes);
}
/**
* Prepares variables for webform element more templates.
*
* Default template: webform-element-more.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
*/
function template_preprocess_webform_element_more(array &$variables) {
if (empty($variables['more_title'])) {
$variables['more_title'] = \Drupal::config('webform.settings')
->get('element.default_more_title');
}
if (!is_array($variables['more'])) {
$variables['more'] = [
'#markup' => $variables['more'],
'#allowed_tags' => WebformHtmlEditor::getAllowedTags(),
];
}
$variables['attributes'] = new Attribute($variables['attributes']);
// Make sure there is a unique id.
if (empty($variables['id'])) {
$variables['id'] = Html::getUniqueId('webform-element-more');
}
// Make sure attributes id is set.
if (!isset($variables['attributes']['id'])) {
$variables['attributes']['id'] = $variables['id'];
}
}
/**
* Prepares variables for webform element managed file templates.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
* - value: The content for the element.
* - options Associative array of options for element.
* - file: The element's File object.
*/
function template_preprocess_webform_element_managed_file(array &$variables) {
if (!empty($variables['file'])) {
/** @var \Drupal\file\FileInterface $file */
$file = $variables['file'];
$variables['uri'] = file_create_url($file
->getFileUri());
$variables['extension'] = strtolower(pathinfo($variables['uri'], PATHINFO_EXTENSION));
$variables['type'] = \Drupal::service('file.mime_type.guesser')
->guess($variables['uri']);
$variables['file_link'] = [
'#theme' => 'file_link',
'#file' => $file,
];
}
}
/**
* Prepares variables for webform element audio file templates.
*
* Default template: webform-element-audio-file.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
* - value: The content for the element.
* - options Associative array of options for element.
* - file: The element's File object.
*/
function template_preprocess_webform_element_audio_file(array &$variables) {
template_preprocess_webform_element_managed_file($variables);
}
/**
* Prepares variables for webform element document file templates.
*
* Default template: webform-element-document-file.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
* - value: The content for the element.
* - options Associative array of options for element.
* - file: The element's File object.
*/
function template_preprocess_webform_element_document_file(array &$variables) {
template_preprocess_webform_element_managed_file($variables);
}
/**
* Prepares variables for webform element image file templates.
*
* Default template: webform-element-image-file.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
* - value: The content for the element.
* - options Associative array of options for element.
* - file: The element's File object.
* - style_name: An image style name.
* - format: Image formatting (link or modal)
*/
function template_preprocess_webform_element_image_file(array &$variables) {
if (!empty($variables['file'])) {
/** @var \Drupal\file\FileInterface $file */
$file = $variables['file'];
$style_name = $variables['style_name'];
$format = $variables['format'];
$uri = $file
->getFileUri();
$url = Url::fromUri(file_create_url($uri));
$extension = pathinfo($uri, PATHINFO_EXTENSION);
$is_image = in_array($extension, [
'gif',
'png',
'jpg',
'jpeg',
]);
// Build image.
if ($is_image && \Drupal::moduleHandler()
->moduleExists('image') && $style_name && ImageStyle::load($style_name)) {
$variables['image'] = [
'#theme' => 'image_style',
'#style_name' => $variables['style_name'],
];
}
else {
// Note: The 'image' template uses root-relative paths.
// The 'image' is preprocessed to use absolute URLs.
// @see webform_preprocess_image().
$variables['image'] = [
'#theme' => 'image',
];
}
$variables['image'] += [
'#uri' => $uri,
'#attributes' => [
'class' => [
'webform-image-file',
],
'alt' => $file
->getFilename(),
'title' => $file
->getFilename(),
],
];
// For the Results table always display the file name as a tooltip.
if (strpos(\Drupal::routeMatch()
->getRouteName(), 'webform.results_submissions') !== FALSE) {
$variables['attached']['library'][] = 'webform/webform.tooltip';
$variables['image']['#attributes']['class'][] = 'js-webform-tooltip-link';
}
// Wrap 'image' in a link/modal.
if ($format && $format !== 'image') {
$variables['image'] = [
'#type' => 'link',
'#title' => $variables['image'],
'#url' => $url,
];
switch ($format) {
case 'modal':
$variables['image'] += [
'#attributes' => [
'class' => [
'js-webform-image-file-modal',
'webform-image-file-modal',
],
],
'#attached' => [
'library' => [
'webform/webform.element.image_file.modal',
],
],
];
break;
case 'link':
$variables['image'] += [
'#attributes' => [
'class' => [
'webform-image-file-link',
],
],
];
break;
}
}
}
}
/**
* Prepares variables for webform element video file templates.
*
* Default template: webform-element-video-file.html.twig.
*
* @param array $variables
* An associative array containing the following key:
* - element: The webform element.
* - value: The content for the element.
* - options Associative array of options for element.
* - file: The element's File object.
*/
function template_preprocess_webform_element_video_file(array &$variables) {
template_preprocess_webform_element_managed_file($variables);
}
Functions
Name![]() |
Description |
---|---|
template_preprocess_webform | Prepares variables for webform templates. |
template_preprocess_webform_actions | Prepares variables for webform actions templates. |
template_preprocess_webform_codemirror | Prepares variables for webform CodeMirror templates. |
template_preprocess_webform_composite_address | Prepares variables for composite address templates. |
template_preprocess_webform_composite_contact | Prepares variables for composite contact templates. |
template_preprocess_webform_composite_link | Prepares variables for composite link templates. |
template_preprocess_webform_composite_location | Prepares variables for composite location templates. |
template_preprocess_webform_composite_name | Prepares variables for composite name templates. |
template_preprocess_webform_composite_telephone | Prepares variables for composite telephone templates. |
template_preprocess_webform_confirmation | Prepares variables for webform confirmation templates. |
template_preprocess_webform_element_audio_file | Prepares variables for webform element audio file templates. |
template_preprocess_webform_element_base_html | Prepares variables for webform element base HTML templates. |
template_preprocess_webform_element_base_text | Prepares variables for webform element base text templates. |
template_preprocess_webform_element_document_file | Prepares variables for webform element document file templates. |
template_preprocess_webform_element_help | Prepares variables for webform element help templates. |
template_preprocess_webform_element_image_file | Prepares variables for webform element image file templates. |
template_preprocess_webform_element_managed_file | Prepares variables for webform element managed file templates. |
template_preprocess_webform_element_more | Prepares variables for webform element more templates. |
template_preprocess_webform_element_video_file | Prepares variables for webform element video file templates. |
template_preprocess_webform_help | Prepares variables for webform help templates. |
template_preprocess_webform_horizontal_rule | Prepares variables for webform horizontal rule templates. |
template_preprocess_webform_html_editor_markup | Prepares variables for webform HTML Editor markup templates. |
template_preprocess_webform_message | Prepares variables for webform message templates. |
template_preprocess_webform_progress | Prepares variables for webform 'wizard' progress templates. |
template_preprocess_webform_progress_bar | Prepares variables for webform 'wizard' progress bar templates. |
template_preprocess_webform_progress_tracker | Prepares variables for webform 'wizard' progress tracker templates. |
template_preprocess_webform_section | Prepares variables for webform section element templates. |
template_preprocess_webform_submission | Prepares variables for webform submission templates. |
template_preprocess_webform_submission_data | Prepares variables for webform submission data templates. |
template_preprocess_webform_submission_information | Prepares variables for webform submission information template. |
template_preprocess_webform_submission_navigation | Prepares variables for webform submission navigation templates. |
_template_preprocess_webform_composite | Prepares variables for webform composite templates. |
_template_preprocess_webform_progress | Prepares variables for webform 'wizard' progress bar & tracker templates. |
_template_progress_webform_set_title | Set variables title to element #title or #admin_title. |