You are here

public function PhotosUploadForm::submitForm in Album Photos 8.4

Same name and namespace in other branches
  1. 8.5 src/Form/PhotosUploadForm.php \Drupal\photos\Form\PhotosUploadForm::submitForm()
  2. 6.0.x src/Form/PhotosUploadForm.php \Drupal\photos\Form\PhotosUploadForm::submitForm()

Form submission handler.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Overrides FormInterface::submitForm

File

src/Form/PhotosUploadForm.php, line 211

Class

PhotosUploadForm
Defines a form to upload photos to this site.

Namespace

Drupal\photos\Form

Code

public function submitForm(array &$form, FormStateInterface $form_state) {
  $user = $this
    ->currentUser();
  $config = $this
    ->config('photos.settings');
  $validators = [
    'file_validate_is_image' => [],
  ];
  $count = 0;
  $nid = $form_state
    ->getValue('nid');
  $album_uid = $this->connection
    ->query("SELECT uid FROM {node_field_data} WHERE nid = :nid", [
    ':nid' => $nid,
  ])
    ->fetchField();

  // If photos_access is enabled check viewid.
  $scheme = 'default';
  $album_viewid = 0;
  if ($this->moduleHandler
    ->moduleExists('photos_access')) {
    $node = $this->entityTypeManager
      ->getStorage('node')
      ->load($nid);
    if (isset($node->privacy) && isset($node->privacy['viewid'])) {
      $album_viewid = $node->privacy['viewid'];
      if ($album_viewid > 0) {

        // Check for private file path.
        if (PrivateStream::basePath()) {
          $scheme = 'private';
        }
        else {

          // Set warning message.
          \Drupal::messenger()
            ->addWarning($this
            ->t('Warning: image
              files can still be accessed by visiting the direct URL. For
              better security, ask your website admin to setup a private file
              path.'));
        }
      }
    }
  }
  if (empty($album_uid)) {
    $album_uid = $user
      ->id();
  }
  $account = $this->entityTypeManager
    ->getStorage('user')
    ->load($album_uid);

  // Check if plupload is enabled.
  // @todo check for plupload library?
  if ($config
    ->get('photos_plupload_status')) {
    $plupload_files = $form_state
      ->getValue('plupload');
    foreach ($plupload_files as $uploaded_file) {
      if ($uploaded_file['status'] == 'done') {

        // Check for zip files.
        $ext = mb_substr($uploaded_file['name'], -3);
        if ($ext != 'zip' && $ext != 'ZIP') {

          // Prepare directory.
          $photos_path = PhotosUpload::path($scheme, '', $account);
          $photos_name = PhotosUpload::rename($uploaded_file['name']);
          $file_uri = \Drupal::service('file_system')
            ->getDestinationFilename($photos_path . '/' . $photos_name, FileSystemInterface::EXISTS_RENAME);
          if (\Drupal::service('file_system')
            ->move($uploaded_file['tmppath'], $file_uri)) {
            $path_parts = pathinfo($file_uri);
            $image = $this->imageFactory
              ->get($file_uri);
            if ($path_parts['extension'] && $image
              ->getWidth()) {

              // Create a file entity.
              $file = $this->entityTypeManager
                ->getStorage('file')
                ->create([
                'uri' => $file_uri,
                'uid' => $user
                  ->id(),
                'status' => FILE_STATUS_PERMANENT,
                'pid' => $form_state
                  ->getValue('pid'),
                'nid' => $form_state
                  ->getValue('nid'),
                'filename' => $photos_name,
                'filesize' => $image
                  ->getFileSize(),
                'filemime' => $image
                  ->getMimeType(),
              ]);
              if (PhotosUpload::saveFile($file)) {
                PhotosUpload::saveImage($file);
              }
              $count++;
            }
            else {
              \Drupal::service('file_system')
                ->delete($file_uri);
              $this->logger
                ->notice('Wrong file type');
            }
          }
          else {
            $this->logger
              ->notice('Upload error. Could not move temp file.');
          }
        }
        else {
          if (!$config
            ->get('photos_upzip')) {
            \Drupal::messenger()
              ->addError($this
              ->t('Please set Album
                photos to open zip uploads.'));
          }
          $directory = PhotosUpload::path();
          \Drupal::service('file_system')
            ->prepareDirectory($directory);
          $zip = \Drupal::service('file_system')
            ->getDestinationFilename($directory . '/' . $uploaded_file['name'], FileSystemInterface::EXISTS_RENAME);
          if (\Drupal::service('file_system')
            ->move($uploaded_file['tmppath'], $zip)) {
            $value = new \StdClass();
            $value->pid = $form_state
              ->getValue('pid');
            $value->nid = $form_state
              ->getValue('nid');
            $value->title = $uploaded_file['name'];
            $value->des = '';

            // Unzip it.
            if (!($file_count = PhotosUpload::unzip($zip, $value, $scheme, $account))) {
              \Drupal::messenger()
                ->addError($this
                ->t('Zip upload failed.'));
            }
            else {

              // Update image upload count.
              $count = $count + $file_count;
            }
          }
        }
      }
      else {
        \Drupal::messenger()
          ->addError($this
          ->t('Error uploading some photos.'));
      }
    }
  }
  else {

    // Manual upload form.
    $pid = $form_state
      ->getValue('pid');
    $photos_num = $config
      ->get('photos_num');
    for ($i = 0; $i < $photos_num; ++$i) {
      if (isset($_FILES['files']['name']['images_' . $i]) && $_FILES['files']['name']['images_' . $i]) {
        $ext = mb_substr($_FILES['files']['name']['images_' . $i], -3);
        if ($ext != 'zip' && $ext != 'ZIP') {

          // Prepare directory.
          $photos_path = PhotosUpload::path($scheme, '', $account);
          if ($file = file_save_upload('images_' . $i, $validators, $photos_path, 0)) {

            // Save file to album. Include title and description.
            $file->pid = $pid;
            $file->nid = $form_state
              ->getValue('nid');
            $file->des = $form_state
              ->getValue('des_' . $i);
            $file->title = $form_state
              ->getValue('title_' . $i);
            PhotosUpload::saveImage($file);
            $count++;
          }
        }
        else {

          // Zip upload from manual upload form.
          if (!$config
            ->get('photos_upzip')) {
            \Drupal::messenger()
              ->addError($this
              ->t('Please update settings to allow zip uploads.'));
          }
          else {
            $directory = PhotosUpload::path();
            \Drupal::service('file_system')
              ->prepareDirectory($directory);
            $zip = \Drupal::service('file_system')
              ->getDestinationFilename($directory . '/' . trim(basename($_FILES['files']['name']['images_' . $i])), FileSystemInterface::EXISTS_RENAME);
            if (\Drupal::service('file_system')
              ->move($_FILES['files']['tmp_name']['images_' . $i], $zip)) {
              $value = new \stdClass();
              $value->pid = $pid;
              $value->nid = $form_state
                ->getValue('nid') ? $form_state
                ->getValue('nid') : $form_state
                ->getValue('pid');
              $value->des = $form_state
                ->getValue('des_' . $i);
              $value->title = $form_state
                ->getValue('title_' . $i);
              if (!($file_count = PhotosUpload::unzip($zip, $value, $scheme, $account))) {

                // Upload failed.
              }
              else {
                $count = $count + $file_count;
              }
            }
          }
        }
      }
    }
  }

  // Clear node and album page cache.
  Cache::invalidateTags([
    'node:' . $nid,
    'photos:album:' . $nid,
  ]);
  $message = $this
    ->formatPlural($count, '1 image uploaded.', '@count images uploaded.');
  \Drupal::messenger()
    ->addMessage($message);
}