configFactory = $config_factory; $this->token = $token; $this->requestManager = $webform_request; $this->handlerManager = $handler_manager; $this->elementManager = $element_manager; } /** * {@inheritdoc} */ public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) { return new static( $entity_type, $container->get('entity.manager'), $container->get('language_manager'), $container->get('config.factory'), $container->get('token'), $container->get('webform.request'), $container->get('plugin.manager.webform.handler'), $container->get('plugin.manager.webform.element') ); } /** * {@inheritdoc} */ public function buildComponents(array &$build, array $entities, array $displays, $view_mode) { /** @var \Drupal\webform\WebformSubmissionInterface[] $entities */ /** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */ if (empty($entities)) { return; } $source_entity = $this->requestManager->getCurrentSourceEntity('webform_submission'); parent::buildComponents($build, $entities, $displays, $view_mode); // If the view mode is default then display the HTML version. if ($view_mode == 'default') { $view_mode = 'html'; } // Build submission display. foreach ($entities as $id => $webform_submission) { $build[$id]['submission'] = [ '#theme' => 'webform_submission_' . $view_mode, '#webform_submission' => $webform_submission, '#source_entity' => $source_entity, ]; } } /** * {@inheritdoc} */ public function buildElements(array $elements, array $data, array $options = [], $format = 'html') { $build_method = 'build' . ucfirst($format); $build = []; foreach ($elements as $key => $element) { if (!is_array($element) || Element::property($key) || !$this->isVisibleElement($element) || isset($options['excluded_elements'][$key])) { continue; } $plugin_id = $this->elementManager->getElementPluginId($element); /** @var \Drupal\webform\WebformElementInterface $webform_element */ $webform_element = $this->elementManager->createInstance($plugin_id); // Check element view access. if (!$webform_element->checkAccessRules('view', $element)) { continue; } if ($webform_element->isContainer($element)) { $children = $this->buildElements($element, $data, $options, $format); if ($children) { // Add #first and #last property to $children. // This is used to remove return from #last with multiple lines of // text. // @see webform-element-base-text.html.twig reset($children); $first_key = key($children); if (isset($children[$first_key]['#options'])) { $children[$first_key]['#options']['first'] = TRUE; } end($children); $last_key = key($children); if (isset($children[$last_key]['#options'])) { $children[$last_key]['#options']['last'] = TRUE; } } // Build the container but make sure it is not empty. Containers // (ie details, fieldsets, etc...) without children will be empty // but markup should always be rendered. if ($build_container = $webform_element->$build_method($element, $children, $options)) { $build[$key] = $build_container; } } else { $value = isset($data[$key]) ? $data[$key] : NULL; if ($build_element = $webform_element->$build_method($element, $value, $options)) { $build[$key] = $build_element; } } } return $build; } /** * {@inheritdoc} */ public function buildTable(array $elements, array $data, array $options = []) { $rows = []; foreach ($elements as $key => $element) { if (isset($options['excluded_elements'][$key])) { continue; } $plugin_id = $this->elementManager->getElementPluginId($element); /** @var \Drupal\webform\WebformElementInterface $webform_element */ $webform_element = $this->elementManager->createInstance($plugin_id); // Check element view access. if (!$webform_element->checkAccessRules('view', $element)) { continue; } $title = $element['#admin_title'] ?: $element['#title'] ?: '(' . $key . ')'; $value = (isset($data[$key])) ? $webform_element->formatHtml($element, $data[$key], $options) : ''; $rows[] = [ [ 'header' => TRUE, 'data' => $title, ], [ 'data' => (is_string($value)) ? ['#markup' => $value] : $value, ], ]; } return [ '#type' => 'table', '#rows' => $rows, '#attributes' => [ 'class' => ['webform-submission__table'], ], ]; } /** * Determines if an element is visible. * * Copied from: \Drupal\Core\Render\Element::isVisibleElement * but does not hide hidden or value elements. * * @param array $element * The element to check for visibility. * * @return bool * TRUE if the element is visible, otherwise FALSE. */ protected function isVisibleElement(array $element) { return (!isset($element['#access']) || (($element['#access'] instanceof AccessResultInterface && $element['#access']->isAllowed()) || ($element['#access'] === TRUE))); } }