Comment utiliser #element_validate et #value_callback dans Drupal 8

9

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 à l'intérieur d'un <div class="preview"></div>avec un champ pour nommer chaque image.

Exemple: entrez la description de l'image ici (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.

Axel Briche
la source

Réponses:

9

Pour utiliser une méthode d'instance pour #element_validate/ #value_callbacketc, 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 adepte des normes, devrait vraiment être nommé fileGenericSettingsMaxFilesize) publicpour s'adapter, car votre classe n'invoquera pas la méthode.

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

Clive
la source
4
S'il s'agit d'une méthode sur l'objet formulaire, alors le tableau (':: file_generic_settings_max_filesize') peut être utilisé, voir drupal.org/node/2325875
Berdir
J'ai simplement ajouté plus de détails à l'exemple dans l'avis de modification et ajouté le problème de documentation lié à celui-ci.
colan