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.
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.
Câu trả lời:
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']))));
}
}
Hãy thử mô-đun xác thực trường .
Bạn vẫn phải thêm xác nhận hợp lệ cho từng trường bạn muốn xác thực.
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ó.
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_id
biể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.
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).