Làm thế nào để bạn thay đổi một lỗi hình thức?


8

Làm thế nào để bạn thay đổi hoặc loại bỏ một lỗi hình thức được tạo ra bởi Drupal hoặc một mô-đun khác khi chèn / lưu nút, cho một loại nội dung cụ thể. Tôi đang tìm kiếm một phương pháp mà tôi có thể sử dụng trong một mô-đun.

Tôi đã thử hook_node_validate () , nhưng tất cả những gì tôi có thể làm là nhận lỗi và đặt lỗi.

nhập mô tả hình ảnh ở đây

Câu trả lời:


13

Thay đổi chuỗi

Để thay đổi văn bản của một chuỗi, phương pháp đơn giản nhất là sử dụng mô đun Ghi đè chuỗi. Điều đó sẽ cho phép bạn thay thế chuỗi:

"! trường tên là bắt buộc."

với (ví dụ):

"Trường '! Name' là bắt buộc."

Thay đổi trường mẫu

Nếu bạn muốn tạo một trường không bắt buộc, hãy sử dụng triển khai hook_form_alter () bình thường:

/**
 * 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;
  }
}

Thay đổi cách biểu mẫu được xác thực

Các hình thức có chức năng xác nhận được chỉ định trong $form['#validate']mảng. Và các yếu tố hình thức có chức năng được chỉ định trong $form['element_key']['#element_validate'].

Bạn có thể chỉ định của riêng bạn như thế này:

/**
 * 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.'));
  }
}

Câu trả lời chính xác! Làm thế nào bạn sẽ thay đổi văn bản lỗi của - "Trường tiêu đề là bắt buộc." (như trong hình trong câu hỏi)? Đó là không sử dụng ghi đè chuỗi.
timofey.com

Nói cách khác, tôi không muốn thêm xác nhận, tôi chỉ muốn sửa đổi thông báo lỗi của xác thực hiện có .... có thể bỏ đặt xác thực hiện có và thêm xác thực mới không?
timofey.com

1
Xác nhận hiện tại không phải là chức năng gọi lại xác thực; chỉ có trường là "bắt buộc". Một sự kết hợp của hai cuối cùng của tôi ở trên sẽ loại bỏ tin nhắn hiện có và sau đó thêm một loại xác nhận khác.
pjcdawkins

Tôi chỉ cần thay đổi một thông báo xác nhận. Mặc dù tôi đã thực hiện giải pháp trên (bởi hook_form_alter). Tôi nhận được hai tin nhắn xác nhận. 1 một mặc định và thứ 2 mà tôi đã viết. Bất kỳ đề xuất nào @pjcdawkins
kundan sáng tạo

6

Vì chuỗi được sử dụng cho thông báo lỗi đó là "! Tên trường là bắt buộc." sử dụng mô-đun Ghi đè chuỗi hoặc thay đổi chuỗi để sử dụng trong tệp settings.php sẽ có tác dụng thay đổi chuỗi được sử dụng cho mọi trường mẫu yêu cầu.

Nếu bạn muốn thay đổi chuỗi lỗi hiển thị cho tiêu đề khi tiêu đề chưa được nhập, bạn có thể:

  • Thêm một trình xử lý xác thực mẫu vào biểu mẫu chỉnh sửa nút, sử dụng hook_form_alter()
  • Trong hình thức xử lý hợp lệ:

    • Xác minh nội dung của $form['title'](nơi $formđược đặt bằng cách sử dụng $form = &drupal_static('form_set_error', array());và thay đổi nó thành chuỗi bạn muốn khi có'Title field is required.'
    • Xác minh $_SESSION['messages']['error'](một mảng) chứa chuỗi 'Title field is required.'và thay đổi chuỗi thành chuỗi bạn muốn hiển thị

Tránh hiển thị lỗi dễ dàng hơn: Chỉ cần đặt thuộc #requiredtính FALSEvà Drupal sẽ không hiển thị thông báo lỗi đó.


4

Đối với drupal 7, bạn có thể tải xuống mô-đun này http://drupal.org/node/1209450 trong zip, nó sẽ cung cấp cho bạn hook này.

message_alter(&$messages) {
}

Cảm ơn. Có thể không nên sử dụng một mô-đun không được hỗ trợ, nhưng nó có thể được sử dụng như một hướng dẫn!
timofey.com

1

Bạn có thể tùy chỉnh thông báo lỗi biểu mẫu bằng cách sử dụng xác thực Trường cho mỗi trường thực thể.

Để làm điều đó, chỉnh sửa cài đặt trường, đi đến Xác thực và thêm quy tắc xác thực mới (Trường bắt buộc ). Ở đó, bạn nên có trường văn bản để thiết lập thông báo lỗi tùy chỉnh cho trường đó.


0

Đối với Drupal 8, tôi đã có thể thêm một chức năng xác thực tùy chỉnh có thể thực sự kiểm tra các lỗi hiện có và thay đổi đánh dấu các lỗi trên cơ sở từng trường hợp. Trong trường hợp của tôi, tôi muốn thay đổi thông báo lỗi từ trường entity_autocomplete đang tham chiếu người dùng. Nếu người dùng không hợp lệ được thêm vào, lỗi xác thực sẽ ghi "Không có thực thể nào khớp với% name". Thay vì từ "thực thể", tôi muốn nói nó là "người dùng", để bớt đáng sợ và có khả năng gây nhầm lẫn cho người dùng.

Đầu tiên, tôi sử dụng hook_form_alter () để thêm hàm xác thực của mình:

/**
 * 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');
      }

Sau đó, trong hàm '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);
            }
          }
        }
      }
    }

Hi vọng điêu nay co ich!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.