`Form_set_error` çıktısının yerini nasıl değiştirirsiniz?


9

Drupal 7'de çıktının yerini değiştirmenin bir yolu var mı form_set_error?

Şu anda, drupal_set_messagehangi formun hatalarını ekranın üst kısmına sıraya koyar.

Bunun yerine istediğim her mesajın uygun alanın altında görünmesidir.

Bu mümkün değilse, el içinde "geçersiz" olarak formu işaretleyebilir MODULE_form_name_validate()fonksiyonu olmadan kullanan form_set_error?

Yanıtlar:


7

Inline Formu Hatalar modülü işlevselliğe sahiptir:

IFE veya Satır İçi Form Hataları, form gönderme hatasını form öğeleriyle birlikte yerleştirmenize olanak tanır. Satır içi hata davranışınızı ayarlamak için üç seçenek sunulur. Varsayılan davranışı yapılandırabilir veya davranışı form bazında geçersiz kılabilirsiniz. İstediğiniz kadar form ekleyebilirsiniz.

Drupal 7 sürümü sadece alfa ama denemeye değer diyebilirim. Sorunlar olsa bile, kendi sürümünüzü uygulamaya başlamak için size iyi bir yer vermelidir. Bu modül ekran görüntüsüdür:

resim açıklamasını buraya girin


Bu modül gerçekten eski. Test ettim ama özelleştirmeler açısından çok kötü. Bu tıklama formları oluşturmadan daha önce oluşturduğunuz Formlar için ne yazık ki yararsızdır.
kwoxer

8

Clive'den (doğru) yanıtı genişleterek IFE kodunu kullanarak çalıştım. Buna adanmış bir modüle gerçekten ihtiyacım yoktu, bu yüzden burada ve orada ihtiyacım olan sonucu almak için birkaç parçacığı kabul ettim. Cevabını doğru olarak işaretledim çünkü sonuçta doğru cevap bu.

Kod aşağıda, tüm kredi Clive ve IFE ekibine gidiyor - Ben sadece benzer bir cevap arayan herkes için basitleştirilmiş sürümünü sunmak istedim.

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

Merhaba Chris, "Bu diziyi şablonunuza istediğiniz gibi gösterin veya formunuzun üzerinde hata içeren her bir öğeye #suffix ekleyerek döngü" dediğinizde, formumdaki doğrulama işlevinde döndürülen $ reset_errors değişkenine nasıl erişebilirim? fonksiyon? Bunun için örnek bir görüntü sağlamak uygun olur mu? Teşekkürler!
Leolando Tan

Üzgünüm dostum - 2013'ten beri Drupal kullanmadım - Bu soruyu cevapladığımı bile hatırlayamıyorum!
Chris
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.