Как заставить drupal hook_form_alter работать после хука проверки в модуле
Недавно я создал модуль 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;
}
2 ответа
Я только что нашел грязное исправление. Процесс валидации и построения формы был определен в drupal_process_form. И я только что взломал эту функцию, чтобы удостовериться, что hook_form_alter вызывается снова после неудачной проверки.
Если у кого-то есть лучшее решение, пожалуйста, напишите здесь. Благодарю.
Вы можете остановить вывод сообщений об ошибках в тему, используя drupal_get_messages('error')
, Затем отображайте пользовательские сообщения об ошибках в любом случае.