Xác thực tất cả các trường hợp của một trường lập trình


7

Cách tốt nhất (hook) để xác nhận tất cả các trường hợp của một trường lập trình là gì? Tôi có rất nhiều loại nội dung có cùng các lĩnh vực như field_phone. Tôi muốn xác nhận theo chương trình field_phoneở mọi nơi nó được sử dụng.


1
Đây có phải là một đánh giá một lần hoặc một cái gì đó bạn luôn muốn được áp dụng? Nếu đó là thứ luôn được áp dụng, bạn chỉ cần thêm xác thực trường một cách bình thường và sau đó lưu lại tất cả các nút có trường đó ...
Patrick Kenny

@PatrickKenny Tôi muốn viết một mô-đun cho nó.
hpn

1
Nhưng một mô-đun để xác nhận lại một lần tất cả dữ liệu của bạn hoặc một mô-đun để xác nhận nó ở mọi nơi trên mỗi lần gửi?
Mołot

Chỉ định hàm xác thực trong khi tạo trường biểu mẫu.
coi

@ Mołot một mô-đun để xác thực nó ở mọi nơi trên mỗi lần gửi
hpn

Câu trả lời:


6

Bạn có thể triển khai hook_field_validate và kiểm tra xem đó có phải là trường hợp chính xác không. Không hoạt động nếu trường không được xác định bởi mô-đun.

Một cách để xây dựng mà sẽ sử dụng hook_form_alter và thêm element_validator nếu lĩnh vực này tồn tại trên biểu mẫu.

function mymodule_form_alter(&$form, &$form_state, $form_id) {
   if (isset($form['field_phone'])) {
      $form['field_phone']['#element_validate'][] = 'mymodule_somevalidator';
    }
 }

