ユーザーレジスタの値をチェックし、値がカスタムフォームに入力したものと一致しない場合はエラーを設定する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'));
}
}
}
_
_$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()
になりました。
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!'));
}
}
}