Nada de esto funciona para mí. La función ajax del envío de formulario aún llama directamente a la función de devolución de llamada, al omitir la validación, enviar y también hacer que el botón no pueda hacerse clic varias veces. Los mensajes de validación NO se muestran. Literalmente copié y pegué el código de Joshua Stewardson y no funcionó.
El hecho de que este caso de uso sea tan difícil e indocumentado es muy perturbador. Para mí, esta parece ser la más básica de las solicitudes para una API de formulario AJAX. De acuerdo, aliviando mi frustración, en la solución.
Esto es lo que terminé haciendo para que esto funcione. Se siente hacky y retrasado. También se romperá si hay múltiples instancias del formulario en una sola página, pero fue lo mejor que pude hacer. Si alguien puede arrojar luz sobre esto, POR FAVOR, hazlo!
Básicamente, debe reemplazar todo el formulario consigo mismo dentro de su devolución de llamada, y anteponer manualmente cualquier mensaje configurado al objeto de formulario. Para ello, declare que el contenedor es la identificación de su formulario (se romperá si hay varias instancias de su formulario en una sola página, porque la ID se actualizará).
function productsearchbar_savesearch_form($form, &$form_state) {
$form["wrapper"] = array("#markup" => "<div class='inline-messages'></div>");
$form["name"] = array(
"#type" => "textfield",
"#required" => true,
"#title" => "Name"
);
$form["submit"] = array(
"#type" => "submit",
"#value" => "Send",
"#ajax" => array(
"callback" => "productsearchbar_savesearch_form_callback",
"wrapper" => "productsearchbar-savesearch-form",
"effect" => "fade"
)
);
return $form;
}
function productsearchbar_savesearch_form_callback($form, &$form_state) {
$messages = theme('status_messages');
if($messages){
$form["wrapper"] = array("#markup" => "<div class='inline-messages'>$messages</div>");
}
return $form;
}
function productsearchbar_savesearch_form_validate($form, &$form_state) {
if ($form_state['values']['name'] == '') {
form_set_error('', t('Name field is empty!'));
}
}
function productsearchbar_savesearch_form_submit($form, &$form_state) {
drupal_set_message(t('Your form has been saved.'));
}
¿Está seguro de que la validación está siendo ignorada? Lo he hecho docenas de veces y la validación nunca ha sido ignorada (a menos que le haya dicho específicamente a Drupal que las ignore usando '# limit_validation_errors'). Además, los mensajes de error se cargan automáticamente en el elemento 'wrapper' de manera predeterminada, por lo que una vez que hayas arreglado el primer bit, debería encajar en su lugar. ¿Podrías publicar algo más de tu código? – Clive
@Clive Acabo de hacer otra forma de prueba, los mismos resultados. Aquí está la forma: función dr_search_test_form (forma $, Y $ FSTATE) {$ forma [ "envoltorio"] = array ( "#markup" => "
" ); $ form ["name"] = array ( "#type" => "textfield", "#required" => true, "#title" => "Nombre" ); $ formulario [ "enviar"] = array ( "#TYPE" => "enviar", "#value" => "Enviar", "#ajax" => array ( "callback" => "dr_search_test_form_callback ", " envoltura "=>" prueba-ajax ", " efecto "=>" fundido " ) ); return $ form; } –function dr_search_test_form_callback ($ form, & $ fstate) { return "sadsadas"; } función dr_search_test_form_validate ($ form, & $ fstate) { form_set_error ("nombre", "Algún error para visualizar"); } –