Как использовать #element_validate и #value_callback в Drupal 8

9

Я следовал официальной Документации API форм, но этот код не работает для меня в 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.');
  }

Я пытаюсь переопределить form_error () с помощью $ form_state-> setErrorByName (), но та же проблема, файл загружен и проверка не вызывается.

У вас есть решение, пожалуйста? Документация #element_validate устарела?

Моя цель: загрузить много изображений, использовать пользовательскую проверку и вставить все эскизы изображений <div class="preview"></div>в поле с полем для имени каждого изображения.

Пример: введите описание изображения здесь (После загрузки отобразите миниатюры и поле заголовка для имени всех изображений)

Иначе, после загрузки, для отображения миниатюр и других полей (заголовок и описание) для каждого изображения, мне нужно использовать #value_callback, #process, #attached (управлять полем / отображением с помощью js после загрузки) или другой вариант, пожалуйста?

Спасибо.

Аксель Брише
источник

Ответы:

9

Чтобы использовать метод экземпляра для #element_validate/ #value_callbacketc, вам нужен вызываемый объект . например

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

Вам нужно будет пометить file_generic_settings_max_filesize()(что, если вы были приверженцем стандартов, должно быть действительно названо fileGenericSettingsMaxFilesize), publicчтобы приспособиться, поскольку ваш класс не будет вызывать метод.

Документация для этого продолжается , уведомление об изменении здесь .

Клайв
источник
4
Если это метод для объекта формы, тогда можно использовать массив (':: file_generic_settings_max_filesize'), см. Drupal.org/node/2325875
Бердир,
Я просто добавил подробности к примеру в уведомлении об изменении и добавил проблему с документацией, связанную с ней.
Colan