¿Cómo uso form_set_error () de la manera correcta?

8

En mi módulo Drupal 7, tengo un formulario y sus controladores de validación. Llamo a mi formulario desde un field.tpl.php con print render(drupal_get_form('my_form')); Funciona como se esperaba.

El problema es en caso de un valor de entrada incorrecto.

Requiere dos envíos incorrectos antes de mostrar el mensaje de error: la primera vez, hay un borde rojo alrededor de mi entrada incorrecta, y la segunda vez, se muestra el mensaje de error (con el borde rojo).

Entonces, ¿cuál es la forma correcta de usar form_set_error()?

druvik
fuente
No hay una drupal_set_error()función ¿Estás seguro de que no quisiste decir form_set_error()?
kiamlaluno
¡Tienes razón! Me refiero a form_set_error ()! Intento actualizar la primera publicación.
druvik

Respuestas:

6

Se supone que los creadores de formularios no deben llamarse dentro de un archivo de plantilla, ya que se llaman demasiado tarde. Cuando está llamando render(drupal_get_form('my_form')), el código que representa los mensajes de error se ha ejecutado, y los mensajes de error eventuales informados desde el controlador de validación se guardan en la sesión actual desde drupal_set_message () , que se llama desde form_set_error().

El código para imprimir el mensaje de error está en el archivo page.tpl.php .

<?php if ($breadcrumb): ?>
  <div id="breadcrumb"><?php print $breadcrumb; ?></div>
<?php endif; ?>

<?php print $messages; ?>

El código drupal_set_message()que guarda los mensajes para mostrar es el siguiente:

  if ($message) {
    if (!isset($_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type] = array();
    }

    if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type][] = $message;
    }

    // Mark this page as being uncacheable.
    drupal_page_is_cacheable(FALSE);
  }
kiamlaluno
fuente
Okay. Entiendo que usar form_set_error()un archivo de plantilla es la manera incorrecta. Entonces, ¿cuál es la forma correcta?
druvik
1
drupal_get_form()no debe llamarse dentro de un archivo de plantilla, sino dentro de un módulo.
kiamlaluno
Ok, lo puse en un módulo y utilicé Display Suite para mostrarlo en mi página. Gracias.
druvik
Debes marcar esto como la respuesta correcta si te ayudó.
Malks
8

Deberías mirar form_set_error en su lugar

si tienes un elemento como este:

function my_custom_module_form() {
  $form = array();
  $form['my_element'] = array(
    '#type' => 'textfield',
    '#title' => 'My Text field',
    '#default_value' => 'Some default text.',
  );
  return $form;
}

en su función de devolución de llamada de validación, haga esto si encuentra que los valores en $form_state['values']no son válidos

function my_custom_module_form_validate($form, &$form_state) {
  // Do some checking on $form_state['values'], if you don't like it.
  form_set_error('my_element', 'This is the error message that will be displayed.');
}
LSU_JBob
fuente
De hecho, esa es la función que uso. (Corrijo el error de mi primera publicación).
druvik
1

form_set_error()debe llamarse dentro de su hook_validate()función como lo responde LSU_JBob.

Amin
fuente
Un controlador de validación no es una implementación de hook_validate().
kiamlaluno