You are here

class YamlFormUiElementTestForm in YAML Form 8

Provides a test form for form elements.

This form is only visible if the yamlform_devel.module is enabled.

Hierarchy

Expanded class hierarchy of YamlFormUiElementTestForm

See also

\Drupal\yamlform\Controller\YamlFormPluginElementController::index

1 string reference to 'YamlFormUiElementTestForm'
yamlform_ui.routing.yml in modules/yamlform_ui/yamlform_ui.routing.yml
modules/yamlform_ui/yamlform_ui.routing.yml

File

modules/yamlform_ui/src/Form/YamlFormUiElementTestForm.php, line 20

Namespace

Drupal\yamlform_ui\Form
View source
class YamlFormUiElementTestForm extends YamlFormUiElementFormBase {

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

  /**
   * A form element.
   *
   * @var \Drupal\yamlform\YamlFormElementInterface
   */
  protected $yamlformElement;

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

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

    // Create a temp form.
    $this->yamlform = YamlForm::create([
      'id' => 'yamlform_ui_element_test_form',
    ]);
    $this->type = $type;
    if (!$this->elementManager
      ->hasDefinition($type)) {
      throw new NotFoundHttpException();
    }
    if ($test_element = \Drupal::request()
      ->getSession()
      ->get('yamlform_ui_test_element_' . $type)) {
      $this->element = $test_element;
    }
    elseif (function_exists('_yamlform_test_get_example_element') && ($test_element = _yamlform_test_get_example_element($type))) {
      $this->element = $test_element;
    }
    $this->element['#type'] = $type;
    $this->yamlformElement = $this->elementManager
      ->getElementInstance($this->element);
    $form['#title'] = $this
      ->t('Test %type element', [
      '%type' => $type,
    ]);
    if ($test_element) {
      $yamlform_submission = YamlFormSubmission::create([
        'yamlform' => $this->yamlform,
      ]);
      $this->yamlformElement
        ->initialize($test_element);
      $this->yamlformElement
        ->initialize($this->element);
      $this->yamlformElement
        ->prepare($this->element, $yamlform_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($test_element['#default_value'])) {
        $html = $this->yamlformElement
          ->formatHtml($test_element, $test_element['#default_value']);
        $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>' . $this->yamlformElement
            ->formatText($test_element, $test_element['#default_value']) . '</pre>',
          '#allowed_tag' => Xss::getAdminTagList(),
        ];
      }
      $form['test']['code'] = [
        '#type' => 'item',
        '#title' => $this
          ->t('Source'),
        'source' => [
          '#theme' => 'yamlform_codemirror',
          '#type' => 'yaml',
          '#code' => Yaml::encode($this
            ->convertTranslatableMarkupToStringRecursive($test_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' => 'yamlform_codemirror',
          '#type' => 'yaml',
          '#code' => Yaml::encode($this
            ->convertTranslatableMarkupToStringRecursive($this->element)),
        ],
      ];
    }
    $form['key'] = [
      '#type' => 'value',
      '#value' => 'element',
    ];
    $form['parent_key'] = [
      '#type' => 'value',
      '#value' => '',
    ];
    $form['properties'] = $this->yamlformElement
      ->buildConfigurationForm([], $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('yamlform_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 form...' which is
    // generated because we are using a temp form.
    // drupal_get_messages();
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function reset(array &$form, FormStateInterface $form_state) {
    \Drupal::request()
      ->getSession()
      ->remove('yamlform_ui_test_element_' . $this->type);
    drupal_set_message($this
      ->t('Form 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 form.
    // The form element configuration is stored in the 'properties' key in
    // the form, pass that through for submission.
    $element_form_state = clone $form_state;
    $element_form_state
      ->setValues($form_state
      ->getValue('properties'));
    $properties = $this->yamlformElement
      ->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('yamlform_ui_test_element_' . $this->type, $properties);
    drupal_set_message($this
      ->t('Form element %type test has been updated.', [
      '%type' => $this->type,
    ]));
  }

  /**
   * Determines if the form element key already exists.
   *
   * @param string $key
   *   The form element key.
   *
   * @return bool
   *   TRUE if the form 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;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
FormBase::$configFactory protected property The config factory. 1
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. 1
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. Overrides UrlGeneratorTrait::redirect
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.
LinkGeneratorTrait::$linkGenerator protected property The link generator. 1
LinkGeneratorTrait::getLinkGenerator Deprecated protected function Returns the link generator.
LinkGeneratorTrait::l Deprecated protected function Renders a link to a route given a route name and its parameters.
LinkGeneratorTrait::setLinkGenerator Deprecated public function Sets the link generator service.
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. 29
MessengerTrait::messenger public function Gets the messenger. 29
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. 1
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.
UrlGeneratorTrait::$urlGenerator protected property The url generator.
UrlGeneratorTrait::getUrlGenerator Deprecated protected function Returns the URL generator service.
UrlGeneratorTrait::setUrlGenerator Deprecated public function Sets the URL generator service.
UrlGeneratorTrait::url Deprecated protected function Generates a URL or path for a specific route based on the given parameters.
YamlFormDialogTrait::buildDialog protected function Add modal dialog support to a form.
YamlFormDialogTrait::isModalDialog protected function Is the current request for an AJAX modal dialog.
YamlFormDialogTrait::redirectForm protected function Handler dialog redirect after form is submitted.
YamlFormDialogTrait::validateDialog protected function Display validation error messages in modal dialog.
YamlFormUiElementFormBase::$action protected property The action of the current form.
YamlFormUiElementFormBase::$element protected property The form element.
YamlFormUiElementFormBase::$elementManager protected property Form element manager.
YamlFormUiElementFormBase::$elementsValidator protected property Form element validator.
YamlFormUiElementFormBase::$originalType protected property The form element's original element type.
YamlFormUiElementFormBase::$renderer protected property The renderer.
YamlFormUiElementFormBase::$yamlform protected property The form.
YamlFormUiElementFormBase::create public static function Instantiates a new instance of this class. Overrides FormBase::create
YamlFormUiElementFormBase::getYamlForm public function Return the form associated with this form. Overrides YamlFormUiElementFormInterface::getYamlForm
YamlFormUiElementFormBase::getYamlFormElement public function Return the form element associated with this form. Overrides YamlFormUiElementFormInterface::getYamlFormElement
YamlFormUiElementFormBase::isNew public function Is new element. Overrides YamlFormUiElementFormInterface::isNew
YamlFormUiElementFormBase::isParentElementFlexbox protected function Determine if the parent element is a 'yamlform_flexbox'.
YamlFormUiElementFormBase::validateForm public function Form validation handler. Overrides FormBase::validateForm
YamlFormUiElementFormBase::__construct public function Constructs a new YamlFormUiElementFormBase.
YamlFormUiElementTestForm::$type protected property Type of form element being tested.
YamlFormUiElementTestForm::$yamlformElement protected property A form element.
YamlFormUiElementTestForm::buildForm public function Form constructor. Overrides YamlFormUiElementFormBase::buildForm
YamlFormUiElementTestForm::convertTranslatableMarkupToStringRecursive protected function Convert all translatable markup to strings.
YamlFormUiElementTestForm::exists public function Determines if the form element key already exists. Overrides YamlFormUiElementFormBase::exists
YamlFormUiElementTestForm::getFormId public function Returns a unique string identifying the form. Overrides YamlFormUiElementFormBase::getFormId
YamlFormUiElementTestForm::reset public function
YamlFormUiElementTestForm::submitForm public function Form submission handler. Overrides YamlFormUiElementFormBase::submitForm