Como usar #element_validate e #value_callback no Drupal 8

9

Eu segui a documentação oficial da API de formulários, mas esse código não funciona para mim no Drupal 8:

  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['upload'] = array(
      '#title' => t('Upload Images'),
      '#type' => 'managed_file',
      '#upload_location' => 'public://image_example_images/',
      '#element_validate' => array('file_generic_settings_max_filesize'),
    );
    return $form;
  }

  private function file_generic_settings_max_filesize($element, &$form_state) {
    form_error($element, 'This is an error.');
  }

Eu estou tentando substituir form_error () por $ form_state-> setErrorByName () mas mesmo problema, o arquivo é carregado e a validação não é chamada.

Você tem uma solução, por favor? A documentação de #element_validate está desatualizada?

Meu objetivo: Carregar muitas imagens, usar uma validação personalizada e inserir todas as miniaturas de imagens dentro de um <div class="preview"></div>com um campo para nomear cada imagem.

Exemplo: insira a descrição da imagem aqui (após o upload, exiba miniaturas e campo de título para o nome de todas as imagens)

Caso contrário, após o upload, para exibir Miniaturas e outro campo (título e descrição) para cada imagem, preciso usar #value_callback, #process, #attached (gerenciar campo / exibição com js após o upload) ou outra opção, por favor?

Obrigado.

Axel Briche
fonte

Respostas:

9

Para usar um método de instância para #element_validate/ #value_callbacketc, você precisa de uma chamada . por exemplo

$form['upload'] = array(
  '#title' => t('Upload Images'),
  '#type' => 'managed_file',
  '#upload_location' => 'public://image_example_images/',
  '#element_validate' => array(
    array($this, 'file_generic_settings_max_filesize'),
  ),
);

Você precisará marcar file_generic_settings_max_filesize()(que, se você fosse um defensor dos padrões, deveria realmente ser nomeado fileGenericSettingsMaxFilesize) como publicacomodar, pois sua classe não estará invocando o método.

A documentação para isso está em andamento , o aviso de alteração está aqui .

Clive
fonte
4
Se é um método no objeto forma, uma matriz, em seguida, ( ':: file_generic_settings_max_filesize') pode ser utilizada, ver drupal.org/node/2325875
Berdir
Acabei de adicionar mais detalhes ao exemplo no aviso de alteração e adicionei o problema de documentação relacionado a ele.
colan 8/09/16