Валидация файлов в Tickets
Вопрос собственно очень простой. В Tickets при работе с фронтенда есть поле прикрепеления фото:
<div class="file-upload">
<div class="ticket-form-files">
[[+files]]
</div>
<span class="error"></span>
</div>
не показывает внизу поля случаи, когда фото не прикреплено и отправляет тике с незаполненным фото. Такого быть не должно. Как показывать пользователю уведомление о незаполненности + несоответствии фото, критериям, заданным в настройках Tickets?Комментарии: 8
docs.modx.pro/komponentyi/tickets/snippetyi/ticketform последний параметр validate. Там же есть примеры оформления чанка. А сам валидатор можно взять тут.
проблема в том, что [[+files]] — это не TV -шка
И что? Это input, у него может быть name, а значит его можно записать в validate
'validate' => 'upload:required:customValidator'
я вставляю в вызов:
не реагирует вообще никак
[[!TicketForm?
&allowedFields=`parent,profile-status,name,gender,phone,email,location`
&tplFormCreate=`tickets.form.create.tpl`
&tplFormUpdate=`tickets.form.update.tpl`
&redirectUnpublished=`11`
&redirectDeleted=`11`
&tplTicketEmailBcc=`tpl.Tickets.ticket.email.bcc`
&validate=`
pagetitle:required,
.......
files:required:customValidator`
]]
В саму форму:<form class="well create" enctype="multipart/form-data" method="post" action="" id="ticketForm">
....
<div class="file-upload">
<div class="ticket-form-files">
[[+files]]
</div>
<span class="error"></span>
</div>
и беру снипет для проверки нескольких файлов (массива) с не реагирует вообще никак
Я посмотрел, похоже надо исходники править, в шаблоне нет inout'а он вставляется динамически, значит надо изобретать велосипед, но более простой вариант проверять на фронте. В этом файле assets/components/tickets/js/web/files.js в районе 107 строки написать примерно так
$('.jsFileInput').change(function () {
$('.error_photos').text('');
var input = $(this)[0];
if (input.files && input.files[0]) {
if (input.files[0].type.match('image.*')) {
var reader = new FileReader();
reader.onload = function (e) {
$('.jsAvatar').removeClass('no-avatar').css('background-image', 'url("' + e.target.result + '"');
}
reader.readAsDataURL(input.files[0]);
} else {
$('.error_photos').text('Изображение должно быть одного из следующих форматов: jpg,png,jpeg');
}
} else {
console.log('хьюстон у нас проблема');
}
});
если упроститься только до проверки подгруженности определенного количества файлов в поле (поле все-таки мультизагрузочное), что нужно для этого в files.js поправить?
Есть интересный пример сниппета, который проверяет количество файлов (до 3х):
Есть интересный пример сниппета, который проверяет количество файлов (до 3х):
<?php
$output = true;
$count_files = 0; // счётчик файлов
$errorMsg = ''; // сообщение об ошибке
$allowedExt = array('jpg','png'); // разрешённые расширения файлов
$maxFileSize = 512 * 1024; // максимальный размер файла (512 Кбайт)
if (isset($_FILES[$key])) {
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)) {
if (!empty($errorMsg)) {
$errorMsg .= '; ';
}
$errorMsg .= 'Файл ' . $fileName . ' имеет не разрешённый тип.';
continue;
}
if ($fileSize > $maxFileSize) {
if (!empty($errorMsg)) {
$errorMsg .= '; ';
}
$errorMsg .= 'Файл '. $fileName .' имеет не разрешённый размер.';
continue;
}
$count_files++; // увеличиваем на 1
} else {
if (!empty($errorMsg)) {
$errorMsg .= '; ';
}
$errorMsg .= 'Произошла ошибка при загрузке файла ' . $fileName .' на сервер.';
}
}
}
if ($count_files < 3) {
if (!empty($errorMsg)) {
$errorMsg .= '; ';
}
$errorMsg .= 'К сообщению необходимо прикрепить 3 файла!';
}
if (!empty($errorMsg)) {
$validator->addError($key,$errorMsg);
$output = false; // возвращаем false
}
return $output;
но в сочетании files:required:snippet он ни фига не работает
и неужели никто, пользуясь тикетами, никогда не озадачивался вопросом подгружены ли фото в поле или нет? и нет стандартных способов проверки этого всего?
Я пользуюсь, и скинул скрипт, которым в последнем проекте проверял файлы, но правда не для тикетов, для них мне обязательно нужен только один файл и я его загружаю в отдельное ТВ и для него я сделал отдельное поле на фронте, куда вставляю один из загруженных пользователем файлов и которое проверяю через validate. Вы можете сделать так же, т.е. если нужно чтобы был загружен как минимум один файл сделайте отдельный input и в файле files.js при успешной загрузке вставляйте значение в дополнительный input, и этот input проверяйте в параметре validate.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.