J'ai créé un module pour Drupal8 qui vérifie les valeurs du registre utilisateur et définit une erreur si les valeurs ne correspondent pas à quelque chose que vous avez entré dans un formulaire personnalisé.
Mon module a un formulaire dans lequel vous ajoutez une liste de nom d'utilisateur que vous ne voulez pas que l'utilisateur prenne et un message personnalisé à afficher comme erreur.
Les formulaires fonctionnent parfaitement, je peux stocker des données, les modifier etc ... Il est stocké sous src/Form/
Et les paramètres sont sous config/install
Maintenant, lorsque j'essaye de connecter le formulaire d'enregistrement utilisateur, je reçois une erreur concernant form_set_error()
:
Erreur fatale PHP: appel à la fonction non définie form_set_error ()
Je pense aussi que je n'utilise pas $form_state
De la bonne façon (mais ça fait le boulot)
Voici le code dans my_module.module
:
function my_module_form_user_register_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
$form['#validate'][] = 'my_module_user_validate';
}
/**
* Custom validation function.
*/
function my_module_user_validate(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
// get module settings
$config = \Drupal::config('my_module.settings');
// Convert $form_state to an array as it has been passed as object, it looks wrong but I could not find any documentation at the moment
$form_state = get_object_vars($form_state);
$name = $form_state['values']['name']);
$usernames = $config->get('my_modules_usernames');
// Username are inserted in a text area separated by an enter key
$usernames = $usernames != '' ? explode("\r\n", $usernames) : array();
foreach ($usernames as $username) {
if ($username == $name[1]) {
//apparently in Drupal 8 form_set_error does not work anymmore
form_set_error('mail', $config->get('my_module_message'));
}
}
}
Le $form_state
Devient maintenant un objet classé comme documenté ici
Vous pouvez utiliser getValue () pour obtenir la valeur du champ au lieu de la convertir en tableau
$form_state->getValue('name');
au lieu de:
$form_state = get_object_vars($form_state);
$name = $form_state['values']['name']);
Même chose pour form_set_value
.
Et form_set_error()
est devenu $form_state->setErrorByName()
.
La form_set_error()
a été abandonnée au profit des méthodes $ form_state class suivantes:
$form_state->setError($element, $message);
$form_state->setErrorByName($element, $message);
Le code ressemblerait donc à:
use Drupal\Core\Form\FormStateInterface;
/**
* Implements hook_form_alter().
*/
function mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
// Use this to find out about the current form id.
drupal_set_message('Form ID: ' . $form_id);
}
/**
* Implements hook_form_FORM_ID_alter() for the FORM_ID() form.
*/
function mymodule_form_FORM_ID_alter(&$form, FormStateInterface $form_state, $form_id) {
$form['#validate'][] = '_mymodule_form_validate';
}
/**
* Validates submission values in the FORM_ID() form.
*/
function _mymodule_form_validate(array &$form, FormStateInterface $form_state) {
$values = $form_state->getValue('field_myfield');
foreach ($values as $value) {
$plain_value = is_array($value) ? current($value) : NULL;
if (empty($plain_value)) {
$form_state->setErrorByName('field_myfield', t('Please enter a value!'));
}
}
}