web-dev-qa-db-ja.com

Drupal 8でプログラムによってフィールド値を検証する方法は?

ユーザーレジスタの値をチェックし、値がカスタムフォームに入力したものと一致しない場合はエラーを設定するDrupal8のモジュールを作成しました。

私のモジュールには、ユーザーに見せたくないユーザー名のリストと、エラーとして表示するカスタムメッセージを追加するフォームがあります。

フォームは完璧に機能し、データの保存、編集などができます。_src/Form/_に保存され、設定はconfig/installにあります

ここで、ユーザー登録フォームの検証をフックしようとすると、form_set_error()に関するエラーが発生します。

PHPの致命的なエラー:未定義の関数form_set_error()の呼び出し

また、私は_$form_state_を正しい方法で使用していないと思います(しかしそれは仕事をします)

これが_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

_$form_state_は、ドキュメント化されているように、クラス化されたオブジェクトになります here

GetValue()を使用して、フィールド値を配列に変換する代わりに取得できます

_$form_state->getValue('name');
_

の代わりに:

_$form_state = get_object_vars($form_state);
$name = $form_state['values']['name']);
_

_form_set_value_についても同様です。

そしてform_set_error()$form_state->setErrorByName()になりました。

6

form_set_error()は、次の $ form_state class メソッドのために削除されました。

$form_state->setError($element, $message);
$form_state->setErrorByName($element, $message);

したがって、コードは次のようになります。

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