You are here

class WebformUiElementTestForm in Webform 6.x

Same name and namespace in other branches
  1. 8.5 modules/webform_ui/src/Form/WebformUiElementTestForm.php \Drupal\webform_ui\Form\WebformUiElementTestForm

Provides a test webform for webform elements.

This webform is only visible if the webform_devel.module is enabled.

Hierarchy

Expanded class hierarchy of WebformUiElementTestForm

See also

\Drupal\webform\Controller\WebformPluginElementController::index

1 string reference to 'WebformUiElementTestForm'
webform_ui.routing.yml in modules/webform_ui/webform_ui.routing.yml
modules/webform_ui/webform_ui.routing.yml

File

modules/webform_ui/src/Form/WebformUiElementTestForm.php, line 21

Namespace

Drupal\webform_ui\Form
View source
class WebformUiElementTestForm extends WebformUiElementFormBase {

  /**
   * {@inheritdoc}
   */
  protected $operation = 'test';

  /**
   * Type of webform element being tested.
   *
   * @var string
   */
  protected $type;

  /**
   * A webform element.
   *
   * @var \Drupal\webform\Plugin\WebformElementInterface
   */
  protected $webformElement;

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'webform_ui_element_test_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, WebformInterface $webform = NULL, $key = NULL, $parent_key = NULL, $type = NULL) {

