Verwendung von #element_validate und #value_callback in Drupal 8

9

Ich habe die offizielle Formular-API-Dokumentation befolgt, aber dieser Code funktioniert bei Drupal 8 nicht für mich:

  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.');
  }

Ich habe versucht, form_error () durch $ form_state-> setErrorByName () zu ersetzen, aber das gleiche Problem, die Datei wird hochgeladen und die Validierung wird nicht aufgerufen.

Haben Sie bitte eine Lösung? Die Dokumentation von #element_validate ist veraltet?

Mein Ziel: Laden Sie viele Bilder hoch, verwenden Sie eine benutzerdefinierte Validierung und fügen Sie alle Miniaturbilder aller Bilder in <div class="preview"></div>ein Feld mit einem Namen für die einzelnen Bilder ein.

Beispiel: Geben Sie hier die Bildbeschreibung ein (Zeigen Sie nach dem Hochladen Miniaturansichten und das Titelfeld an, um alle Bilder zu benennen.)

Andernfalls muss ich nach dem Hochladen für die Anzeige von Miniaturansichten und anderen Feldern (Titel und Beschreibung) für jedes Bild #value_callback, #process, #attached (Feld / Anzeige mit js nach dem Hochladen verwalten) oder eine andere Option verwenden.

Vielen Dank.

Axel Briche
quelle

Antworten:

9

Um eine Instanzmethode für #element_validate/ #value_callbacketc zu verwenden, benötigen Sie eine aufrufbare . z.B

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

Sie müssen markieren file_generic_settings_max_filesize()(was, wenn Sie ein Verfechter von Standards sind, wirklich benannt werden sollte fileGenericSettingsMaxFilesize) public, um dies zu berücksichtigen, da Ihre Klasse die Methode nicht aufruft.

Die Dokumentation hierfür ist noch nicht abgeschlossen . Die Änderungsmitteilung finden Sie hier .

Clive
quelle
4
Wenn es sich um eine Methode für das Formularobjekt handelt, kann das Array (':: file_generic_settings_max_filesize') verwendet werden, siehe drupal.org/node/2325875
Berdir,
Ich habe dem Beispiel in der Änderungsmitteilung nur weitere Details hinzugefügt und das damit verbundene Dokumentationsproblem hinzugefügt.
Colan