-
-
Save benjamin-dk/f3af232e83694d127f1a3657a50f12bb to your computer and use it in GitHub Desktop.
Drupal 10 - persisting values in forms when validation fails (SimpleForm.php from the Examples module)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Drupal\form_api_example\Form; | |
use Drupal\Core\Form\FormBase; | |
use Drupal\Core\Form\FormStateInterface; | |
/** | |
* Implements the SimpleForm form controller. | |
* | |
* This example demonstrates a simple form with a single text input element. We | |
* extend FormBase which is the simplest form base class used in Drupal. | |
* | |
* @see \Drupal\Core\Form\FormBase | |
*/ | |
class SimpleForm extends FormBase { | |
/** | |
* Build the simple form. | |
* | |
* A build form method constructs an array that defines how markup and | |
* other form elements are included in an HTML form. | |
* | |
* @param array $form | |
* Default form array structure. | |
* @param \Drupal\Core\Form\FormStateInterface $form_state | |
* Object containing current form state. | |
* | |
* @return array | |
* The render array defining the elements of the form. | |
*/ | |
public function buildForm(array $form, FormStateInterface $form_state) { | |
$form['description'] = [ | |
'#type' => 'item', | |
'#markup' => $this->t('This basic example shows a single text input element and a submit button'), | |
]; | |
$form['title'] = [ | |
'#type' => 'textfield', | |
'#title' => $this->t('Title'), | |
'#description' => $this->t('Title must be at least 5 characters in length.'), | |
'#required' => TRUE, | |
]; | |
$raw_msg = ''; | |
$foo_value = $form_state->getValue('foo'); | |
if (! $foo_value ) { | |
$foo_msg = t('foo not set, setting it to bar'); | |
$foo_value = 'bar'; | |
$form['foo'] = ['#type' => 'hidden', '#value' => $foo_value]; | |
} | |
else { | |
$foo_msg = $this->t('Foo was @foo, adding a bar', ['@foo' => $foo_value]); | |
$foo_value .= 'bar'; | |
$form['foo'] = ['#type' => 'hidden', '#value' => $foo_value]; | |
} | |
$form['debug'] = [ | |
'#type' => 'item', | |
'#markup' => $foo_msg, | |
]; | |
if (isset($form_state->getUserInput()['foo'])) { | |
$raw_user_input = $form_state->getUserInput()['foo']; | |
$raw_msg = $this->t('Raw value was @raw', ['@raw' => $raw_user_input]); | |
} | |
$form['debug2'] = [ | |
'#type' => 'item', | |
'#markup' => $raw_msg, | |
]; | |
// Group submit handlers in an actions element with a key of "actions" so | |
// that it gets styled correctly, and so that other modules may add actions | |
// to the form. This is not required, but is convention. | |
$form['actions'] = [ | |
'#type' => 'actions', | |
]; | |
// Add a submit button that handles the submission of the form. | |
$form['actions']['submit'] = [ | |
'#type' => 'submit', | |
'#value' => $this->t('Submit'), | |
]; | |
return $form; | |
} | |
/** | |
* Getter method for Form ID. | |
* | |
* The form ID is used in implementations of hook_form_alter() to allow other | |
* modules to alter the render array built by this form controller. It must be | |
* unique site wide. It normally starts with the providing module's name. | |
* | |
* @return string | |
* The unique ID of the form defined by this class. | |
*/ | |
public function getFormId() { | |
return 'form_api_example_simple_form'; | |
} | |
/** | |
* Implements form validation. | |
* | |
* The validateForm method is the default method called to validate input on | |
* a form. | |
* | |
* @param array $form | |
* The render array of the currently built form. | |
* @param \Drupal\Core\Form\FormStateInterface $form_state | |
* Object describing the current state of the form. | |
*/ | |
public function validateForm(array &$form, FormStateInterface $form_state) { | |
$title = $form_state->getValue('title'); | |
if (strlen($title) < 5) { | |
// Set an error for the form element with a key of "title". | |
$form_state->setErrorByName('title', $this->t('The title must be at least 5 characters long.')); | |
} | |
//$form_state->setRebuild(); | |
} | |
/** | |
* Implements a form submit handler. | |
* | |
* The submitForm method is the default method called for any submit elements. | |
* | |
* @param array $form | |
* The render array of the currently built form. | |
* @param \Drupal\Core\Form\FormStateInterface $form_state | |
* Object describing the current state of the form. | |
*/ | |
public function submitForm(array &$form, FormStateInterface $form_state) { | |
/* | |
* This would normally be replaced by code that actually does something | |
* with the title. | |
*/ | |
$title = $form_state->getValue('title'); | |
$this->messenger()->addMessage($this->t('You specified a title of %title.', ['%title' => $title])); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment