Как проверить максимальный размер публикации в пользовательской форме
У меня есть собственный модуль с несколькими управляемыми загрузками файлов.
$form['attachments'] = [
'#type' => 'managed_file',
'#multiple' => true,
'#upload_validators' => [
'file_validate_extensions' => ['jpg docx pdf xlsx jpeg png gif'],
'file_validate_size' => [10485760],
],
];
При загрузке одного файла размером более 10 МБ он выдает через AJAX правильную ошибку, заключающуюся в том, что размер файла не может превышать 10 МБ. Это работает из коробки.
Как я могу ограничить общий МБ для всех файлов, которые могут быть загружены через эту форму?
Например: 3 файла по 3 МБ = штраф 4 файла по 3 МБ = ошибка.
Мне удалось показать сообщение, когда это произойдет
public function validateForm(array &$form, FormStateInterface $form_state) {
$max_size = 10485760;
$total_size = 0;
$triggered_element = $form_state->getTriggeringElement();
if($triggered_element['#name'] == 'attachments_upload_button') {
$fids = (array) $form_state->getValue('attachments', []);
if(!empty($fids)) {
$files = File::loadMultiple($fids);
foreach ($files as $key => $uploadedFile) {
$total_size += $uploadedFile->getSize();
if($total_size > $max_size) {
$form_state->setErrorByName('attachments', $this->t('The total maximum size of your file sizes can not be more than 10MB.'));
$form_state->set('attachments',array_pop($fids));
return;
}
}
}
}
}
Но я не могу удалить последний загруженный файл. Он все еще там и отправляется при отправке формы. Являясь частью сообщения, код не препятствует отправке формы.
Я хочу, чтобы последний отправленный файл, в котором общее количество всех файлов> 10M, был удален из form_state, а также из папки сервера tmp. И в идеале через AJAX без потери ввода полей.
Я не могу найти решение. Заранее спасибо.
Как я могу добиться этого с помощью ajax.