View source
<?php
use Drupal\Component\Utility\Crypt;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\NestedArray;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Site\Settings;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Url;
use Drupal\Core\Render\Markup;
use Drupal\Core\Session\AccountInterface;
use Drupal\webform\WebformSubmissionInterface;
define('WEBFORM_ENTITY_PRINT_IMAGE_TOKEN', 'webform_entity_print_itok');
function webform_entity_print_webform_submission_access(WebformSubmissionInterface $webform_submission, $operation, AccountInterface $account) {
if ($operation !== 'view') {
return AccessResult::neutral();
}
$route_name = \Drupal::routeMatch()
->getRouteName();
if (!in_array($route_name, [
'system.files',
'image.style_private',
])) {
return AccessResult::neutral();
}
$webform_entity_print_token = \Drupal::request()->query
->get(WEBFORM_ENTITY_PRINT_IMAGE_TOKEN);
if (!$webform_entity_print_token) {
return AccessResult::neutral();
}
$uri = \Drupal::request()
->getUri();
$webform_id = $webform_submission
->getWebform()
->id();
$sid = $webform_submission
->id();
if (!preg_match('#(?:/private|/system/files)/webform/' . $webform_id . '/' . $sid . '#', parse_url($uri, PHP_URL_PATH))) {
return AccessResult::neutral();
}
$encrypt_token = _webform_entity_print_token_generate($uri);
return AccessResult::allowedIf($webform_entity_print_token === $encrypt_token);
}
function webform_entity_print_webform_submission_view_alter(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
$route_name = \Drupal::routeMatch()
->getRouteName();
$is_entity_print = in_array($route_name, [
'entity_print.view.debug',
'entity_print.view',
]) || \Drupal::request()->request
->get('_webform_entity_print');
if ($is_entity_print) {
_webform_entity_print_webform_submission_template($build, $entity, $display);
}
elseif (in_array($display
->getMode(), [
'html',
'table',
])) {
_webform_entity_print_webform_submission_links($build, $entity, $display);
}
}
function _webform_entity_print_webform_submission_template(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
$third_party_settings_manager = \Drupal::service('webform.third_party_settings_manager');
$default_template_settings = $third_party_settings_manager
->getThirdPartySetting('webform_entity_print', 'template') ?: [];
$webform_template_settings = $entity
->getWebform()
->getThirdPartySetting('webform_entity_print', 'template') ?: [];
$template = array_filter($webform_template_settings) + array_filter($default_template_settings);
$token_manager = \Drupal::service('webform.token_manager');
$template = $token_manager
->replace($template, $entity);
if (!empty($template['header'])) {
$build['webform_entity_print_header'] = [
'#type' => 'container',
'#attributes' => [
'class' => [
'webform-entity-print-header',
],
],
'#markup' => $template['header'],
'#weight' => -20,
];
}
if (!empty($template['footer'])) {
$build['webform_entity_print_footer'] = [
'#type' => 'container',
'#attributes' => [
'class' => [
'webform-entity-print-footer',
],
],
'#markup' => $template['footer'],
'#weight' => 20,
];
}
}
function _webform_entity_print_webform_submission_links(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
$view_mode = $display
->getMode();
$export_types = \Drupal::service('plugin.manager.entity_print.export_type')
->getDefinitions();
$access_manager = \Drupal::accessManager();
$third_party_settings_manager = \Drupal::service('webform.third_party_settings_manager');
$debug = $third_party_settings_manager
->getThirdPartySetting('webform_entity_print', 'debug');
$default_export_type_settings = $third_party_settings_manager
->getThirdPartySetting('webform_entity_print', 'export_types') ?: [];
$webform_export_type_settings = $entity
->getWebform()
->getThirdPartySetting('webform_entity_print', 'export_types') ?: [];
$print_links = [];
$debug_links = [];
foreach ($export_types as $export_type => $definition) {
$webform_export_type_settings += [
$export_type => [],
];
$default_export_type_settings += [
$export_type => [],
];
$export_settings = array_filter($webform_export_type_settings[$export_type]) + $default_export_type_settings[$export_type] + [
'link_text' => '',
'link_attributes' => [],
];
if (empty($export_settings['enabled']) || empty($export_settings['link_text'])) {
continue;
}
$key = 'webform_entity_print_view_' . $export_type;
$route_params = [
'entity_type' => $entity
->getEntityTypeId(),
'entity_id' => $entity
->id(),
'export_type' => trim($export_type, '_engine'),
];
$route_options = [
'query' => [
'view_mode' => $view_mode,
],
];
$token = \Drupal::request()
->get('token');
if ($token && $token === $entity
->getToken()) {
$route_options['query']['token'] = $token;
}
$link_attributes = $export_settings['link_attributes'];
$link_attributes += [
'class' => [],
];
$link_attributes['class'][] = 'webform-entity-print-link';
$link_attributes['class'][] = Html::getClass('webform-entity-print-link-' . $export_type);
$print_links[$key] = [
'#type' => 'link',
'#title' => $export_settings['link_text'],
'#export_type' => $export_type,
'#url' => Url::fromRoute('entity_print.view', $route_params, $route_options),
'#attributes' => $link_attributes,
'#access' => $access_manager
->checkNamedRoute('entity_print.view', $route_params, NULL, TRUE),
];
if ($debug) {
$debug_links[$key] = [
'#type' => 'link',
'#title' => $definition['label'],
'#export_type' => $export_type,
'#url' => Url::fromRoute('entity_print.view.debug', $route_params, $route_options),
'#access' => $access_manager
->checkNamedRoute('entity_print.view', $route_params, NULL, TRUE),
'#prefix' => $debug_links ? ' | ' : '',
];
}
}
if ($print_links) {
$build['webform_entity_print'] = [
'#type' => 'actions',
'#attributes' => [
'class' => [
'webform-entity-print-links',
],
],
] + $print_links;
}
if ($debug_links) {
$build['webform_entity_print_debug'] = [
'#suffix' => '<p>',
'#prefix' => '</p>',
'title' => [
'#markup' => '<strong>' . t('Debug') . '</strong>',
'#suffix' => ': ',
],
] + $debug_links;
}
}
function webform_entity_print_preprocess_entity_print(array &$variables) {
$webform_submission = _webform_entity_print_preprocess_entity_print_get_webform_submission($variables['content']);
if (!$webform_submission) {
return;
}
$variables['webform_submission'] = $webform_submission;
$webform = $webform_submission
->getWebform();
$css = [];
$assets = $webform
->getAssets();
if ($assets['css']) {
$css[] = $assets['css'];
}
$third_party_settings_manager = \Drupal::service('webform.third_party_settings_manager');
$default_template = $third_party_settings_manager
->getThirdPartySetting('webform_entity_print', 'template') ?: [];
if (!empty($default_template['css'])) {
$css[] = $default_template['css'];
}
$webform_template = $webform
->getThirdPartySetting('webform_entity_print', 'template') ?: [];
if (!empty($webform_template['css'])) {
$css[] = $webform_template['css'];
}
$variables['entity_print_css'] = Markup::create($variables['entity_print_css'] . PHP_EOL . '<style type="text/css" media="all">' . PHP_EOL . implode(PHP_EOL, $css) . PHP_EOL . '</style>' . PHP_EOL);
$content =& NestedArray::getValue($variables, [
'content',
0,
0,
]);
if (!$content) {
$content =& NestedArray::getValue($variables, [
'content',
0,
]);
}
if (!$content || !is_array($content) || !isset($content['#theme']) || $content['#theme'] !== 'webform_submission_data') {
return;
}
$webform_id = $webform
->id();
$sid = $webform_submission
->id();
$html = (string) \Drupal::service('renderer')
->render($content);
if (preg_match_all('#(src\\s*=\\s*")([^"]+(?:/private|/system/files)/webform/' . $webform_id . '/' . $sid . '/[^"]+)#', $html, $matches)) {
foreach ($matches[2] as $index => $found_uri) {
$token_query = [
WEBFORM_ENTITY_PRINT_IMAGE_TOKEN => _webform_entity_print_token_generate($found_uri),
];
$replace_uri = $found_uri . (strpos($found_uri, '?') !== FALSE ? '&' : '?') . UrlHelper::buildQuery($token_query);
$html = str_replace($matches[0][$index], $matches[1][$index] . $replace_uri, $html);
}
}
$content = [
'#markup' => Markup::create($html),
];
}
function _webform_entity_print_preprocess_entity_print_get_webform_submission(array $variables) {
foreach ($variables as $key => $value) {
if ($key === '#webform_submission' && $value instanceof WebformSubmissionInterface) {
return $value;
}
elseif (!is_array($value)) {
continue;
}
elseif ($webform_submission = _webform_entity_print_preprocess_entity_print_get_webform_submission($value)) {
return $webform_submission;
}
}
}
function _webform_entity_print_token_generate($uri) {
$path = parse_url($uri, PHP_URL_PATH);
return Crypt::hmacBase64('webform-entity-print-path-' . $path, Settings::getHashSalt());
}