it-swarm.com.de

Verwendung von #element_validate und #value_callback in Drupal 8

Ich habe die offizielle Formular-API-Dokumentation befolgt, aber dieser Code funktioniert bei mir nicht auf 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.');
  }

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 ein <div class="preview"></div> Mit einem Feld für den Namen der einzelnen Bilder ein.

Beispiel: enter image description here (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.

9
Axel Briche

Um eine Instanzmethode für #element_validate/#value_callback Usw. zu verwenden, benötigen Sie ein aufrufbar . 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 file_generic_settings_max_filesize() (was, wenn Sie ein Stickler für Standards sind, wirklich fileGenericSettingsMaxFilesize heißen sollte) als public markieren, um es zu berücksichtigen, da Ihre Klasse dies nicht tut die Methode aufrufen.

Die Dokumentation hierfür lautet laufend , der Änderungshinweis lautet hier .

9
Clive