आप `form_set_error` आउटपुट का स्थान कैसे बदलते हैं?


9

क्या Drupal 7 में आउटपुट का स्थान बदलने का कोई तरीका है form_set_error?

फिलहाल, यह कॉल करता है drupal_set_messageजो स्क्रीन के शीर्ष पर सभी फॉर्म की त्रुटियों को कतार में रखता है।

इसके बजाय मैं क्या चाहूंगा कि प्रत्येक संदेश उचित क्षेत्र के नीचे दिखाई दे।

यदि यह संभव नहीं है, तो क्या मैं मैन्युअल रूप से उपयोग किए बिनाMODULE_form_name_validate() फ़ंक्शन को "अमान्य" रूप में चिह्नित कर सकता हूं ?form_set_error

जवाबों:


7

इनलाइन फार्म त्रुटियाँ मॉड्यूल है कि कार्यक्षमता है:

IFE या इनलाइन फ़ॉर्म त्रुटियां आपको फ़ॉर्म तत्वों के साथ फ़ॉर्म सबमिशन त्रुटि इनलाइन रखने की अनुमति देती हैं। आपके इनलाइन त्रुटि व्यवहार को सेट करने के लिए तीन विकल्प दिए गए हैं। आप डिफ़ॉल्ट व्यवहार को कॉन्फ़िगर कर सकते हैं या प्रति प्रपत्र के आधार पर व्यवहार को ओवरराइड कर सकते हैं। आप जितने चाहें उतने फॉर्म जोड़ सकते हैं।

ड्रुपल 7 रिलीज केवल अल्फा में है, लेकिन मैं कहूंगा कि यह एक कोशिश के लायक है। यदि समस्याएँ हैं, तो भी आपको अपने स्वयं के संस्करण को लागू करने के लिए एक अच्छी जगह देनी चाहिए। यह मॉड्यूल स्क्रीनशॉट है:

यहां छवि विवरण दर्ज करें


यह मॉड्यूल वास्तव में पुराना है। मैंने इसका परीक्षण किया लेकिन अनुकूलन के संदर्भ में यह बहुत बुरा है। प्रपत्रों के इन आकर्षक कृतियों के बिना आपके द्वारा पहले ही बनाए गए फ़ॉर्म के लिए दुर्भाग्यपूर्ण है।
कुवेर

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 वेरिएबल का उपयोग कैसे कर सकता हूं समारोह? क्या उसके लिए नमूना प्रदर्शन प्रदान करना ठीक होगा? धन्यवाद!
लेओलांडो टैन

@LeandoandoTan माफ करना दोस्त - मैंने 2013 से Drupal का उपयोग नहीं किया है - मुझे इस प्रश्न का उत्तर याद नहीं है!
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.