特定のコンテンツタイプについて、ノードの挿入/保存時にDrupalまたは別のモジュールによって生成されたフォームエラーをどのように変更または削除しますか。モジュールで使用できるメソッドを探しています。
hook_node_validate()を試しましたが、エラーを取得してエラーを設定することしかできませんでした。
特定のコンテンツタイプについて、ノードの挿入/保存時にDrupalまたは別のモジュールによって生成されたフォームエラーをどのように変更または削除しますか。モジュールで使用できるメソッドを探しています。
hook_node_validate()を試しましたが、エラーを取得してエラーを設定することしかできませんでした。
回答:
単一の文字列のテキストを変更する最も簡単な方法は、文字列オーバーライドモジュールを使用することです。それはあなたが文字列を置き換えることを可能にするでしょう:
「!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.'));
}
}
そのエラーメッセージに使用される文字列は「!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はそのエラーメッセージを表示しません。
drupal 7の場合は、このモジュールhttp://drupal.org/node/1209450をzip 形式でダウンロードして、このフックを取得できます。
message_alter(&$messages) {
}
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);
}
}
}
}
}
お役に立てれば!