You are here

public static function WebformManagedFileBase::validateManagedFileLimit in Webform 6.x

Same name and namespace in other branches
  1. 8.5 src/Plugin/WebformElement/WebformManagedFileBase.php \Drupal\webform\Plugin\WebformElement\WebformManagedFileBase::validateManagedFileLimit()

Form API callback. Validate file upload limit.

See also

\Drupal\webform\WebformSubmissionForm::validateForm

File

src/Plugin/WebformElement/WebformManagedFileBase.php, line 886

Class

WebformManagedFileBase
Provides a base class webform 'managed_file' elements.

Namespace

Drupal\webform\Plugin\WebformElement

Code

public static function validateManagedFileLimit(array &$element, FormStateInterface $form_state, &$complete_form) {

  // Set empty files to NULL and exit.
  if (empty($element['#files'])) {
    return;
  }

  // Only validate file limits for ajax uploads.
  $wrapper_format = \Drupal::request()
    ->get(MainContentViewSubscriber::WRAPPER_FORMAT);
  if (!$wrapper_format || !in_array($wrapper_format, [
    'drupal_ajax',
    'drupal_modal',
    'drupal_dialog',
  ])) {
    return;
  }
  $fids = array_keys($element['#files']);

  // Get WebformSubmissionForm object.
  $form_object = $form_state
    ->getFormObject();
  if (!$form_object instanceof WebformSubmissionForm) {
    return;
  }

  // Skip validation when removing file upload.
  $trigger_element = $form_state
    ->getTriggeringElement();
  $op = (string) $trigger_element['#value'];
  if (in_array($op, [
    (string) t('Remove'),
    (string) t('Remove selected'),
  ])) {
    return;
  }

  // Get file upload limit.

  /** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
  $webform_submission = $form_object
    ->getEntity();
  $file_limit = $webform_submission
    ->getWebform()
    ->getSetting('form_file_limit') ?: \Drupal::config('webform.settings')
    ->get('settings.default_form_file_limit') ?: '';
  $file_limit = Bytes::toInt($file_limit);

  // Track file size across all file upload elements.
  static $total_file_size = 0;

  /** @var \Drupal\file\FileInterface[] $files */
  $files = File::loadMultiple($fids);
  foreach ($files as $file) {
    $total_file_size += (int) $file
      ->getSize();
  }

  // If has access and total file size exceeds file limit then display error.
  if (Element::isVisibleElement($element) && $total_file_size > $file_limit) {
    $t_args = [
      '%quota' => format_size($file_limit),
    ];
    $message = t("This form's file upload quota of %quota has been exceeded. Please remove some files.", $t_args);
    $form_state
      ->setError($element, $message);
  }
}