Unverified Commit 4ba14b66 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #990218 by Lendude, sun, tim.plunkett, mr.baileys, joachim: Machine name...

Issue #990218 by Lendude, sun, tim.plunkett, mr.baileys, joachim: Machine name field throws notices if before source field

(cherry picked from commit 25718d36)
parent 3ea43896
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -44,7 +44,8 @@
 *   - error: (optional) A custom form error message string to show, if the
 *     machine name contains disallowed characters.
 *   - standalone: (optional) Whether the live preview should stay in its own
 *     form element rather than in the suffix of the source element. Defaults
 *     form element rather than in the suffix of the source element. The source
 *     element must appear in the form structure before this element. Defaults
 *     to FALSE.
 * - #maxlength: (optional) Maximum allowed length of the machine name. Defaults
 *   to 64.
@@ -183,6 +184,13 @@ public static function processMachineName(&$element, FormStateInterface $form_st
      return $element;
    }

    // The source element must be defined before the machine name element.
    if (!isset($source['#id'])) {
      $element_parents = implode('][', $element['#array_parents']);
      $source_parents = implode('][', $element['#machine_name']['source']);
      throw new \LogicException(sprintf('The machine name element "%s" is defined before the source element "%s", it must be defined after or the source element must specify an id.', $element_parents, $source_parents));
    }

    $suffix_id = $source['#id'] . '-machine-name-suffix';
    $element['#machine_name']['suffix'] = '#' . $suffix_id;

+74 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\KernelTests\Core\Render\Element;

use Drupal\Core\Form\FormInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\KernelTests\KernelTestBase;

/**
 * @coversDefaultClass \Drupal\Core\Render\Element\MachineName
 * @group Render
 */
class MachineNameTest extends KernelTestBase implements FormInterface {

  /**
   * {@inheritdoc}
   */
  protected static $modules = ['system'];

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $element = [
      '#id' => 'test',
      '#type' => 'machine_name',
      '#machine_name' => [
        'source' => [
          'test_source',
        ],
      ],
      '#name' => 'test_machine_name',
      '#default_value' => NULL,
    ];

    $complete_form = [
      'test_machine_name' => $element,
      'test_source' => [
        '#type' => 'textfield',
      ],
    ];
    return $complete_form;
  }

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

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

  /**
   * Tests the order of the machine name field and the source.
   */
  public function testMachineNameOrderException() {
    $this->expectException(\LogicException::class);
    $this->expectErrorMessage('The machine name element "test_machine_name" is defined before the source element "test_source", it must be defined after or the source element must specify an id.');
    $form = \Drupal::formBuilder()->getForm($this);
    $this->render($form);
  }

}