Como você altera um erro de formulário?

8

Como você altera ou remove um erro de formulário produzido pelo Drupal ou outro módulo no nó inserir / salvar, para um tipo de conteúdo específico. Estou procurando um método que eu possa usar em um módulo.

Eu tentei hook_node_validate () , mas tudo o que pude fazer é obter erros e definir erros.

insira a descrição da imagem aqui

timofey.com
fonte

Respostas:

13

Alterando strings

Para alterar o texto de uma única sequência, o método mais simples é usar o módulo Substituições de Sequências. Isso permitiria substituir a string:

"campo de nome é obrigatório."

com (por exemplo):

"O campo '! Name' é obrigatório."

Alterando campos do formulário

Se você deseja tornar um campo não obrigatório, use uma implementação normal hook_form_alter ():

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form['#node'];
  if ($node->type == 'my_custom_type') {
    $form['title']['#required'] = FALSE;
  }
}

Alterando a maneira como um formulário é validado

Os formulários têm funções de validação especificadas na $form['#validate']matriz. E os elementos do formulário têm funções especificadas em $form['element_key']['#element_validate'].

Você pode especificar o seu próprio desta forma:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_node_form_alter(&$form, &$form_state) {
  $form['title']['#element_validate'][] = 'mymodule_validate_node_title';
}

/**
 * Validate the node title to prevent ALL CAPS.
 */
function mymodule_validate_node_title($element, &$form_state, $form) {
  if (preg_match('/^[A-Z]+$/', $element['#value'])) {
    form_error($element, t('You may not enter titles in ALL CAPS.'));
  }
}
pjcdawkins
fonte
Ótima resposta! Como você alteraria o texto de erro de - "O campo Título é obrigatório". (como mostrado na pergunta)? Isso sem usar substituições de string.
timofey.com
Em outras palavras, não quero adicionar validação, apenas modificar a mensagem de erro de uma validação existente ... talvez desmarque a validação existente e adicione uma nova?
timofey.com
11
A validação existente não é uma função de retorno de chamada de validação; é apenas que o campo é "obrigatório". Uma combinação dos dois últimos acima removeria a mensagem existente e adicionaria outro tipo de validação.
pjcdawkins
Eu preciso alterar apenas uma mensagem de validação. Embora eu tenha implementado a solução acima (por hook_form_alter). Estou recebendo duas mensagens de validação. 1 um padrão e 2 que eu escrevi. Quaisquer @pjcdawkins sugestão
kundan inovador
6

Como a string usada para essa mensagem de erro é "! Name field é obrigatória". usar o módulo Substituições de String ou alterar a string a ser usada no arquivo settings.php teria o efeito de alterar a string usada em todos os campos de formulário necessários.

Se você deseja alterar a sequência de erros mostrada para o título quando o título não foi inserido, você pode:

  • Inclua um manipulador de validação de formulário no formulário de edição do nó, usando hook_form_alter()
  • Nesse formulário, manipulador de validação:

    • Verifique o conteúdo de $form['title'](onde $formé definido usando $form = &drupal_static('form_set_error', array());e altere-o para a sequência desejada quando for'Title field is required.'
    • Verificar $_SESSION['messages']['error'](uma matriz) contém a sequência 'Title field is required.'e altere-a para a sequência que você deseja mostrar

Evitar mostrar o erro é mais fácil: basta definir a #requiredpropriedade como FALSE, e o Drupal não mostrará essa mensagem de erro.

kiamlaluno
fonte
4

Para o drupal 7, você pode fazer o download deste módulo http://drupal.org/node/1209450 em zip, que fornecerá esse gancho.

message_alter(&$messages) {
}
Ali Nouman
fonte
Obrigado. Provavelmente não é uma boa ideia usar um módulo não suportado, mas pode ser usado como um guia!
timofey.com
1

Você pode personalizar as mensagens de erro do formulário usando a validação de campo por campo de entidade.

Para fazer isso, edite as configurações do campo, acesse Validação e adicione uma nova regra de validação ( campo obrigatório ). Lá, você deve ter um campo de texto para configurar a mensagem de erro personalizada para esse campo.

kenorb
fonte
0

No Drupal 8, pude adicionar uma função de validação personalizada que pode realmente examinar os erros existentes e alterar a marcação dos erros por caso. No meu caso, eu queria alterar a mensagem de erro de um campo entity_autocomplete que referenciava usuários. Se um usuário inválido foi adicionado, o erro de validação dizia: "Não há entidades correspondentes a% name". Em vez da palavra "entidades", eu queria dizer "usuários", para ser menos assustador e potencialmente confuso para os usuários.

Primeiro, uso hook_form_alter () para adicionar minha função de validação:

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

      if (in_array($form_id, ['whatever_form_id_you_need_to_alter'])) {
        // Add entity autocomplete custom form validation messages alter.
        array_unshift($form['#validate'], 'my_module_custom_user_validate');
      }

Em seguida, na função 'my_module_custom_user_validate':

/**
 * Custom form validation handler that alters default validation.
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
*/
function my_module_custom_user_validate(&$form, FormStateInterface $form_state) {
      // Check for any errors on the form_state
      $errors = $form_state->getErrors();
      if ($errors) {
        foreach ($errors as $error_key => $error_val) {
          // Check to see if the error is related to the desired field:
          if (strpos($error_key, 'the_entity_reference_field_machine_name') !== FALSE) {
            // Check for the word 'entities', which I want to replace
            if (strpos($error_val->getUntranslatedString(), 'entities') == TRUE) {
              // Get the original args to pass into the new message
              $original_args = $error_val->getArguments();
              // Re-construct the error
              $error_val->__construct("There are no users matching the name %value", $original_args);
            }
          }
        }
      }
    }

Espero que isto ajude!

Tyler Fahey
fonte