web-dev-qa-db-fra.com

Comment valider une valeur de champ par programme dans Drupal 8?

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'));
      }
    }
  } 
6
Tyler Durden

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().

6
Vincenzo Gambino

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!'));
    }
  }
}
2
kenorb