如何更改“ form_set_error”输出的位置?


9

Drupal 7中有没有一种方法可以更改输出的位置form_set_error

此刻,它调用drupal_set_message将所有表单错误排队到屏幕顶部。

相反,我希望每个消息都显示在相应字段的下方。

如果无法做到这一点,是否可以在使用MODULE_form_name_validate()功能的情况下手动将表单标记为“无效” form_set_error

Answers:


7

内嵌形式错误模块具有该功能:

IFE或内联表单错误允许您将表单提交错误与表单元素内联。提供了三个选项来设置您的内联错误行为。您可以配置默认行为,也可以基于每个表单覆盖行为。您可以添加任意多个表格。

Drupal 7发行版仅在Alpha中,但我想值得一试。即使有问题,它也应该为您提供一个开始实施自己的版本的好地方。这是模块屏幕截图:

在此处输入图片说明


这个模块真的很旧。我进行了测试,但是在自定义方面太糟糕了。遗憾的是,如果没有这些可点击的形式创建表单,那么对于您已经创建的表单是无用的。
kwoxer

8

从Clive扩展了(正确的)答案,我研究了IFE代码。我实际上并不需要专用于此的整个模块,因此我在这里和那里采用了一些代码片段来获得所需的结果。我将他的答案标记为正确,因为这最终是正确的答案。

代码在下面,所有的功劳都归Clive和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!");
}

克里斯,您好,当您说“将数组随意暴露在模板中,或者在表单上循环添加#后缀到有错误的每个元素”时,如何访问表单中validate函数返回的$ reset_errors变量功能?可以为此提供示例显示吗?谢谢!
Leolando Tan

@LeolandoTan对不起朋友-自2013年以来我就没有使用过Drupal-我什至不记得回答这个问题!
克里斯(Chris)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.