You are here

protected function WebformEntityElementsValidator::validateRendering in Webform 6.x

Same name and namespace in other branches
  1. 8.5 src/WebformEntityElementsValidator.php \Drupal\webform\WebformEntityElementsValidator::validateRendering()

Validate that elements are a valid render array.

Return value

\Drupal\Core\StringTranslation\TranslatableMarkup|string|null If not valid an error message.

See also

\Drupal\Core\Entity\EntityFormBuilder

\Drupal\webform\Entity\Webform::getSubmissionForm()

1 call to WebformEntityElementsValidator::validateRendering()
WebformEntityElementsValidator::validate in src/WebformEntityElementsValidator.php
Validate webform elements.

File

src/WebformEntityElementsValidator.php, line 553

Class

WebformEntityElementsValidator
Webform elements validator.

Namespace

Drupal\webform

Code

protected function validateRendering() {

  // Override Drupal's error and exception handler so that we can capture
  // all rendering exceptions and display the captured error/exception
  // message to the user.
  // @see _webform_entity_element_validate_rendering_error_handler()
  // @see _webform_entity_element_validate_rendering_exception_handler()
  set_error_handler('_webform_entity_element_validate_rendering_error_handler');
  set_exception_handler('_webform_entity_element_validate_rendering_exception_handler');
  try {

    /** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
    $webform_submission = $this->entityTypeManager
      ->getStorage('webform_submission')
      ->create([
      'webform' => $this->webform,
    ]);
    $form_object = $this->entityTypeManager
      ->getFormObject('webform_submission', 'add');
    $form_object
      ->setEntity($webform_submission);
    $form_state = (new FormState())
      ->setFormState([]);
    $this->formBuilder
      ->buildForm($form_object, $form_state);
    $message = NULL;
  } catch (\Throwable $error) {
    $message = $error
      ->getMessage();
  } catch (\Exception $exception) {
    $message = $exception
      ->getMessage();
  }

  // Restore Drupal's error and exception handler.
  restore_error_handler();
  restore_exception_handler();
  if ($message) {
    $build = [
      'title' => [
        '#markup' => $this
          ->t('Unable to render elements, please view the below message(s) and the error log.'),
      ],
      'items' => [
        '#theme' => 'item_list',
        '#items' => [
          $message,
        ],
      ],
    ];
    return $this->renderer
      ->renderPlain($build);
  }
  return $message;
}