양식 오류를 어떻게 변경합니까?


8

특정 컨텐츠 유형에 대해 Drupal 또는 노드 삽입 / 저장시 다른 모듈에서 생성 된 양식 오류를 어떻게 변경하거나 제거합니까? 모듈에서 사용할 수있는 방법을 찾고 있습니다.

hook_node_validate () 시도했지만 오류가 발생하여 오류를 설정하기 만하면 됩니다.

여기에 이미지 설명을 입력하십시오

답변:


13

문자열 변경

단일 문자열의 텍스트를 변경하려면 가장 간단한 방법은 문자열 재정의 모듈을 사용하는 것입니다. 문자열을 바꿀 수 있습니다.

"! 이름 필드가 필요합니다."

(예를 들어) :

" '! 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

즉, 유효성 검사를 추가하고 싶지 않습니다. 기존 유효성 검사의 오류 메시지를 수정하고 싶습니다 ... 기존 유효성 검사를 설정 해제하고 새 유효성 검사를 추가 하시겠습니까?
timofey.com

1
기존 유효성 검사는 유효성 검사 콜백 기능이 아닙니다. 필드는 "필수"입니다. 위의 마지막 두 가지를 조합하면 기존 메시지가 제거되고 다른 유형의 유효성 검사가 추가됩니다.
pjcdawkins

유효성 검사 메시지 만 변경하면됩니다. 위의 솔루션을 구현했지만 (hook_form_alter). 두 가지 유효성 검사 메시지가 나타납니다. 하나는 기본이고 두 번째는 내가 쓴 것입니다. @pjcdawkins의 모든 제안
혁신적인

6

해당 오류 메시지에 사용 된 문자열은 "! 이름 필드가 필요합니다."이므로 사용하여 문자열 오버라이드 (override)의 문자열을 모듈 또는 변경하면 모든 필요한 양식 필드에 사용되는 문자열을 변경하는 효과를 가질 것이다 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속성을로 설정하면 FALSEDrupal이 해당 오류 메시지를 표시하지 않습니다.


4

drupal 7의 경우이 모듈 http://drupal.org/node/1209450 을 우편으로 다운로드 하면이 후크를 얻을 수 있습니다.

message_alter(&$messages) {
}

감사. 지원되지 않는 모듈을 사용하는 것은 좋지 않지만, 가이드로 사용할 수 있습니다!
timofey.com

1

엔터티 당 필드 유효성 검사 필드 를 사용하여 양식 오류 메시지를 사용자 지정할 수 있습니다 .

이를 수행하려면 필드 설정을 편집하고 유효성 검증으로 이동하여 새 유효성 검증 규칙을 추가하십시오 ( 필수 필드 ). 거기 에 해당 필드에 대한 사용자 정의 오류 메시지 를 설정하는 텍스트 필드가 있어야합니다 .


0

Drupal 8의 경우, 기존 오류를 실제로 검사하고 사례별로 오류 마크 업을 변경할 수있는 사용자 지정 유효성 검사 기능을 추가 할 수있었습니다. 필자의 경우 사용자를 참조하는 entity_autocomplete 필드에서 오류 메시지를 변경하고 싶었습니다. 유효하지 않은 사용자가 추가 된 경우 유효성 검사 오류에 "% name과 (와) 일치하는 엔터티가 없습니다"라는 메시지가 표시됩니다. "엔터티"라는 단어 대신 "사용자"라고 말하고 싶지 않아 사용자에게 덜 무섭고 혼동을 줄 수있었습니다.

먼저 hook_form_alter ()를 사용하여 validate 함수를 추가합니다.

/**
 * 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.