คุณจะเปลี่ยนตำแหน่งของเอาต์พุต `form_set_error` ได้อย่างไร


9

มีวิธีใดบ้างใน Drupal 7 ที่จะเปลี่ยนตำแหน่งของเอาต์พุตของform_set_error?

ในขณะนี้จะเรียกdrupal_set_messageว่าคิวใดที่ข้อผิดพลาดของแบบฟอร์มทั้งหมดที่ด้านบนของหน้าจอ

สิ่งที่ฉันต้องการแทนคือให้แต่ละข้อความปรากฏใต้ช่องที่เหมาะสม

หากไม่สามารถทำได้ฉันสามารถตั้งค่าสถานะแบบฟอร์มด้วยตนเองว่า "ไม่ถูกต้อง" ภายในMODULE_form_name_validate()ฟังก์ชันโดยไม่ใช้form_set_errorหรือไม่

คำตอบ:


7

โมดูลข้อผิดพลาด Inline แบบฟอร์มมีฟังก์ชันการทำงานที่:

ข้อผิดพลาดของแบบฟอร์ม IFE หรือ Inline ช่วยให้คุณสามารถวางข้อผิดพลาดในการส่งแบบอินไลน์กับองค์ประกอบของแบบฟอร์ม มีสามตัวเลือกสำหรับการตั้งค่าพฤติกรรมข้อผิดพลาดแบบอินไลน์ คุณสามารถกำหนดค่าพฤติกรรมเริ่มต้นหรือแทนที่พฤติกรรมบนพื้นฐานต่อแบบฟอร์ม คุณสามารถเพิ่มรูปแบบได้มากเท่าที่คุณต้องการ

การวางตลาดของ Drupal 7 นั้นมีเฉพาะในอัลฟ่าเท่านั้น แต่ฉันว่ามันคุ้มค่าที่จะลอง แม้ว่าจะมีปัญหาก็ควรให้คุณเป็นสถานที่ที่ดีในการเริ่มใช้เวอร์ชันของคุณเอง นี่คือภาพหน้าจอของโมดูล:

ป้อนคำอธิบายรูปภาพที่นี่


โมดูลนี้เก่ามาก ฉันทดสอบมันออกมา แต่มันแย่มากในแง่ของการปรับแต่ง น่าเศร้าที่ไม่สมควรสำหรับแบบฟอร์มที่คุณสร้างขึ้นแล้วโดยไม่ต้องสร้างแบบฟอร์มคลิกเหล่านี้
kwoxer

8

การขยายคำตอบ (ถูกต้อง) จากไคลฟ์ฉันทำงานผ่านรหัส IFE ฉันไม่ต้องการโมดูลทั้งหมดที่อุทิศให้กับสิ่งนี้ดังนั้นฉันจึงนำตัวอย่างบางส่วนมาที่นี่เพื่อรับผลลัพธ์ที่ต้องการ ฉันทำเครื่องหมายคำตอบของเขาถูกต้องเพราะท้ายที่สุดแล้วเป็นคำตอบที่ถูกต้อง

รหัสด้านล่างเครดิตทั้งหมดไปที่ไคลฟ์และทีม IFE - ฉันแค่ต้องการนำเสนอเวอร์ชั่นที่เรียบง่ายสำหรับทุกคนที่กำลังมองหาคำตอบที่คล้ายกัน

// 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!");
}

สวัสดีคริสเมื่อคุณพูดว่า "เปิดเผยอาร์เรย์นี้ แต่คุณต้องการเทมเพลตของคุณหรือวนรอบแบบฟอร์มของคุณเพิ่ม #suffix ให้กับแต่ละองค์ประกอบที่มีข้อผิดพลาด" ฉันจะเข้าถึงตัวแปร $ reset_errors ที่ส่งคืนในฟังก์ชันการตรวจสอบในฟอร์มของฉันได้อย่างไร ฟังก์ชั่น? มันจะไม่เป็นไรที่จะให้แสดงตัวอย่างสำหรับที่? ขอบคุณ!
Leolando Tan

@LeolandoTan ขอโทษเพื่อน - ฉันไม่ได้ใช้ Drupal ตั้งแต่ปี 2013 - ฉันจำไม่ได้เลยว่าตอบคำถามนี้!
Chris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.