フォームエラーをどのように変更しますか?


8

特定のコンテンツタイプについて、ノードの挿入/保存時にDrupalまたは別のモジュールによって生成されたフォームエラーをどのように変更または削除しますか。モジュールで使用できるメソッドを探しています。

hook_node_validate()を試しましたが、エラーを取得してエラーを設定することしかできませんでした。

ここに画像の説明を入力してください

回答:


13

文字列を変更する

単一の文字列のテキストを変更する最も簡単な方法は、文字列オーバーライドモジュールを使用することです。それはあなたが文字列を置き換えることを可能にするでしょう:

「!nameフィールドは必須です。」

(例):

「フィールド '!name'は必須です。」

フォームフィールドの変更

フィールドを不要にしたい場合は、通常のhook_form_alter()実装を使用してください:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form['#node'];
  if ($node->type == 'my_custom_type') {
    $form['title']['#required'] = FALSE;
  }
}

フォームの検証方法を変更する

フォームには、$form['#validate']配列で指定された検証関数があります。また、フォーム要素にはで指定され$form['element_key']['#element_validate']た関数があります。

次のように独自のものを指定できます。

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_node_form_alter(&$form, &$form_state) {
  $form['title']['#element_validate'][] = 'mymodule_validate_node_title';
}

/**
 * Validate the node title to prevent ALL CAPS.
 */
function mymodule_validate_node_title($element, &$form_state, $form) {
  if (preg_match('/^[A-Z]+$/', $element['#value'])) {
    form_error($element, t('You may not enter titles in ALL CAPS.'));
  }
}

正解です。「タイトルフィールドが必要です」のエラーテキストをどのように変更しますか?(質問に描かれているように)?これは、文字列のオーバーライドを使用しない場合です。
timofey.com 2013年

つまり、検証を追加したくありません。既存の検証のエラーメッセージを変更したいだけです。多分、既存の検証の設定を解除して、新しい検証を追加しますか?
timofey.com 2013年

1
既存の検証は検証コールバック関数ではありません。フィールドが「必須」であるということだけです。上記の最後の2つを組み合わせると、既存のメッセージが削除され、別のタイプの検証が追加されます。
pjcdawkins 2013年

検証メッセージのみを変更する必要があります。(hook_form_alterによって)上記のソリューションを実装しましたが。2つの検証メッセージが表示されます。1つのデフォルトと2つ目は私が書いたものです。任意の提案@pjcdawkins
革新的なkundan

6

そのエラーメッセージに使用される文字列は「!nameフィールドが必要です」なので、使用して文字列をオーバーライドのモジュールをかのsettings.phpファイルで使用する文字列を変更すると、すべての必須フォームフィールドのために使用される文字列を変更する効果を持っているでしょう。

タイトルが入力されていないときにタイトルに表示されるエラー文字列を変更したい場合は、次のことができます。

  • フォーム検証ハンドラーをノード編集フォームに追加します。 hook_form_alter()
  • その形式では、検証ハンドラ:

    • の内容を確認します$form['title']$formはを使用して設定され$form = &drupal_static('form_set_error', array());、それが必要なときに必要な文字列に変更します'Title field is required.'
    • $_SESSION['messages']['error'](配列)に文字列が含まれて'Title field is required.'いることを確認し、表示する文字列に変更します

エラーを表示しないようにする方が簡単です。#requiredプロパティをFALSEに設定するだけで、Drupalはそのエラーメッセージを表示しません。



1

エンティティフィールドごとのフィールド検証を使用して、フォームエラーメッセージをカスタマイズできます。

これを行うには、フィールド設定を編集し、[検証]に移動して新しい検証ルールを追加します(必須フィールド)。そこでは、そのフィールドのカスタムエラーメッセージを設定するテキストフィールドが必要です。


0

Drupal 8では、既存のエラーを実際に調べて、ケースごとにエラーのマークアップを変更できるカスタム検証関数を追加できました。私の場合、ユーザーを参照しているentity_autocompleteフィールドからのエラーメッセージを変更したいと思いました。無効なユーザーが追加された場合、検証エラーは「%nameに一致するエンティティはありません」と表示されます。「エンティティ」という言葉の代わりに、「ユーザー」と言ってもらい、ユーザーを混乱させないようにしました。

まず、hook_form_alter()を使用して検証関数を追加します。

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

      if (in_array($form_id, ['whatever_form_id_you_need_to_alter'])) {
        // Add entity autocomplete custom form validation messages alter.
        array_unshift($form['#validate'], 'my_module_custom_user_validate');
      }

次に、「my_module_custom_user_validate」関数で:

/**
 * Custom form validation handler that alters default validation.
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
*/
function my_module_custom_user_validate(&$form, FormStateInterface $form_state) {
      // Check for any errors on the form_state
      $errors = $form_state->getErrors();
      if ($errors) {
        foreach ($errors as $error_key => $error_val) {
          // Check to see if the error is related to the desired field:
          if (strpos($error_key, 'the_entity_reference_field_machine_name') !== FALSE) {
            // Check for the word 'entities', which I want to replace
            if (strpos($error_val->getUntranslatedString(), 'entities') == TRUE) {
              // Get the original args to pass into the new message
              $original_args = $error_val->getArguments();
              // Re-construct the error
              $error_val->__construct("There are no users matching the name %value", $original_args);
            }
          }
        }
      }
    }

お役に立てれば!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.