Làm thế nào để bạn thay đổi vị trí của đầu ra `form_set_error`?


9

Có cách nào trong Drupal 7 để thay đổi vị trí của đầu ra form_set_errorkhông?

Hiện tại, nó gọi drupal_set_messagehàng đợi tất cả các lỗi của biểu mẫu lên trên cùng của màn hình.

Thay vào đó, những gì tôi muốn là cho mỗi thông báo xuất hiện bên dưới trường thích hợp.

Nếu điều này là không thể, tôi có thể tự gắn cờ biểu mẫu là "không hợp lệ" trong MODULE_form_name_validate()hàm mà không sử dụng form_set_errorkhông?

Câu trả lời:


7

Các lỗi Inline Mẫu mô-đun có chức năng:

Lỗi IFE hoặc Inline Form cho phép bạn đặt nội tuyến lỗi gửi biểu mẫu với các thành phần của biểu mẫu. Ba tùy chọn được cung cấp để thiết lập hành vi lỗi nội tuyến của bạn. Bạn có thể định cấu hình hành vi mặc định hoặc ghi đè hành vi trên cơ sở mỗi biểu mẫu. Bạn có thể thêm bao nhiêu hình thức tùy thích.

Bản phát hành Drupal 7 chỉ ở dạng alpha nhưng tôi muốn nói nó đáng để thử. Ngay cả khi có vấn đề, nó sẽ cung cấp cho bạn một nơi tốt để bắt đầu thực hiện phiên bản của riêng bạn. Đây là ảnh chụp màn hình mô-đun:

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


Mô-đun này thực sự cũ. Tôi đã thử nghiệm nó nhưng nó rất tệ về mặt tùy chỉnh. Đáng buồn thay cho các Biểu mẫu bạn đã tạo mà không có các biểu mẫu nhấp chuột này.
kwoxer

8

Mở rộng câu trả lời (đúng) từ Clive, tôi đã làm việc thông qua mã IFE. Tôi thực sự không cần toàn bộ mô-đun dành riêng cho việc này, vì vậy tôi đã áp dụng một vài đoạn ở đây và ở đó để có được kết quả tôi cần. Tôi đã đánh dấu câu trả lời của anh ấy là đúng vì cuối cùng nó là câu trả lời đúng.

Mã bên dưới, tất cả tín dụng thuộc về Clive và nhóm IFE - Tôi chỉ muốn trình bày phiên bản đơn giản hóa cho bất kỳ ai đang tìm kiếm một câu trả lời tương tự.

// Standard gear - do some custom validation and set the errors
// as you go..
// 
// Once all the validation has been done, call MODULE_errors_reset
// which will return an array of all errors against their ID. 
// Expose this array however you like to your template, or loop
// over your form adding a #suffix to each element with an error
//
function MODULE_form_name_validate($form, &$form_state) {
    drupal_set_message("validating...");

    form_set_error("description", "There is an error here!!!!");
    form_set_error("tags", "Yep, and here too!!!");

    $reset_errors = MODULE_errors_reset( $form );

    drupal_set_message( "<pre>" . print_r( $reset_errors, true ) . "</pre>" );
}

// This part is adopted from IFE. It's changed in two ways, it returns
// an array (which also merges with its recursive self). 
// And it also skips all the 'display' stuff present in the original
// Essentially it extracts out the error messages from the session and unsets 
// them. I am assuming that Drupal 7 marks the success of a validation based not
// whether the SESSION variable contains anything, the SESSION seems to be only
// for the message at the top of the screen.
//
function MODULE_errors_reset( $element ) {
    if( ! isset( $_SESSION[ 'messages' ] ) ) {
        return;
    }

    $reset_errors = array();

    // Recurse through all children.
    foreach( element_children( $element ) as $key ) {
        if( isset( $element[ $key ] ) && $element[ $key ] ) {
            $reset_errors += MODULE_errors_reset( $element[ $key ] );
        }
    }

    // Check for errors and settings
    $errors = form_get_errors();
    $element_id = implode( '][', $element[ '#parents' ] );

    if ( !empty( $errors[ $element_id ] )) {
        $error_message = $errors[ $element_id ];

        // Get error id
        $error_id = array_search( $error_message, $_SESSION[ 'messages' ][ 'error' ] );

        if( $error_id !== FALSE ) {
            unset( $_SESSION[ 'messages' ][ 'error' ][ $error_id ] );
            $_SESSION[ 'messages' ][ 'error' ] = array_values( $_SESSION[ 'messages' ][ 'error' ]  );

            if( count( $_SESSION[ 'messages' ][ 'error' ] ) <= 0 ) {
                unset( $_SESSION[ 'messages' ][ 'error' ] );
            }

            $reset_errors[ $element[ '#id' ] ] = $error_message;
        }
    }

    return $reset_errors;
}

// If there are no form errors, we still hit here, even after the 'reset', this is
// a good thing. 
function MODULE_form_name_submit( $form, &$form_submit ) {
    drupal_set_message("submited!");
}

Xin chào Chris, khi bạn nói "Hiển thị mảng này theo cách bạn muốn cho mẫu của bạn hoặc lặp qua biểu mẫu của bạn thêm #suffix cho mỗi phần tử có lỗi", làm cách nào tôi có thể truy cập biến $ reset_errors được trả về trong hàm xác thực trong biểu mẫu của tôi chức năng? Nó có ổn không khi cung cấp một màn hình mẫu cho điều đó? Cảm ơn!
Leolando Tân

@LeolandoTan xin lỗi người bạn đời - Tôi đã không sử dụng Drupal kể từ năm 2013 - Tôi thậm chí không thể nhớ mình đã trả lời câu hỏi này!
Chris
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.