    // Create a temp webform.
    $this->webform = Webform::create([
      'id' => '_webform_ui_temp_form',
    ]);
    $this->type = $type;
    if (!$this->elementManager
      ->hasDefinition($type)) {
      throw new NotFoundHttpException();
    }
    if ($element = \Drupal::request()
      ->getSession()
      ->get('webform_ui_test_element_' . $type)) {
      $this->element = $element;
    }
    else {
      $element = [
        '#type' => $type,
      ] + $this
        ->getWebformElementPlugin()
        ->preview();
      $this->element = $element;
    }
    $webform_element = $this
      ->getWebformElementPlugin();
    $form['#title'] = $this
      ->t('Test %type element', [
      '%type' => $type,
    ]);
    if ($element) {
      $webform_submission = WebformSubmission::create([
        'webform' => $this->webform,
      ]);
      $webform_element
        ->initialize($this->element);
      $webform_element
        ->prepare($this->element, $webform_submission);
      $form['test'] = [
        '#type' => 'details',
        '#title' => $this
          ->t('Element test'),
        '#open' => TRUE,
        '#attributes' => [
          'style' => 'background-color: #f5f5f2',
        ],
        'element' => $this->element,
        'hr' => [
          '#markup' => '<hr />',
        ],
      ];
      if (isset($element['#default_value'])) {
        $html = $webform_element
          ->formatHtml($element + [
          '#value' => $element['#default_value'],
        ], $webform_submission);
        $form['test']['html'] = [
          '#type' => 'item',
          '#title' => $this
            ->t('HTML'),
          '#markup' => is_array($html) ? $this->renderer
            ->render($html) : $html,
          '#allowed_tag' => Xss::getAdminTagList(),
        ];
        $form['test']['text'] = [
          '#type' => 'item',
          '#title' => $this
            ->t('Plain text'),
          '#markup' => '<pre>' . $webform_element
            ->formatText($element + [
            '#value' => $element['#default_value'],
          ], $webform_submission) . '</pre>',
          '#allowed_tag' => Xss::getAdminTagList(),
        ];
      }
      $form['test']['code'] = [
        '#type' => 'item',
        '#title' => $this
          ->t('Source'),
        'source' => [
          '#theme' => 'webform_codemirror',
          '#type' => 'yaml',
          '#code' => Yaml::encode($this
            ->convertTranslatableMarkupToStringRecursive($element)),
        ],
      ];
      $form['test']['render_array'] = [
        '#type' => 'details',
        '#title' => $this
          ->t('Render array'),
        '#desciption' => $this
          ->t("Below is the element's final render array."),
        'source' => [
          '#theme' => 'webform_codemirror',
          '#type' => 'yaml',
          '#code' => Yaml::encode($this
            ->convertTranslatableMarkupToStringRecursive($this->element)),
        ],
      ];
    }
    $form['key'] = [
      '#type' => 'value',
      '#value' => 'element',
    ];
    $form['parent_key'] = [
      '#type' => 'value',
      '#value' => '',
    ];
    $form_state
      ->set('element', $this->element);
    $form['properties'] = $webform_element
      ->buildConfigurationForm([
      '#tabs' => FALSE,
    ], $form_state);
    $form['properties']['#tree'] = TRUE;
    $form['properties']['custom']['#open'] = TRUE;
    $form['properties']['element']['type'] = [
      '#type' => 'item',
      '#title' => $this
        ->t('Type'),
      '#markup' => $type,
      '#weight' => -100,
      '#parents' => [
        'type',
      ],
    ];
    $form['actions'] = [
      '#type' => 'actions',
    ];
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this
        ->t('Test'),
      '#button_type' => 'primary',
    ];
    if (\Drupal::request()
      ->getSession()
      ->get('webform_ui_test_element_' . $type)) {
      $form['actions']['reset'] = [
        '#type' => 'submit',
        '#value' => $this
          ->t('Reset'),
        '#limit_validation_errors' => [],
        '#submit' => [
          '::reset',
        ],
      ];
    }

    // Clear all messages including 'Unable to display this webform…' which is
    // generated because we are using a temp webform.
    // drupal_get_messages();
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function reset(array &$form, FormStateInterface $form_state) {
    \Drupal::request()
      ->getSession()
      ->remove('webform_ui_test_element_' . $this->type);
    $this
      ->messenger()
      ->addStatus($this
      ->t('Webform element %type test has been reset.', [
      '%type' => $this->type,
    ]));
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {

    // Rebuild is throwing the below error.
    // LogicException: Settings can not be serialized.
    // $form_state->setRebuild();
    // @todo Determine what object is being serialized with webform
    //
    // The webform element configuration is stored in the 'properties' key in
    // the webform, pass that through for submission.
    $element_form_state = clone $form_state;
    $element_form_state
      ->setValues($form_state
      ->getValue('properties'));
    $properties = $this
      ->getWebformElementPlugin()
      ->getConfigurationFormProperties($form, $element_form_state);

    // Set #default_value using 'test' element value.
    if ($element_value = $form_state
      ->getValue('element')) {
      $properties['#default_value'] = $element_value;
    }
    \Drupal::request()
      ->getSession()
      ->set('webform_ui_test_element_' . $this->type, $properties);
    $this
      ->messenger()
      ->addStatus($this
      ->t('Webform element %type test has been updated.', [
      '%type' => $this->type,
    ]));
  }

  /**
   * Determines if the webform element key already exists.
   *
   * @param string $key
   *   The webform element key.
   *
   * @return bool
   *   TRUE if the webform element key, FALSE otherwise.
   */
  public function exists($key) {
    return FALSE;
  }

  /**
   * Convert all translatable markup to strings.
   *
   * This allows element to be serialized.
   *
   * @param array $element
   *   An element.
   *
   * @return array
   *   The element with all translatable markup converted to strings.
   */
  protected function convertTranslatableMarkupToStringRecursive(array $element) {
    foreach ($element as $key => $value) {
      if ($value instanceof TranslatableMarkup) {
        $element[$key] = (string) $value;
      }
      elseif (is_array($value)) {
        $element[$key] = $this
          ->convertTranslatableMarkupToStringRecursive($value);
      }
    }
    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function getWebformElementPlugin() {
    if (empty($this->element)) {
      return $this->elementManager
        ->getElementInstance([
        '#type' => $this->type,
      ]);
    }
    else {
      return parent::getWebformElementPlugin();
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function 2
DependencySerializationTrait::__wakeup public function 2
FormBase::$configFactory protected property The config factory. 3
FormBase::$requestStack protected property The request stack. 1
FormBase::$routeMatch protected property The route match.
FormBase::config protected function Retrieves a configuration object.
FormBase::configFactory protected function Gets the config factory for this form. 3
FormBase::container private function Returns the service container.
FormBase::currentUser protected function Gets the current user.
FormBase::getRequest protected function Gets the request object.
FormBase::getRouteMatch protected function Gets the route match.
FormBase::logger protected function Gets the logger for a specific channel.
FormBase::redirect protected function Returns a redirect response object for the specified route.
FormBase::resetConfigFactory public function Resets the configuration factory.
FormBase::setConfigFactory public function Sets the config factory for this form.
FormBase::setRequestStack public function Sets the request stack object to use.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 27
MessengerTrait::messenger public function Gets the messenger. 27
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
WebformAjaxFormTrait::announce protected function Queue announcement with Ajax response.
WebformAjaxFormTrait::buildAjaxForm protected function Add Ajax support to a form.
WebformAjaxFormTrait::createAjaxResponse protected function Create an AjaxResponse or WebformAjaxResponse object.
WebformAjaxFormTrait::getAnnouncements protected function Get announcements.
WebformAjaxFormTrait::getDefaultAjaxSettings protected function Get default ajax callback settings. 1
WebformAjaxFormTrait::getFormStateRedirectUrl protected function Get redirect URL from the form's state.
WebformAjaxFormTrait::getWrapperId protected function Get the form's Ajax wrapper id. 1
WebformAjaxFormTrait::isCallableAjaxCallback protected function Determine if Ajax callback is callable.
WebformAjaxFormTrait::isDialog protected function Is the current request for an Ajax modal/dialog.
WebformAjaxFormTrait::isOffCanvasDialog protected function Is the current request for an off canvas dialog.
WebformAjaxFormTrait::missingAjaxCallback protected function Handle missing Ajax callback.
WebformAjaxFormTrait::replaceForm protected function Replace form via an Ajax response. 1
WebformAjaxFormTrait::resetAnnouncements protected function Reset announcements.
WebformAjaxFormTrait::setAnnouncements protected function Set announcements.
WebformAjaxFormTrait::submitAjaxForm public function Submit form #ajax callback. 1
WebformAjaxFormTrait::validateAjaxForm public function Validate form #ajax callback. 1
WebformDialogFormTrait::buildDialogConfirmForm protected function Add modal dialog support to a confirm form.
WebformDialogFormTrait::buildDialogDeleteAction protected function Build webform dialog delete link.
WebformDialogFormTrait::buildDialogForm protected function Add modal dialog support to a form.
WebformDialogFormTrait::cancelAjaxForm public function Cancel form #ajax callback. Overrides WebformAjaxFormTrait::cancelAjaxForm 1
WebformDialogFormTrait::closeDialog public function Close dialog.
WebformDialogFormTrait::isAjax protected function Returns if webform is using Ajax. Overrides WebformAjaxFormTrait::isAjax 1
WebformDialogFormTrait::noSubmit public function Empty submit callback used to only have the submit button to use an #ajax submit callback. Overrides WebformAjaxFormTrait::noSubmit
WebformDialogFormTrait::noValidate public function Validate callback to clear validation errors. 2
WebformUiElementFormBase::$action protected property The action of the current webform.
WebformUiElementFormBase::$element protected property The webform element.
WebformUiElementFormBase::$elementManager protected property The webform element manager.
WebformUiElementFormBase::$elementsValidator protected property The webform element validator.
WebformUiElementFormBase::$entityFieldManager protected property The entity field manager.
WebformUiElementFormBase::$key protected property The webform element key.
WebformUiElementFormBase::$originalType protected property The webform element's original element type.
WebformUiElementFormBase::$parentKey protected property The webform element parent key.
WebformUiElementFormBase::$renderer protected property The renderer.
WebformUiElementFormBase::$tokenManager protected property The token manager.
WebformUiElementFormBase::$webform protected property The webform.
WebformUiElementFormBase::buildDefaultValueForm public function Build update default value form elements.
WebformUiElementFormBase::create public static function Instantiates a new instance of this class. Overrides FormBase::create
WebformUiElementFormBase::getDefaultKey public function Get the default key for the current element.
WebformUiElementFormBase::getDefaultValue public function Get updated default value for an element.
WebformUiElementFormBase::getElement public function Return the render element associated with this form. Overrides WebformUiElementFormInterface::getElement
WebformUiElementFormBase::getKey public function Return the render element's key associated with this form. Overrides WebformUiElementFormInterface::getKey
WebformUiElementFormBase::getParentKey public function Return the render element's parent key associated with this form. Overrides WebformUiElementFormInterface::getParentKey
WebformUiElementFormBase::getParentKeyPrefix protected function Get the parent key prefix.
WebformUiElementFormBase::getWebform public function Return the webform associated with this form. Overrides WebformUiElementFormInterface::getWebform
WebformUiElementFormBase::isNew public function Is new element. Overrides WebformUiElementFormInterface::isNew
WebformUiElementFormBase::isParentElementFlexbox protected function Determine if the parent element is a 'webform_flexbox'.
WebformUiElementFormBase::isParentKeyPrefixEnabled protected function Determine if parent key prefixing is enabled.
WebformUiElementFormBase::setDefaultValue public function Set default value to be updated.
WebformUiElementFormBase::validateDefaultValue public function Default value validation handler.
WebformUiElementFormBase::validateForm public function Form validation handler. Overrides FormBase::validateForm
WebformUiElementTestForm::$operation protected property The operation of the current webform. Overrides WebformUiElementFormBase::$operation
WebformUiElementTestForm::$type protected property Type of webform element being tested.
WebformUiElementTestForm::$webformElement protected property A webform element.
WebformUiElementTestForm::buildForm public function Form constructor. Overrides WebformUiElementFormBase::buildForm
WebformUiElementTestForm::convertTranslatableMarkupToStringRecursive protected function Convert all translatable markup to strings.
WebformUiElementTestForm::exists public function Determines if the webform element key already exists. Overrides WebformUiElementFormBase::exists
WebformUiElementTestForm::getFormId public function Returns a unique string identifying the form. Overrides WebformUiElementFormBase::getFormId
WebformUiElementTestForm::getWebformElementPlugin public function Return the webform element associated with this form. Overrides WebformUiElementFormBase::getWebformElementPlugin
WebformUiElementTestForm::reset public function
WebformUiElementTestForm::submitForm public function Form submission handler. Overrides WebformUiElementFormBase::submitForm