Делаем возможность прикреплять файлы в форму, которые отправятся вместе с письмом.
Здесь рассмотрен вариант, подразумеваеющий, что уже есть рабочая форма на базе 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