Como uso o form_set_error () da maneira certa?

8

No meu módulo Drupal 7, eu tenho um formulário e seus manipuladores de validação. Eu chamo meu formulário de um field.tpl.php com print render(drupal_get_form('my_form')); funciona como esperado.

O problema está no caso de um valor de entrada incorreto.

Requer dois envios incorretos antes de exibir a mensagem de erro: Na primeira vez, há uma borda vermelha ao redor da minha entrada incorreta e, na segunda vez, a mensagem de erro é exibida (com a borda vermelha).

Então, qual é a maneira correta de usar form_set_error()?

druvik
fonte
Não há uma drupal_set_error()função. Tem certeza de que não quis dizer isso form_set_error()?
kiamlaluno
Você está certo! Quero dizer form_set_error ()! Eu tento atualizar o primeiro post.
Druvik

Respostas:

6

Os construtores de formulários não devem ser chamados dentro de um arquivo de modelo, pois estão sendo chamados tarde demais. Quando você está chamando render(drupal_get_form('my_form')), o código que renderiza as mensagens de erro foi executado e as mensagens de erro eventuais relatadas pelo manipulador de validação são salvas na sessão atual de drupal_set_message () , que é chamado de form_set_error().

O código para imprimir a mensagem de erro está no arquivo page.tpl.php .

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

<?php print $messages; ?>

O código drupal_set_message()que salva as mensagens a serem exibidas é o seguinte:

  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
fonte
Está bem. Entendo que usar form_set_error()um arquivo de modelo é o caminho errado. Então, qual é o caminho certo?
precisa saber é
11
drupal_get_form()não deve ser chamado dentro de um arquivo de modelo, mas dentro de um módulo.
kiamlaluno
Ok, eu o coloquei em um módulo e usei o Display Suite para exibi-lo na minha página. Obrigado.
Druvik
Você deve marcar isso como a resposta correta, se isso o ajudou.
Malks
8

Você deve estar olhando para form_set_error vez

se você tiver um 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;
}

na sua função de retorno de chamada de validação, faça isso se você achar que os valores $form_state['values']não são 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
fonte
Na verdade, essa é a função que eu uso. (Corrijo o erro do meu primeiro post).
Druvik
1

form_set_error()deve ser chamado dentro de sua hook_validate()função, conforme respondido por LSU_JBob.

Amin
fonte
Um manipulador de validação não é uma implementação de hook_validate().
kiamlaluno