Добавление возможности прикреплять файлы к форме

23 Июля 2020 15:28

Делаем возможность прикреплять файлы в форму, которые отправятся вместе с письмом.

Здесь рассмотрен вариант, подразумеваеющий, что уже есть рабочая форма на базе FormIt(FormIt + AjaxForm), Но нужно добавить только возможность добавления файлов.

1. Добавляем аттрибут enctype в тег формы.

<form action="" method="post" class="form_class" enctype="multipart/form-data">

2. Добавляем поля для формы.

Один файл:

<div class="form-group">
  <label for="upload">Прикрепить файл</label>
  <input type="file" name="upload">
  <p class="error_upload"></p>
</div>

Несколько файлов:

<div class="form-group">
  <label for="uploads">Прикрепить файлы</label>
  <input type="file" name="uploads[]">
  <input type="file" name="uploads[]">
  <input type="file" name="uploads[]">
  <p class="error_uploads"></p>
</div>
<div class="form-group">
  <label for="files">Прикрепить файлы</label>
  <input type="file" name="files[]" multiple="multiple">
  <p class="error_files"></p>
</div>

На этом этапе к письму уже будут прикладываться 1 или несколько файлов, в зависимости от реализации. Но если нужно проводить проверки по расширениям, например, то нужно добавить валидатор. Как правило, это сниппет, имя которого будет передано в параметре customValidators для FormIt (AjaxForm).

3. Добавление сниппета-валидатора

Для одного файла:

<?php
// инициализируем переменную output, отвечающую за результат работы валидатора, со значением true
$output = true;
// разрешённые расширения файлов
$allowedExt = array('jpg','png');
// максимальный размер файла (512 Кбайт)
$maxFileSize = 512 * 1024;
// имя файла
$fileName = basename( $_FILES[$key]['name'] );
// размер
$fileSize = filesize( $_FILES[$key]['tmp_name'] );
// расширение файла
$fileExt = mb_strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
// если имя файла не пустое
if ($fileName != '') {
  if(!in_array($fileExt, $allowedExt)) {
    // файл имеет недопустимый тип
    $errorMsg = 'Файл ' . $fileName . ' имеет не разрешённый тип.';
    $validator->addError($key, $errorMsg);
    $output = false; // возвращаем false
  }
  if($fileSize > $maxFileSize) {
    // файл имеет размер больше максимального
    $errorMsg = 'Размер файла '. $fileName .' превышает 512 Кбайт.';
    $validator->addError($key,$errorMsg);
    $output = false; // возвращаем false
  }
}
return $output;

Для нескольких файлов:

<?php
// инициализируем переменную output, отвечающую за результат работы хука, со значением true
$output = true;
// разрешённые расширения файлов
$allowedExt = array('jpg','png');
// максимальный размер файла (512 Кбайт)
$maxFileSize = 512 * 1024;
// если ассоциатианый массив $_FILES[$keys] существует, то
if(isset($_FILES[$key]["error"])) {
  // переберём все файлы (изображения)
  foreach ($_FILES[$key]["error"] as $fkey => $error) {
    // если ошибок не возникло, т.е. файл был успешно загружен на сервер, то...
    if ($error == UPLOAD_ERR_OK) {
      // имя файла
      $fileName = basename($_FILES[$key]['name'][$fkey]);
      // расширение файла
      $fileExt = mb_strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
      // размер файла
      $fileSize = filesize($_FILES[$key]['tmp_name'][$fkey]);
      // проверка расширения файла
      if(!in_array($fileExt, $allowedExt)) {
        // файл имеет недопустимый тип
        $errorMsg = 'Файл ' . $fileName . ' имеет не разрешённый тип.';
        $validator->addError($key, $errorMsg);
        $output = false; // возвращаем false
        break;
      }
      if($fileSize > $maxFileSize) {
        // файл имеет размер больше максимального
        $errorMsg = 'Файл '. $fileName .' имеет не разрешённый размер.';
        $validator->addError($key,$errorMsg);
        $output = false; // возвращаем false
        break;
      }
    } else {
      // произошла ошибка при загрузке файла на сервер
      $errorMsg = 'Произошла ошибка при загрузке файла ' . $fileName .' на сервер.';
      $validator->addError($key,$errorMsg);
      $output = false; // возвращаем false
      break;
    }
  }
}
return $output;

4. Вызов сниппета

Материал взят отсюда - https://itchief.ru/lessons/modx-revo/modx-formit-email-with-attachment