Como adiciono um manipulador de validação personalizado a um formulário existente (ou campo de formulário) no Drupal 8?
Eu tenho um formulário que não criei. Quero adicionar minhas próprias regras de validação em alguns campos quando o formulário é enviado.
Para o Drupal 7, validação personalizada de um formulário? explica implementar hook_form_alter()
e, em seguida, adicione seu manipulador de validação] [1] à $form['#validate']
matriz, mas no Drupal 8 os formulários são classes. A validação é feita através do validateForm()
método e não sei como conectar meu código a isso.
Respostas:
A
#validate
propriedade ainda é usada no Drupal 8. (Com a solução da Adi, você substituirá o validador existente)Se você deseja adicionar seu validador personalizado além do padrão, precisará adicionar algo como isto em hook_form_FORM_ID_alter (ou similar):
fonte
#validate
(seu link), você não deve usá-lo$form_state
como uma matriz (maneira D7), mas como um objeto implementadoFormStateInterface
(maneira D8). Em outras palavras, o código no seu validador personalizado deve ser análogo ao código encontrado em umvalidateForm()
método original .Berdir deu a resposta correta, que uma restrição é a maneira correta de adicionar validação a um campo no Drupal 8. Aqui está um exemplo.
No exemplo abaixo, trabalharei com um nó do tipo
podcast
, que possui o campo de valor únicofield_podcast_duration
. O valor desse campo precisa ser formatado como HH: MM: SS (horas, minutos e segundos).Para criar uma restrição, duas classes precisam ser adicionadas. O primeiro é a definição de restrição e o segundo é o validador de restrição. Ambos são plugins, no espaço de nomes de
Drupal\[MODULENAME]\Plugin\Validation\Constraint
.Primeiro, a definição de restrição. Observe que o ID do plug-in é fornecido como 'PodcastDuration', na anotação (comentário) da classe. Isso será usado mais adiante.
Em seguida, precisamos fornecer o validador de restrição. Este nome desta classe será o nome da classe acima, com
Validator
anexado a ele:Finalmente, nós precisamos dizer Drupal para usar nosso restrição sobre
field_podcast_duration
opodcast
tipo de nó. Fazemos isso emhook_entity_bundle_field_info_alter()
:fonte
$item = $items->first();
e retorne NULL se não houver nada; caso contrário, você receberá um erro fatal ao editar o campo: TypeError: o argumento 2 passado para Drupal \ Component \ Utility \ NestedArray :: getValue () deve ser do tipo array, nulo fornecido, chamado em /data/app/core/lib/Drupal/Core/Field/WidgetBase.php na linha 407 em Drupal \ Component \ Utility \ NestedArray :: getValue () (linha 69 do core / lib / Drupal / Component /Utility/NestedArray.php).A maneira correta de fazer isso para uma entidade de conteúdo como o nó é registrá-lo como uma restrição.
Veja
forum_entity_bundle_field_info_alter()
e o correspondente?ForumLeaf
restrição de validação (observe que são necessárias duas classes).Isso é um pouco mais complicado no começo, mas a vantagem é que ele está integrado à API de validação, portanto sua validação não se limita ao sistema de formulários, mas pode, por exemplo, também trabalhar com os nós enviados pela API REST.
fonte
hook_entity_bundle_field_info_alter()
(como descrito aqui ), mas nunca funcionou ... Parece haver um problema documentado com esse gancho: drupal.org/node/2346347 .Quero acrescentar um pouco mais de luz sobre esse assunto. A adição da validação é exatamente a mesma de antes: em hook_form_alter:
O uso do objeto de valores dentro do $ form_state na função validate é um pouco diferente. por exemplo:
Portanto, não com um acesso direto ao objeto de variáveis privadas, mas com uma função getter.
para obter mais informações, você pode ver um exemplo completo no meu github: https://github.com/flesheater/drupal8_modules_experiments/blob/master/webham_formvalidation/webham_formvalidation.module
Felicidades!
fonte
É muito parecido com o D7. Um exemplo completo:
mymodule.module :
fonte
hook_form_FORM_ID_alter
precisa do ID do formulário. Você pode ter a função de validação personalizada como desejar. Além disso, siga o guia da API aqui para obter os parâmetros adequados.Em complemento dessas boas respostas, eu acrescentaria:
É como chamar um método de classe distante para uma validação de formulário. Eu acho que é melhor do que chamar uma função acima no arquivo de módulo, como no exemplo dado.
fonte
você pode usar o módulo Validação do cliente . Mais alguns detalhes sobre ele (na página do projeto):
fonte