Вопрос или проблема
У меня есть страница с кастомной формой обратной связи, в которую я пытаюсь добавить поле загрузки, которое проверяет размер и тип файла. До добавления проверки всё работало.
<?php
/* Template Name: Contact-Page-with-upload
*
* Кастомная страница обратной связи на PHP. Добавьте или измените поля формы на строке 28 и в самой форме.
* jQuery используется для добавления/удаления класса ошибки Bootstrap для недействительных полей.
*/
/**
* Получение класса ошибки
*
* @return string;
*/
function getErrorClass($failedKeys, $key)
{
if(isset($failedKeys) && is_array($failedKeys) && in_array($key, $failedKeys))
{
return 'has-error';
}
return '';
}
if(isset($_POST) && !empty($_POST))
{
// Новая строка
$nL = "<br />";
// Функция генерации ответа
$response = "";
// Функция для генерации ответа
function my_contact_form_generate_response($type, $message)
{
global $response;
if($type == "success") $response = "<div class="success alert alert-success" role="alert" id='success-message'>{$message} <i class="glyphicon glyphicon-thumbs-up"></i></div>";
else $response = "<div class="error alert alert-danger" role="alert" id='error-message'>{$message} <i class="glyphicon glyphicon-thumbs-down"></i> </div>";
}
// Сообщения об ответах
$missing_content = "Пожалуйста, заполните всю информацию.";
$email_invalid = "Адрес электронной почты недействителен.";
$message_unsent = "Сообщение не отправлено. Попробуйте еще раз.";
$message_sent = "Спасибо! Ваше сообщение отправлено.";
// Определите используемые поля, заголовок => имя поля
// Это может быть использовано для добавления полей в автоматическую проверку ниже.
$userVariables = [
'Имя' => 'first_name',
'Фамилия' => 'last_name',
'Телефон' => 'phone',
'Электронная почта' => 'email',
'Комментарий' => 'comment'
];
// Инициализация переменных для неудачных и успешных проверенных полей
$failedFields = [];
$validFields = [];
$failedKeys = [];
// Перебор каждой переменной, определенной выше, и проверка её допустимости как ненулевой строки.
// Если успешно, добавьте это в массив сообщения и удалите все теги для безопасности, и обрежьте пробелы
if(!empty($_POST))
{
foreach($userVariables as $title => $userField)
{
// Если нашему полю не удалось пройти проверку, мы добавляем его в массив неудачных полей
if(!isset($_POST[$userField]) || !is_string($_POST[$userField]) || $_POST[$userField] == '')
{
$failedFields[] = $title;
$failedKeys[] = $userField;
}
// Если успешно, добавьте это в массив успешных полей и обрежьте/очистите содержимое
else
{
$validFields[$title] = trim(strip_tags(($_POST[$userField])));
}
}
}
// Если у нас больше 0 неудачных полей, мы отправим ответ об ошибке на форму
if(!empty($failedFields))
{
// Соедините сообщение с неудачными полями в сообщении
$failureMessage = "Следующие поля обязательны: " . implode(', ', $failedFields);
my_contact_form_generate_response("error", $failureMessage);
}
// Создание HTML сообщения
$message="<html><head>";
// определение используемого шрифта Google в сообщении
$message .='<style>@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,600");</style>';
$message .='</head>';
$message .='<body style="font-family:Open Sans, sans-serif; font-weight:400;">';
$message .= "<h3>Сообщение из формы обратной связи на сайте" .get_bloginfo('name') ."</h3>";
$message .= '<table rules="all" style="border-color: #666;" cellpadding="10">';
// Если у нас есть проверенные поля, перечисленные выше, мы соединим сообщение для тела электронной почты, затем закроем теги таблицы, тела и html
if(!empty($validFields))
{
foreach($validFields as $title => $value)
{
$message .= "<tr style="background: #eee;"><td style="width:200px; font-family: Open Sans, sans-serif; margin: 0px; padding:8px; font-weight: 600;">" . $title . ":</td><td style="font-family: Open Sans, sans-serif; margin: 0px; padding:8px; font-weight: 400;">" . $value . "</td></tr>";
}
}
$message .= '</table></body></html>';
// конец сообщения
/**
*
* Обработка вложения файла
*
*/
if ( ! function_exists( 'wp_handle_upload' ) )
{
require_once( ABSPATH . 'wp-admin/includes/file.php' );
}
$uploadedFile = false;
$movefile = false;
if(isset($_FILES['attachmentFile']))
{
$uploadedFile = $_FILES['attachmentFile'];
// Получение информации о загруженном файле
$name_of_uploaded_file = basename($uploadedFile['name']);
// получение расширения загруженного файла
$type_of_uploaded_file = substr($name_of_uploaded_file, strrpos($name_of_uploaded_file, '.') + 1);
$size_of_uploaded_file = $uploadedFile["size"] / 1024; // размер в КБ
// Настройки
$max_allowed_file_size = 2000; // размер в КБ
$allowed_extensions = array("jpg", "jpeg", "png", "pdf");
$upload_overrides = array( 'test_form' => false );
// Проверки
if($size_of_uploaded_file > $max_allowed_file_size )
{
$failedKeys[] = 'attachmentFile';
my_contact_form_generate_response("error", "Размер файла должен быть менее $max_allowed_file_size");
}
//------ Проверка расширения файла
$allowed_ext = false;
for($i = 0; $i <sizeof($allowed_extensions); $i++)
{
if(strcasecmp($allowed_extensions[$i], $type_of_uploaded_file) == 0)
{
$allowed_ext = true;
}
}
if(!$allowed_ext)
{
$failedKeys[] = 'attachmentFile';
my_contact_form_generate_response("error", "Загруженный файл не поддерживается. Поддерживаются только следующие типы файлов: ".implode(', ',$allowed_extensions));
}
$movefile = wp_handle_upload($uploadedfile, $upload_overrides);
var_dump($movefile); die();
if($movefile && ! isset( $movefile['error'] ) ) {
$movefile['url'];
}
}
// Переменные почтовой рассылки
$to = get_option('admin_email');
$subject = "Сообщение из формы обратной связи на ".get_bloginfo('name');
$headers="From: ". $email . "\r\n" . 'Reply-To: ' . $email . "\r\n";
$attachments = $movefile && isset($movefile['file']) ? array($movefile['file']) : false;
if(empty($failedFields) && isset($_POST['gotcha']) && $_POST['gotcha'] == '')
{
// Добавление поддержки HTML-типа ответа к электронной почте
add_filter('wp_mail_content_type',create_function('', 'return "text/html"; '));
// Создание сообщения и отправка, возвращение переменной успеха
$sent = wp_mail($to, $subject, $message, $headers, isset($attachments) && is_array($attachments) && !empty($attachments) ? $attachments : []);
// Если успешно, вернуть успех на форму
if($sent)
{
my_contact_form_generate_response("success", $message_sent);
}
// В случае неудачи, вернуть ответ об ошибке на форму
else
{
my_contact_form_generate_response("error", $message_unsent);
unlink( $movefile['file'] );
}
}
else if($_POST['submitted'] || !empty($failedFields))
{
my_contact_form_generate_response("error", $failureMessage);
}
}
?>
<!-- Конец логики формы -->
<?php get_header(); ?>
<div id="main" class="clearfix wow fadeIn" role="main">
<div id="content">
<div class="container">
<div class="row">
<div class="col-sm-12">
<h1 class="page-title">Свяжитесь с нами</h1>
<div id="respond">
<?php echo $response; ?>
<form class="form-horizontal well" action="<?php the_permalink(); ?>" method="post" id="contact_form" enctype="multipart/form-data">
<fieldset>
<legend>У вас есть вопросы, вы заинтересованы в продукте или хотите узнать о вариантах доставки?</legend>
<p>Пожалуйста, заполните контактную форму, и мы свяжемся с вами как можно скорее!</p>
<div class="col-sm-6">
<!-- Текстовый ввод -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'first_name'); ?>">
<label class="control-label">Имя</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
<input name="first_name" placeholder="Имя" class="form-control" type="text" value="<?php echo esc_attr($_POST['first_name']); ?>" required>
</div>
</div>
<!-- Текстовый ввод -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'last_name'); ?>">
<label class="control-label">Фамилия</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
<input name="last_name" placeholder="Фамилия" class="form-control" type="text" value="<?php echo esc_attr($_POST['last_name']); ?>" required>
</div>
</div>
</div><!--/.col-->
<div class="col-sm-6">
<!-- Текстовый ввод -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'email'); ?>">
<label class="control-label">Электронная почта</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
<input name="email" placeholder="Адрес электронной почты" class="form-control" type="email" value="<?php echo esc_attr($_POST['email']); ?>" required>
</div>
</div>
<!-- Текстовый ввод -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'phone'); ?>">
<label class="control-label">Телефон</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-earphone"></i></span>
<input name="phone" placeholder="(855)555-1212" class="form-control" type="text" value="<?php echo esc_attr($_POST['phone']); ?>" required>
</div>
</div>
</div><!--/.col-->
<div class="col-sm-12">
<!-- Текстовая область -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'comment'); ?>">
<label class="control-label">Ваше сообщение</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
<textarea class="form-control" name="comment" required><?php echo esc_textarea($_POST['comment']); ?></textarea>
</div>
</div>
<div class="form-group <?php echo getErrorClass($failedKeys, 'file'); ?>">
<label class="control-label">Прикрепить файл</label>
<input type="file" name="attachmentFile">
</div><!-- /.form-group -->
<!-- Поле Anti-Spam -->
<div class="form-group hidden" id="gotcha">
<label class="control-label">Оставьте это поле пустым</label>
<div class="input-group">
<input name="gotcha" class="form-control" type="text">
</div>
</div>
<div class="form-group hidden">
<input type="hidden" name="submitted" value="1">
</div>
<!-- Кнопка -->
<div class="form-group">
<button type="submit" class="btn btn-info">Отправить
<span class="glyphicon glyphicon-send"></span>
</button>
</div>
</div><!--/.col-md-8-->
</fieldset>
</form>
<script>
// Добавление/удаление класса ошибки Bootstrap для недействительных полей при вводе и утрате фокуса
jQuery('#contact_form :input').keyup(function ()
{
var formElement = jQuery(this);
formGroup = formElement.closest('.form-group');
if(formGroup.hasClass('has-error') && jQuery.trim(formElement.val()).length)
{
formGroup.removeClass('has-error');
}
});
jQuery('#contact_form :input').blur(function ()
{
var formElement = jQuery(this);
formGroup = formElement.closest('.form-group');
if(jQuery.trim(formElement.val()).length==0)
{
formGroup.addClass('has-error');
}
});
</script>
</div><!--/.respond-->
</div><!--/.col-->
</div><!-- /.row-->
</div><!--/.container-->
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class( 'clearfix'); ?> role="article">
<section class="post_content">
<?php the_content(); ?>
</section><!-- end article header -->
</article><!-- end article -->
<?php endwhile; ?>
<?php else : ?>
<article id="post-not-found">
<div class="container">
<div class="row">
<div class="col-sm-12">
<header>
<h1><?php _e("Not Found", "JD_BOOTSTRAP"); ?></h1>
</header>
<section class="post_content">
<p><?php _e("Извините, но запрашиваемый ресурс не найден на этом сайте.", "JD_BOOTSTRAP"); ?></p>
</section>
</div><!-- /.col-sm-12 -->
</div><!-- /.row -->
</div><!-- /.container -->
</article>
<?php endif; ?>
</div><!-- /content -->
</div><!-- /main -->
<?php get_footer(); ?>
<?php
/* Template Name: Contact-Page-with-upload
*
* Кастомная страница обратной связи на PHP. Добавьте или измените поля формы на строке 28 и в самой форме.
* jQuery используется для добавления/удаления класса ошибки Bootstrap для недействительных полей.
*/
/**
* Получение класса ошибки
*
* @return string;
*/
$response="";
function getErrorClass($failedKeys, $key)
{
if(isset($failedKeys) && is_array($failedKeys) && in_array($key, $failedKeys))
{
return 'has-error';
}
return '';
}
if(isset($_POST) && !empty($_POST))
{
// Новая строка
$nL = "<br />";
// Функция генерации ответа
// Функция для генерации ответа
function my_contact_form_generate_response($type, $message)
{
global $response;
if($type == "success")
{
$response = "<div class="success alert alert-success" role="alert" id='success-message'> <i class="glyphicon glyphicon-thumbs-up"></i> {$message}</div>";
}
else
{
$response = "<div class="error alert alert-danger" role="alert" id='error-message'><i class="glyphicon glyphicon-warning-sign"></i> {$message} </div>";
}
}
// Сообщения об ответах
$missing_content = "Пожалуйста, заполните всю информацию.";
$email_invalid = "Адрес электронной почты недействителен.";
$message_unsent = "Сообщение не отправлено. Попробуйте еще раз.";
$message_sent = "Спасибо! Ваше сообщение отправлено.";
// Определите используемые поля, заголовок => имя поля
// Это может быть использовано для добавления полей в автоматическую проверку ниже.
$userVariables = [
'Имя' => 'first_name',
'Фамилия' => 'last_name',
'Телефон' => 'phone',
'Электронная почта' => 'email',
'Комментарий' => 'comment'
];
// Инициализация переменных для неудачных и успешных проверенных полей
$failedFields = [];
$validFields = [];
$failedKeys = [];
// Перебор каждой переменной, определенной выше, и проверка её допустимости как ненулевой строки.
// Если успешно, добавьте это в массив сообщения и удалите все теги для безопасности, и обрежьте пробелы
if(!empty($_POST))
{
foreach($userVariables as $title => $userField)
{
// Если нашему полю не удалось пройти проверку, мы добавляем его в массив неудачных полей
if(!isset($_POST[$userField]) || !is_string($_POST[$userField]) || $_POST[$userField] == '')
{
$failedFields[] = $title;
$failedKeys[] = $userField;
}
// Если успешно, добавьте это в массив успешных полей и обрежьте/очистите содержимое
else
{
$validFields[$title] = trim(strip_tags(($_POST[$userField])));
}
}
}
// Если у нас больше 0 неудачных полей, мы отправим ответ об ошибке на форму
if(!empty($failedFields))
{
// Соедините сообщение с неудачными полями в сообщении
$failureMessage = "Следующие поля обязательны: " . implode(', ', $failedFields);
my_contact_form_generate_response("error", $failureMessage);
}
// Создание HTML сообщения
$message="<html><head>";
// определение используемого шрифта Google в сообщении
$message .='<style>@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,600");</style>';
$message .='</head>';
$message .='<body style="font-family:Open Sans, sans-serif; font-weight:400;">';
$message .= "<h3>Сообщение из формы обратной связи на сайте" .get_bloginfo('name') ."</h3>";
$message .= '<table rules="all" style="border-color: #666;" cellpadding="10">';
// Если у нас есть проверенные поля, перечисленные выше, мы соединим сообщение для тела электронной почты, затем закроем теги таблицы, тела и html
if(!empty($validFields))
{
foreach($validFields as $title => $value)
{
$message .= "<tr style="background: #eee;"><td style="width:200px; font-family: Open Sans, sans-serif; margin: 0px; padding:8px; font-weight: 600;">" . $title . ":</td><td style="font-family: Open Sans, sans-serif; margin: 0px; padding:8px; font-weight: 400;">" . $value . "</td></tr>";
}
}
$message .= '</table></body></html>';
// конец сообщения
/**
*
* Обработка вложения файла
*
*/
if ( ! function_exists( 'wp_handle_upload' ) )
{
require_once( ABSPATH . 'wp-admin/includes/file.php' );
}
$uploadedFile = false;
$movefile = false;
$failedAttachment = false;
if(isset($_FILES['attachmentFile']) && file_exists($_FILES['attachmentFile']['tmp_name']))
{
$uploadedFile = $_FILES['attachmentFile'];
// Получение информации о загруженном файле
$name_of_uploaded_file = basename($uploadedFile['name']);
// получение расширения загруженного файла
$type_of_uploaded_file = substr($name_of_uploaded_file, strrpos($name_of_uploaded_file, '.') + 1);
$size_of_uploaded_file = $uploadedFile["size"] / 1024; // размер в КБ
// Настройки
$max_allowed_file_size = 2000; // размер в КБ
$allowed_extensions = array("jpg", "jpeg", "png", "pdf");
$upload_overrides = array( 'test_form' => false );
// Проверки
if($size_of_uploaded_file > $max_allowed_file_size)
{
$failedKeys[] = 'attachmentFile';
$failedFields[] = 'Загруженный файл';
$failedAttachment = true;
my_contact_form_generate_response("error", "Размер загруженного файла должен быть менее ". round($max_allowed_file_size / 1024). "mb ");
}
//------ Проверка расширения файла
$allowed_ext = false;
for($i = 0; $i <sizeof($allowed_extensions); $i++)
{
if(strcasecmp($allowed_extensions[$i], $type_of_uploaded_file) == 0)
{
$allowed_ext = true;
}
}
if(!$allowed_ext)
{
$failedKeys[] = 'attachmentFile';
$failedFields[] = 'Загруженный файл';
$failedAttachment = true;
my_contact_form_generate_response("error", "Загруженный файл не поддерживается. Поддерживаются только следующие типы файлов: ".implode(', ',$allowed_extensions));
}
$movefile = wp_handle_upload($uploadedFile, $upload_overrides);
if($movefile && ! isset( $movefile['error'] ) ) {
$movefile['url'];
}
}
if(empty($failedFields) && !$failedAttachment && isset($_POST['gotcha']) && $_POST['gotcha'] == '')
{
// Переменные почтовой рассылки
$to = get_option('admin_email');
$subject = "Сообщение из формы обратной связи на ".get_bloginfo('name');
$headers="From: ". $email . "\r\n" . 'Reply-To: ' . $email . "\r\n";
$attachment = $movefile && isset($movefile['file']) ? $movefile['file'] : false;
// Добавление поддержки HTML-типа ответа к электронной почте
add_filter('wp_mail_content_type',create_function('', 'return "text/html"; '));
// Создание сообщения и отправка, возвращение переменной успеха
$sent = wp_mail($to, $subject, $message, $headers, $attachment);
// Если успешно, вернуть успех на форму
if($sent)
{
my_contact_form_generate_response("success", $message_sent);
}
// В случае неудачи, вернуть ответ об ошибке на форму
else
{
my_contact_form_generate_response("error", $message_unsent);
unlink( $movefile['file'] );
}
}
else if(($_POST['submitted'] || !empty($failedFields)) && !$failedAttachment)
{
my_contact_form_generate_response("error", $failureMessage);
}
}
?>
<!-- Конец логики формы -->
<?php get_header(); ?>
<div id="main" class="clearfix wow fadeIn" role="main">
<div id="content">
<div class="container">
<div class="row">
<div class="col-sm-12">
<h1 class="page-title">Свяжитесь с нами</h1>
<div id="respond">
<?php echo $response; ?>
<form class="form-horizontal well" action="<?php the_permalink(); ?>" method="post" id="contact_form" enctype="multipart/form-data">
<fieldset>
<legend>У вас есть вопросы, вы заинтересованы в продукте или хотите узнать о вариантах доставки?</legend>
<p>Пожалуйста, заполните контактную форму, и мы свяжемся с вами как можно скорее!</p>
<div class="col-sm-6">
<!-- Текстовый ввод -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'first_name'); ?>">
<label class="control-label">Имя</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
<input name="first_name" placeholder="Имя" class="form-control" type="text" value="<?php echo esc_attr($_POST['first_name']); ?>" required>
</div>
</div>
<!-- Текстовый ввод -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'last_name'); ?>">
<label class="control-label">Фамилия</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
<input name="last_name" placeholder="Фамилия" class="form-control" type="text" value="<?php echo esc_attr($_POST['last_name']); ?>" required>
</div>
</div>
</div><!--/.col-->
<div class="col-sm-6">
<!-- Текстовый ввод -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'email'); ?>">
<label class="control-label">Электронная почта</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
<input name="email" placeholder="Адрес электронной почты" class="form-control" type="email" value="<?php echo esc_attr($_POST['email']); ?>" required>
</div>
</div>
<!-- Текстовый ввод -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'phone'); ?>">
<label class="control-label">Телефон</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-earphone"></i></span>
<input name="phone" placeholder="(855)555-1212" class="form-control" type="text" value="<?php echo esc_attr($_POST['phone']); ?>" required>
</div>
</div>
</div><!--/.col-->
<div class="col-sm-12">
<!-- Текстовая область -->
<div class="form-group <?php echo getErrorClass($failedKeys, 'comment'); ?>">
<label class="control-label">Ваше сообщение</label>
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
<textarea class="form-control" name="comment" required><?php echo esc_textarea($_POST['comment']); ?></textarea>
</div>
</div>
<div class="form-group <?php echo getErrorClass($failedKeys, 'attachmentFile'); ?>">
<label class="control-label">Прикрепить файл</label>
<input type="file" name="attachmentFile">
</div><!-- /.form-group -->
<!-- Поле Anti-Spam -->
<div class="form-group hidden" id="gotcha">
<label class="control-label">Оставьте это поле пустым</label>
<div class="input-group">
<input name="gotcha" class="form-control" type="text">
</div>
</div>
<div class="form-group hidden">
<input type="hidden" name="submitted" value="1">
</div>
<!-- Кнопка -->
<div class="form-group">
<button type="submit" class="btn btn-info">Отправить
<span class="glyphicon glyphicon-send"></span>
</button>
</div>
</div><!--/.col-md-8-->
</fieldset>
</form>
<script>
// Добавление/удаление класса ошибки Bootstrap для недействительных полей при вводе и утрате фокуса
jQuery('#contact_form :input').keyup(function ()
{
var formElement = jQuery(this);
formGroup = formElement.closest('.form-group');
if(formGroup.hasClass('has-error') && jQuery.trim(formElement.val()).length)
{
formGroup.removeClass('has-error');
}
});
jQuery('#contact_form :input').blur(function ()
{
var formElement = jQuery(this);
formGroup = formElement.closest('.form-group');
if(jQuery.trim(formElement.val()).length==0)
{
formGroup.addClass('has-error');
}
});
</script>
</div><!--/.respond-->
</div><!--/.col-->
</div><!-- /.row-->
</div><!--/.container-->
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class( 'clearfix'); ?> role="article">
<section class="post_content">
<?php the_content(); ?>
</section><!-- end article header -->
</article><!-- end article -->
<?php endwhile; ?>
<?php else : ?>
<article id="post-not-found">
<div class="container">
<div class="row">
<div class="col-sm-12">
<header>
<h1><?php _e("Not Found", "JD_BOOTSTRAP"); ?></h1>
</header>
<section class="post_content">
<p><?php _e("Извините, но запрашиваемый ресурс не найден на этом сайте.", "JD_BOOTSTRAP"); ?></p>
</section>
</div><!-- /.col-sm-12 -->
</div><!-- /.row -->
</div><!-- /.container -->
</article>
<?php endif; ?>
</div><!-- /content -->
</div><!-- /main -->
<?php get_footer(); ?>
.
Ответ или решение
Добавление функции загрузки файлов с валидацией на пользовательскую форму – это распространенная задача в сфере веб-разработки, особенно в контексте создания контактных форм, где пользователи могут загружать файлы для передачи дополнительной информации. Рассмотрим детально, как решить эту задачу, используя предоставленный код, и обсудим возможные улучшения и нюансы.
Теория
В основе задачи лежит необходимость не только добавить поле для загрузки файлов в форму, но и обеспечить валидацию типа и размера загружаемого файла. Это важно для:
-
Обеспечения безопасности: Для предотвращения загрузки вредоносных файлов необходимо проверять тип файла. Принимаются только определенные форматы файлов (например, JPG, PNG, PDF).
-
Контроля размера файла: Чтобы избежать перегрузки сервера или клиентов, необходимо установить ограничения на размер загружаемого файла.
Основные части кода, которые необходимо учитывать при добавлении функциональности загрузки файлов с валидацией, включают:
- Создание HTML формы с полем для загрузки файлов.
- Серверная обработка загруженного файла, включая валидацию типа и размера.
- Использование подходящих инструментов и методов, таких как функция
wp_handle_upload
WordPress для управления загрузкой файлов.
Пример
На примере предоставленного кода мы видим хорошо структурированную форму, которая содержит различные текстовые поля, а также поле для загрузки файлов (<input type="file" name="attachmentFile">
). Основной обработчик разметки PHP позаботился о:
- Получении файла из суперглобальной переменной
$_FILES
. - Проверке существования файла.
- Валидации размера файла относительно заранее заданного максимального размера.
- Проверке типа файла на соответствие определенному списку разрешенных типов.
Процесс валидации ярко выделен несколькими ключевыми аспектами:
$max_allowed_file_size = 2000; // размер в КБ
$allowed_extensions = array("jpg", "jpeg", "png", "pdf");
Проверка заключается в том, чтобы убедиться, что файл не превышает установленный лимит размера, и его расширение присутствует в белом списке разрешенных типов файлов.
Реализация
Теперь разберем, как на практике внедрить данную функциональность и улучшить ее там, где это возможно.
- Оптимизация кода: Вы можете улучшить читаемость кода, проведя рефакторинг. Например, функцию валидации типов файлов можно сделать более компактной за счет использования функции
in_array
.
if (!in_array(strtolower($type_of_uploaded_file), $allowed_extensions)) {
$failedKeys[] = 'attachmentFile';
$failedFields[] = 'Uploaded File';
my_contact_form_generate_response("error", "Формат файла не поддерживается. Разрешенные форматы: ".implode(', ', $allowed_extensions));
}
-
Обработка ошибок: Убедитесь, что обрабатываются все возможные ошибки, которые могут возникнуть во время загрузки файла, например, проблемы с доступностью директории или недостаточное пространство на диске.
-
Использование библиотек: Рассмотрите возможность использования дополнительных библиотек для обработки изображений, если это необходимо, чтобы изменить формат или размеры изображения перед загрузкой.
-
Интернационализация: Добавьте поддержку на нескольких языках для пользователей из разных регионов. Это можно сделать с помощью функций интернационализации WordPress.
-
Безопасность: Убедитесь, что PHP настройки, такие как
post_max_size
иupload_max_filesize
, соответствуют необходимым требованиям серверной нагрузки и безопасности.
Подводя итог, добавление поля для загрузки файлов и его валидация в контактную форму требует учета множества аспектов – от обработки файлов до обеспечения безопасности. Следите за новыми практиками и улучшайте код, чтобы обеспечить лучший пользовательский опыт.