function mymodule_somevalidator($element, &$form_state) {
  if (!empty($element['#value']) && !is_numeric(parse_size($element['#value'])) {
    form_error($element, t('The "!name" must be x', array('!name' => t($element['title']))));
  }
} 

1
hook_field_validate sẽ không hoạt động. Đó là một cái móc được thực hiện bởi các mô-đun xác định các loại quái vật. Thay vào đó, bạn có thể muốn triển khai hook_field_attach_validate .
jonhattan

@jonhattan: Đã chỉnh sửa câu trả lời. Bạn đã đúng, rất có thể trường không được xác định bởi mô-đun.
20301

Điều này hiệu quả với tôi với một sửa đổi nhỏ: Thay vì $ phần tử ['# value'], tôi đã phải sử dụng phần tử $ [$ phần tử ['# ngôn ngữ']] [0] ['# value'] và Thay vì phần tử $ ['title'], tôi đã phải sử dụng phần tử $ [$ phần tử ['# ngôn ngữ']] [0] ['# title']. Hi vọng điêu nay co ich.
Supriya Rajgopal


2

Từ trường_attach_form_validate :

Có hai cấp độ xác thực cho các trường trong các biểu mẫu: xác thực tiện ích và xác thực trường.

để xác thực widget, bạn có thể theo đường dẫn hook_form_alter. Điều này rất khó để khái quát vì bạn cần biết chi tiết về cách biểu mẫu được xây dựng. Ví dụ các phần tử hoặc giá trị có thể được lồng cho một số thực thể.

IMO, tốt nhất là thực hiện xác nhận trường. Nó được thực hiện bằng cách triển khai hook_field_attach_validate . Đây là một ví dụ đơn giản:

function hook_field_attach_validate($entity_type, $entity, &$errors) {
  if (isset($entity->field_phone)) {
    $errors['field_phone'][LANGUAGE_NONE][0][] = array(
      'error' => 'error_key',
      'message' => t('Error message'),
    );
  }
}

error_keyđược hook_field_widget_error sử dụng để gắn cờ một phần tử biểu mẫu khi một widget là hợp chất của một số phần tử. Ví dụ, trong trường hợp thực hiện móc văn bản này , khóa lỗi text_summary_max_lengthđược sử dụng để gắn cờ một phần tử trong cấu trúc widget.

Trong thuật ngữ chung, khóa lỗi không được sử dụng cho các widget có một phần tử duy nhất. Trong trường hợp loại trường điện thoại (mà tôi cho rằng bạn đang sử dụng), họ cung cấp tiện ích hỗn hợp nhưng không triển khai phân phối lỗi cho các thành phần , vì vậy chỉ cần bỏ qua nó.


1

Cách tốt nhất để thực hiện nó bằng cách triển khai hook_form_alter . Logic là như vậy mà bạn cần thêm chức năng xác thực tùy chỉnh đối với tất cả các biểu mẫu Kiểu Nội dung có cùng trường như field_phone(trong trường hợp của bạn) và nó cần phải động. Một lần, tôi đã gặp phải tình huống như vậy nhưng tôi phải xác nhận chống lại hình thức duy nhất. Mã dưới đây là gần như cùng thực hiện nhưng tôi đã làm cho nó năng động hơn nhiều cho trường hợp của bạn.

Tạo một mô-đun và triển khai hook_form_alter như thế này:

/**
 * Implementation of hook_form_alter
 */
function MODULE_NAME_form_alter(&$form, $form_state, $form_id) {
  // $cck_type contains the array of all Drupal content type machine names
  $cck_type = array_keys(node_type_get_types());

  // Machine names of those content type whose instance you want to validate
  // Add your machine name for whom you want to validate. You can get the 
  // machine names of content types from Admin > Structure > Content types. Fill
  // as many required bu you.
  $my_types = array('CCK_TYPE_1', 'CCK_TYPE_2', 'CCK_TYPE_3');

  // Since, a user fill one form at particular time. The variable $current_type 
  // hold the Content Type machine name for current form. 
  if (arg(0) == 'node' && arg(1) == 'add') {
    $current_type = arg(2);
  } elseif ((arg(0) == 'node') && is_numeric(arg(1)) && (arg(2) == 'edit')) {
    $node = node_load(arg(1));
    $current_type = $node->type;
  }

  // gets current form's ID
  $id_of_form = $form['form_id']['#value'];

  // checks if the current form is part of Drupal Content Type
  if (in_array($current_type, $my_types) && in_array($current_type, $cck_type)) {
    $id_of_form = $form['form_id']['#value'];
    if ($form_id == $id_of_form) {
      // Adding custom validation function to the form so that we can validate
      // the field of that form
      $form['#validate'][] = 'custom_validates';
    }
  }
}

Bây giờ, thực hiện chức năng xác nhận tùy chỉnh để xác nhận.

/**
 * Implementation of custom validation for validating 'field_phone' in your case.
 * It can be any field, assuming that it is part of that form.
 */
function custom_validates(&$form, $form_state) {
  $values = $form_state['values'];

  // Language of the $form
  $lang = $form['language']['#value'];
  $field_phone = $values['field_phone'][$lang][0]['value'];

  // In my case, for testing purpose, I had set the strings in Phone field
  if (!is_integer($field_phone)) {
    form_set_error('field_phone', 'Invalid phone number');
  }
}

Theo cách tiếp cận đơn giản, bạn chỉ cần kiểm tra $form_idbiểu mẫu loại nội dung của bạn và thêm chức năng xác thực tùy chỉnh như thế này:

/**
 * Implementation of hook_form_alter
 */
function MODULE_NAME_form_alter(&$form, $form_state, $form_id) {
  if (($form_id == 'content_type_form_id_1') ||
          ($form_id == 'content_type_form_id_2') ||
          ($form_id == 'content_type_form_id_3')) {
    // Adding custom validation function to the form so that we can validate
    // the field of that form
    $form['#validate'][] = 'custom_validates';
  }
}

Nhưng vấn đề với cách tiếp cận đơn giản này là bạn sẽ cần biết ID mẫu của mỗi mẫu nội dung đơn và sau đó thêm nó vào câu lệnh if với ||toán tử như tôi đã trình bày trước đây. Điều này sẽ mất rất nhiều thời gian của bạn.

Tôi đã thực hiện các ý kiến ​​tương ứng để làm cho bạn hiểu logic và thực hiện.

Tôi hy vọng rằng giải pháp của tôi trả lời vấn đề của bạn.


0

Câu trả lời là theo quan điểm của tôi là hook_field_widget_WIDGET_TYPE_form_alter () . Sử dụng hook để thêm hàm gọi lại xác thực của bạn vào mảng $ Element [#element_validate] và bạn sẽ ổn.

hook_form_alter () rất chung chung và nó sẽ được gọi cho mọi hình thức cho dù nó có field_phone hay không (tăng chi phí). Bên cạnh đó, điều gì sẽ xảy ra nếu field_phone nằm sâu bên trong các bộ hoặc vùng chứa khác nhau? Bạn sẽ phải tìm kiếm nó một cách đệ quy (chi phí bổ sung).

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.