You are here

public static function ImceFileField::setWidgetValue in IMCE 8

Same name and namespace in other branches
  1. 8.2 src/ImceFileField.php \Drupal\imce\ImceFileField::setWidgetValue()

Sets widget file id values by validating and processing the submitted data.

Runs before processor callbacks.

File

src/ImceFileField.php, line 97

Class

ImceFileField
Defines methods for integrating Imce into file field widgets.

Namespace

Drupal\imce

Code

public static function setWidgetValue($element, &$input, FormStateInterface $form_state) {
  if (empty($input['imce_paths'])) {
    return;
  }
  $paths = $input['imce_paths'];
  $input['imce_paths'] = '';

  // Remove excess data.
  $paths = array_unique(array_filter(explode(':', $paths)));
  if (isset($element['#cardinality']) && $element['#cardinality'] > -1) {
    $paths = array_slice($paths, 0, $element['#cardinality']);
  }

  // Check if paths are accessible by the current user with Imce.
  if (!($paths = Imce::accessFilePaths($paths, \Drupal::currentUser(), $element['#scheme']))) {
    return;
  }

  // Validate paths as file entities.
  $file_usage = \Drupal::service('file.usage');
  $errors = [];
  foreach ($paths as $path) {

    // Get entity by uri.
    $file = Imce::getFileEntity($element['#scheme'] . '://' . $path, TRUE);
    if ($new_errors = file_validate($file, $element['#upload_validators'])) {
      $errors = array_merge($errors, $new_errors);
    }
    else {

      // Save the file record.
      if ($file
        ->isNew()) {
        $file
          ->save();
      }
      if ($fid = $file
        ->id()) {

        // Make sure the file has usage otherwise it will be denied.
        if (!$file_usage
          ->listUsage($file)) {
          $file_usage
            ->add($file, 'imce', 'file', $fid);
        }
        $input['fids'][] = $fid;
      }
    }
  }

  // Set error messages.
  if ($errors) {
    $errors = array_unique($errors);
    if (count($errors) > 1) {
      $errors = [
        '#theme' => 'item_list',
        '#items' => $errors,
      ];
      $message = \Drupal::service('renderer')
        ->render($errors);
    }
    else {
      $message = array_pop($errors);
    }

    // May break the widget flow if set as a form error.
    \Drupal::messenger()
      ->addMessage($message, 'error');
  }
}