Cómo usar #element_validate y #value_callback en Drupal 8

9

He seguido la documentación oficial de Form API, pero este código no me funciona en 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.');
  }

Intenté reubicar form_error () por $ form_state-> setErrorByName () pero el mismo problema, el archivo se carga y no se llama a la validación.

¿Tienes una solución por favor? ¿La documentación de #element_validate está desactualizada?

Mi objetivo: cargar muchas imágenes, usar una validación personalizada e insertar todas las imágenes en miniatura dentro de <div class="preview"></div>un campo con un nombre para cada imagen.

Ejemplo: ingrese la descripción de la imagen aquí (Después de cargar, muestre las miniaturas y el campo de título para nombrar todas las imágenes)

De lo contrario, después de cargar, para mostrar Miniaturas y otro campo (título y descripción) para cada imagen, necesito usar #value_callback, #process, #attached (administrar campo / pantalla con js después de cargar) u otra opción, por favor?

Gracias.

Axel Briche
fuente

Respuestas:

9

Para usar un método de instancia para #element_validate/ #value_callbacketc necesita un invocable . p.ej

$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'),
  ),
);

Tendrá que marcar file_generic_settings_max_filesize()(que si fuera estricto con los estándares realmente debería nombrarse fileGenericSettingsMaxFilesize) como publicpara acomodar, ya que su clase no invocará el método.

La documentación para esto está en curso , el aviso de cambio está aquí .

Clive
fuente
44
Si se trata de un método en el objeto de formulario, se puede usar array (':: file_generic_settings_max_filesize'), consulte drupal.org/node/2325875
Berdir
Acabo de agregar más detalles al ejemplo en el aviso de cambio, y agregué el problema de documentación relacionado con él.
colan