Commit cd05ee42 authored by xjm's avatar xjm

Issue #177124 by hgoto, roblav, mrfelton, AjitS, wturrell, lyricnz,...

Issue #177124 by hgoto, roblav, mrfelton, AjitS, wturrell, lyricnz, ADLongwell, tim.plunkett, effulgentsia, sun, GoddamnNoise, Liam Morland, Xano, drumm, guschilds, cilefen: Form validation messages appear in incorrect order
parent 5eb0425b
...@@ -229,8 +229,12 @@ protected function finalizeValidation(&$form, FormStateInterface &$form_state, $ ...@@ -229,8 +229,12 @@ protected function finalizeValidation(&$form, FormStateInterface &$form_state, $
* theming, and hook_form_alter functions. * theming, and hook_form_alter functions.
*/ */
protected function doValidateForm(&$elements, FormStateInterface &$form_state, $form_id = NULL) { protected function doValidateForm(&$elements, FormStateInterface &$form_state, $form_id = NULL) {
// Recurse through all children. // Recurse through all children, sorting the elements so that the order of
foreach (Element::children($elements) as $key) { // error messages displayed to the user matches the order of elements in
// the form. Use a copy of $elements so that it is not modified by the
// sorting itself.
$elements_sorted = $elements;
foreach (Element::children($elements_sorted, TRUE) as $key) {
if (isset($elements[$key]) && $elements[$key]) { if (isset($elements[$key]) && $elements[$key]) {
$this->doValidateForm($elements[$key], $form_state); $this->doValidateForm($elements[$key], $form_state);
} }
......
<?php
namespace Drupal\KernelTests\Core\Form;
use Drupal\Core\Form\FormInterface;
use Drupal\Core\Form\FormState;
use Drupal\Core\Form\FormStateInterface;
use Drupal\KernelTests\KernelTestBase;
/**
* Tests form validation mesages are displayed in the same order as the fields.
*
* @group Form
*/
class FormValidationMessageOrderTest extends KernelTestBase implements FormInterface {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'form_validation_error_message_order_test';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// Prepare fields with weights specified.
$form['one'] = [
'#type' => 'textfield',
'#title' => 'One',
'#required' => TRUE,
'#weight' => 40,
];
$form['two'] = [
'#type' => 'textfield',
'#title' => 'Two',
'#required' => TRUE,
'#weight' => 30,
];
$form['three'] = [
'#type' => 'textfield',
'#title' => 'Three',
'#required' => TRUE,
'#weight' => 10,
];
$form['four'] = [
'#type' => 'textfield',
'#title' => 'Four',
'#required' => TRUE,
'#weight' => 20,
];
$form['actions'] = [
'#type' => 'actions',
'submit' => [
'#type' => 'submit',
'#value' => 'Submit',
],
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
}
/**
* Tests that fields validation messages are sorted in the fields order.
*/
function testLimitValidationErrors() {
$form_state = new FormState();
$form_builder = $this->container->get('form_builder');
$form_builder->submitForm($this, $form_state);
$messages = drupal_get_messages();
$this->assertTrue(isset($messages['error']));
$error_messages = $messages['error'];
$this->assertEqual($error_messages[0], 'Three field is required.');
$this->assertEqual($error_messages[1], 'Four field is required.');
$this->assertEqual($error_messages[2], 'Two field is required.');
$this->assertEqual($error_messages[3], 'One field is required.');
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment