回答:
インラインフォームのエラーモジュールは、その機能を持っています:
IFEまたはインラインフォームエラーを使用すると、フォーム送信エラーをフォーム要素にインラインで配置できます。インラインエラー動作を設定するための3つのオプションが用意されています。デフォルトの動作を設定するか、フォームごとに動作をオーバーライドできます。フォームはいくつでも追加できます。
Drupal 7リリースはアルファ版のみですが、試してみる価値はあると思います。問題がある場合でも、独自のバージョンの実装を開始するための良い場所を提供するはずです。これはモジュールのスクリーンショットです:
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!");
}