web-dev-qa-db-fra.com

Comment utiliser #element_validate et #value_callback dans Drupal 8

J'ai suivi la documentation officielle de l'API Form, mais ce code ne fonctionne pas pour moi sur 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.');
  }

J'ai essayé de remplacer form_error () par $ form_state-> setErrorByName () mais même problème, le fichier est téléchargé et la validation n'est pas appelée.

Avez-vous une solution s'il vous plaît? La documentation de #element_validate est obsolète?

Mon objectif: télécharger beaucoup d'images, utiliser une validation personnalisée et insérer toutes les vignettes d'images dans un <div class="preview"></div> avec un champ pour nommer chaque image.

Exemple: enter image description here (Après le téléchargement, affichez les vignettes et le champ de titre pour nommer toutes les images)

Sinon, après le téléchargement, pour afficher les vignettes et autres champs (titre et description) pour chaque image, je dois utiliser #value_callback, #process, #attached (gérer le champ/affichage avec js après le téléchargement) ou une autre option s'il vous plaît?

Merci.

9
Axel Briche

Pour utiliser une méthode d'instance pour #element_validate/#value_callback Etc. vous avez besoin d'un appelable . par exemple.

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

Vous devrez marquer file_generic_settings_max_filesize() (qui, si vous étiez un gestionnaire de standards, devrait vraiment être nommé fileGenericSettingsMaxFilesize) comme public pour s'adapter, car votre classe ne le fera pas invoquer la méthode.

La documentation pour cela est en cours , l'avis de modification est ici .

9
Clive