0

我最近制作了一个 drupal 7 模块,我想自定义 drupal 显示验证错误的方式。我想在弹出窗口中放置错误消息。我把弹出生成代码放在表单alter hook中。

但是我不能让 drupal hook_form_alter 在验证钩子之后运行。我试图清除表单缓存并尝试使用“#after_build”而不是表单更改挂钩,但它们都在验证之前运行。似乎验证是该过程中运行的最后一件事。我把我的代码放在下面,请帮助我。

非常感谢您提前。

function quote_line_menu() {

    $items ['quote_line'] = array (
            'page callback' => 'drupal_get_form',
            'page arguments' => array (
                    'quote_line_form'
            ),
            'access arguments' => array (
                    'access content'
            ),
            'type' => MENU_CALLBACK
    );

    $items ['ajax_manually_get_price'] = array(
            'page callback' => 'ajax_update_price_callback',
            'access arguments' => array (
                    'access content'
            ),
            'type' => MENU_CALLBACK
    );

    return $items;
}


function quote_line_form($form, &$form_state) {

    // Initialize.
    if ($form_state ['rebuild']) {
        // Don't hang on to submitted data in form state input.
        $form_state ['input'] = array ();
    }
    if (empty ( $form_state ['storage'] )) {

        $form_state ['storage'] = array (
                'step' => 'quote_line_form_first'
        );
    }


    // Add general settings
    $form['#attributes']['class'][] = 'separate-border';

    // No cache
    /*
     $form['#cache'] = FALSE;
    $form['#no_cache'] = TRUE;
    $form_state['cache'] = FALSE;*/
    $form['#after_build'][] = 'quote_line_form_after_build';
    // $form['#validate'][] = 'quote_line_form_validate';

    // Return the form for the current step.
    $function = $form_state ['storage'] ['step'];
    $form = $function ( $form, $form_state );

    return $form;
}

function quote_line_form_after_build($form, &$form_state) {
    error_log(0);
    return $form;
}


function quote_line_form_quote_line_form_alter(&$form, &$form_state, $form_id) {

    error_log(1);
    quote_line_handle_form_set_error($form, $form_state, $form_id); //generate popup here

    // Preset form state
    if($form_state['storage']['step'] == 'quote_line_form_bike_info'){
        if(isset($form_state['storage']['bike_0_oversea_travel_days']) && !empty($form_state['storage']['bike_0_oversea_travel_days'])){
            $form ['default_open_oversea'] = array (
                    '#markup' => '<script>jQuery("a#over0-yes").click();</script>'
            );
        }
    }
}


function quote_line_form_validate($form, &$form_state) {

    error_log(2);
    error_log($_POST['form_build_id']);
    //cache_clear_all('form', 'cache_form', true);

    $values = $form_state ['values'];

    if(isset($_POST['back']) && !empty($_POST['back'])){
        if(!isset($form_state ['values']['back']) || $form_state ['values']['back'] != $_POST['back']){
            $form_state ['values']['back'] = $_POST['back'];
        }
        if(!isset($form_state ['values']['op']) || $form_state ['values']['op'] != $_POST['back']){
            $form_state ['values']['op'] = $_POST['back'];
        }

        $function = 'quote_line_form_submit';
        $function ( $form, $form_state );

        return;
    }

    // Call step validate handler if it exists.
    if (function_exists ( $form_state ['storage'] ['step'] . '_validate' )) {
        $function = $form_state ['storage'] ['step'] . '_validate';
        $function ( $form, $form_state );
    }

    return;
}
4

2 回答 2

0

您可以使用停止将错误消息打印到主题drupal_get_messages('error')。然后,以您喜欢的方式显示自定义错误消息。

于 2014-12-16T09:41:34.413 回答
0

我刚刚找到了一个肮脏的修复程序。验证和表单构建过程已在drupal_process_form中定义。我刚刚破解了该函数,以确保在验证失败后再次调用 hook_form_alter。

如果有人有更好的解决方案,请在此处发布。谢谢。

于 2014-12-17T05:35:03.767 回答