Создание шаблонного интерфейса почтового веб-клиента с использованием Bootstrap, jQuery, DataTables и PHP включает несколько этапов. Ниже приведен пример реализации такого интерфейса.
/project
/css
bootstrap.min.css
styles.css
/js
jquery.min.js
bootstrap.min.js
datatables.min.js
/php
send_mail.php
index.php
read_mail.php
compose_mail.phpindex.php
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Почтовый клиент</title> <link rel="stylesheet" href="css/bootstrap.min.css"> <link rel="stylesheet" href="css/styles.css"> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.21/css/jquery.dataTables.css"> </head> <body> <div class="container-fluid"> <div class="row"> <!-- Sidebar --> <nav id="sidebar" class="col-md-2 d-none d-md-block bg-light sidebar"> <div class="sidebar-sticky"> <ul class="nav flex-column"> <li class="nav-item"> <a class="nav-link active" href="#"> Входящие </a> </li> <li class="nav-item"> <a class="nav-link" href="#"> Отправленные </a> </li> <li class="nav-item"> <a class="nav-link" href="#"> Корзина </a> </li> <li class="nav-item"> <a class="nav-link" href="#"> Архив </a> </li> </ul> </div> </nav> <!-- Main Content --> <main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-4"> <h2>Входящие</h2> <button class="btn btn-primary mb-3" onclick="window.location.href='compose_mail.php'">СОЗДАТЬ</button> <table id="emailsTable" class="display"> <thead> <tr> <th>От кого</th> <th>Тема</th> <th>Дата</th> <th>Действия</th> </tr> </thead> <tbody> <!-- Данные будут загружены через AJAX --> </tbody> </table> </main> </div> </div> <!-- Modal для чтения письма --> <div class="modal fade" id="readMailModal" tabindex="-1" role="dialog" aria-labelledby="readMailModalLabel" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="readMailModalLabel">Чтение письма</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p><strong>От:</strong> <span id="modalFrom"></span></p> <p><strong>Тема:</strong> <span id="modalSubject"></span></p> <p><strong>Дата:</strong> <span id="modalDate"></span></p> <p><strong>Сообщение:</strong> <span id="modalMessage"></span></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Закрыть</button> </div> </div> </div> </div> <script src="js/jquery.min.js"></script> <script src="js/bootstrap.min.js"></script> <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.js"></script> <script> $(document).ready(function() { $('#emailsTable').DataTable({ "ajax": { "url": "php/get_emails.php", "dataSrc": "" }, "columns": [ { "data": "from" }, { "data": "subject" }, { "data": "date" }, { "data": null, "render": function(data, type, row) { return '<button class="btn btn-info btn-sm" onclick="openModal(\'' + row.from + '\', \'' + row.subject + '\', \'' + row.date + '\', \'' + row.message + '\')">Читать</button>'; } } ] }); }); function openModal(from, subject, date, message) { $('#modalFrom').text(from); $('#modalSubject').text(subject); $('#modalDate').text(date); $('#modalMessage').text(message); $('#readMailModal').modal('show'); } </script> </body> </html>
php/get_emails.php
<?php
header('Content-Type: application/json');
$emails = [
[
"from" => "user1@example.com",
"subject" => "Тестовое письмо 1",
"date" => "2023-10-01",
"message" => "Это тестовое письмо 1."
],
[
"from" => "user2@example.com",
"subject" => "Тестовое письмо 2",
"date" => "2023-10-02",
"message" => "Это тестовое письмо 2."
]
];
echo json_encode($emails);
?>compose_mail.php
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Создать письмо</title> <link rel="stylesheet" href="css/bootstrap.min.css"> </head> <body> <div class="container"> <h2>Создать письмо</h2> <form action="php/send_mail.php" method="post"> <div class="form-group"> <label for="to">Кому:</label> <input type="email" class="form-control" id="to" name="to" required> </div> <div class="form-group"> <label for="subject">Тема:</label> <input type="text" class="form-control" id="subject" name="subject" required> </div> <div class="form-group"> <label for="message">Сообщение:</label> <textarea class="form-control" id="message" name="message" rows="5" required></textarea> </div> <button type="submit" class="btn btn-primary">Отправить</button> </form> </div> </body> </html>
php/send_mail.php
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$to = $_POST['to'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$headers = "From: your_email@example.com\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
if (mail($to, $subject, $message, $headers)) {
echo "Письмо успешно отправлено.";
} else {
echo "Ошибка при отправке письма.";
}
}
?>css/styles.css
#sidebar { height: 100vh; position: fixed; top: 0; left: 0; width: 250px; padding-top: 20px; } main { margin-left: 250px; padding: 20px; }
Этот пример демонстрирует базовую структуру почтового веб-клиента с использованием Bootstrap, jQuery, DataTables и PHP. Вы можете расширить функциональность, добавив аутентификацию пользователей, работу с базой данных для хранения писем и другие функции.
Для того чтобы открывать письмо через модальное окно по нажатию на кнопку, мы уже добавили модальное окно в index.php. Теперь нужно доработать код, чтобы при нажатии на кнопку "Читать" в таблице писем открывалось модальное окно с содержимым письма.
В таблице писем уже есть кнопка "Читать", которая вызывает функцию openModal. Эта функция передает данные письма в модальное окно. Осталось только убедиться, что модальное окно корректно отображает эти данные.
<!-- Таблица писем --> <table id="emailsTable" class="display"> <thead> <tr> <th>От кого</th> <th>Тема</th> <th>Дата</th> <th>Действия</th> </tr> </thead> <tbody> <!-- Данные будут загружены через AJAX --> </tbody> </table> <!-- Модальное окно для чтения письма --> <div class="modal fade" id="readMailModal" tabindex="-1" role="dialog" aria-labelledby="readMailModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="readMailModalLabel">Чтение письма</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p><strong>От:</strong> <span id="modalFrom"></span></p> <p><strong>Тема:</strong> <span id="modalSubject"></span></p> <p><strong>Дата:</strong> <span id="modalDate"></span></p> <p><strong>Сообщение:</strong></p> <div id="modalMessage" class="border p-2 bg-light"></div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Закрыть</button> </div> </div> </div> </div>
Функция openModal уже определена в коде. Она принимает данные письма и заполняет ими модальное окно. После этого модальное окно открывается.
<script> $(document).ready(function() { $('#emailsTable').DataTable({ "ajax": { "url": "php/get_emails.php", "dataSrc": "" }, "columns": [ { "data": "from" }, { "data": "subject" }, { "data": "date" }, { "data": null, "render": function(data, type, row) { return '<button class="btn btn-info btn-sm" onclick="openModal(\'' + row.from + '\', \'' + row.subject + '\', \'' + row.date + '\', \'' + row.message + '\')">Читать</button>'; } } ] }); }); function openModal(from, subject, date, message) { $('#modalFrom').text(from); $('#modalSubject').text(subject); $('#modalDate').text(date); $('#modalMessage').text(message); $('#readMailModal').modal('show'); // Открываем модальное окно } </script>
get_emails.phpФайл get_emails.php возвращает JSON с данными писем. Убедитесь, что данные содержат поля from, subject, date и message.
<?php
header('Content-Type: application/json');
$emails = [
[
"from" => "user1@example.com",
"subject" => "Тестовое письмо 1",
"date" => "2023-10-01",
"message" => "Это тестовое письмо 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit."
],
[
"from" => "user2@example.com",
"subject" => "Тестовое письмо 2",
"date" => "2023-10-02",
"message" => "Это тестовое письмо 2. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
]
];
echo json_encode($emails);
?>Добавим немного стилей для улучшения внешнего вида модального окна.
/* styles.css */ #readMailModal .modal-body p { margin-bottom: 10px; } #readMailModal .modal-body #modalMessage { white-space: pre-wrap; /* Сохраняет форматирование текста */ font-family: monospace; background-color: #f8f9fa; padding: 10px; border-radius: 5px; }
При нажатии на кнопку "Читать" в таблице писем открывается модальное окно.
В модальном окне отображаются данные письма: от кого, тема, дата и текст сообщения.
Модальное окно можно закрыть, нажав на кнопку "Закрыть" или кликнув вне окна.
Загрузите страницу index.php.
Таблица писем заполнится данными из get_emails.php.
Нажмите на кнопку "Читать" в любом письме.
Откроется модальное окно с содержимым письма.
Теперь ваш почтовый клиент поддерживает чтение писем через модальное окно!
Чтобы обновить таблицу #emailsTable динамически после выполнения AJAX-запроса, можно использовать метод ajax.reload() DataTables. Этот метод позволяет перезагрузить данные таблицы, не перезагружая всю страницу.
Добавим кнопку, которая будет инициировать обновление таблицы.
<button id="refreshTable" class="btn btn-primary mb-3">Обновить таблицу</button> <table id="emailsTable" class="display"> <thead> <tr> <th>От кого</th> <th>Тема</th> <th>Дата</th> <th>Действия</th> </tr> </thead> <tbody> <!-- Данные будут загружены через AJAX --> </tbody> </table>
Добавим обработчик события для кнопки "Обновить таблицу". При нажатии на кнопку будет выполнен AJAX-запрос, и таблица обновится.
<script> $(document).ready(function() { // Инициализация DataTable var table = $('#emailsTable').DataTable({ "ajax": { "url": "php/get_emails.php", "dataSrc": "" }, "columns": [ { "data": "from" }, { "data": "subject" }, { "data": "date" }, { "data": null, "render": function(data, type, row) { return '<button class="btn btn-info btn-sm" onclick="openModal(\'' + row.from + '\', \'' + row.subject + '\', \'' + row.date + '\', \'' + row.message + '\')">Читать</button>'; } } ] }); // Обработчик для кнопки "Обновить таблицу" $('#refreshTable').on('click', function() { table.ajax.reload(); // Перезагружаем данные таблицы }); }); function openModal(from, subject, date, message) { $('#modalFrom').text(from); $('#modalSubject').text(subject); $('#modalDate').text(date); $('#modalMessage').text(message); $('#readMailModal').modal('show'); } </script>
get_emails.phpФайл get_emails.php должен возвращать актуальные данные в формате JSON. Например:
<?php
header('Content-Type: application/json');
$emails = [
[
"from" => "user1@example.com",
"subject" => "Тестовое письмо 1",
"date" => "2023-10-01",
"message" => "Это тестовое письмо 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit."
],
[
"from" => "user2@example.com",
"subject" => "Тестовое письмо 2",
"date" => "2023-10-02",
"message" => "Это тестовое письмо 2. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
]
];
echo json_encode($emails);
?>При нажатии на кнопку "Обновить таблицу" выполняется AJAX-запрос к get_emails.php.
Данные таблицы обновляются без перезагрузки страницы.
Если данные на сервере изменились, таблица отобразит актуальные данные.
Индикатор загрузки: Можно добавить индикатор загрузки (например, спиннер) на время выполнения AJAX-запроса.
Обработка ошибок: Добавьте обработку ошибок, если AJAX-запрос завершится неудачно.
Пример добавления индикатора загрузки:
<div id="loadingSpinner" style="display: none;">Загрузка...</div>
$('#refreshTable').on('click', function() { $('#loadingSpinner').show(); // Показываем индикатор загрузки table.ajax.reload(function() { $('#loadingSpinner').hide(); // Скрываем индикатор после завершения }); });
Теперь ваш почтовый клиент поддерживает динамическое обновление таблицы писем!
Чтобы сделать таблицу DataTable глобальной переменной, достаточно объявить переменную за пределами функции $(document).ready(). Это позволит использовать таблицу в других функциях или скриптах на странице.
Объявим переменную table за пределами $(document).ready(), чтобы она была доступна в других частях кода.
<script> // Объявляем глобальную переменную для DataTable var table; $(document).ready(function() { // Инициализация DataTable table = $('#emailsTable').DataTable({ "ajax": { "url": "php/get_emails.php", "dataSrc": "" }, "columns": [ { "data": "from" }, { "data": "subject" }, { "data": "date" }, { "data": null, "render": function(data, type, row) { return '<button class="btn btn-info btn-sm" onclick="openModal(\'' + row.from + '\', \'' + row.subject + '\', \'' + row.date + '\', \'' + row.message + '\')">Читать</button>'; } } ] }); // Обработчик для кнопки "Обновить таблицу" $('#refreshTable').on('click', function() { table.ajax.reload(); // Перезагружаем данные таблицы }); }); function openModal(from, subject, date, message) { $('#modalFrom').text(from); $('#modalSubject').text(subject); $('#modalDate').text(date); $('#modalMessage').text(message); $('#readMailModal').modal('show'); } </script>
Теперь переменная table доступна в любом месте вашего скрипта. Например, вы можете использовать её для обновления таблицы из другой функции:
function refreshTableManually() { if (table) { table.ajax.reload(); // Обновляем таблицу } else { console.error("Таблица не инициализирована."); } }
Добавим кнопку, которая будет вызывать функцию refreshTableManually:
<button onclick="refreshTableManually()" class="btn btn-secondary mb-3">Обновить вручную</button>
Теперь при нажатии на эту кнопку таблица будет обновляться.
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Почтовый клиент</title> <link rel="stylesheet" href="css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.21/css/jquery.dataTables.css"> </head> <body> <div class="container-fluid"> <div class="row"> <!-- Sidebar --> <nav id="sidebar" class="col-md-2 d-none d-md-block bg-light sidebar"> <div class="sidebar-sticky"> <ul class="nav flex-column"> <li class="nav-item"> <a class="nav-link active" href="#"> Входящие </a> </li> <li class="nav-item"> <a class="nav-link" href="#"> Отправленные </a> </li> <li class="nav-item"> <a class="nav-link" href="#"> Корзина </a> </li> <li class="nav-item"> <a class="nav-link" href="#"> Архив </a> </li> </ul> </div> </nav> <!-- Main Content --> <main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-4"> <h2>Входящие</h2> <button id="refreshTable" class="btn btn-primary mb-3">Обновить таблицу</button> <button onclick="refreshTableManually()" class="btn btn-secondary mb-3">Обновить вручную</button> <table id="emailsTable" class="display"> <thead> <tr> <th>От кого</th> <th>Тема</th> <th>Дата</th> <th>Действия</th> </tr> </thead> <tbody> <!-- Данные будут загружены через AJAX --> </tbody> </table> </main> </div> </div> <!-- Модальное окно для чтения письма --> <div class="modal fade" id="readMailModal" tabindex="-1" role="dialog" aria-labelledby="readMailModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="readMailModalLabel">Чтение письма</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p><strong>От:</strong> <span id="modalFrom"></span></p> <p><strong>Тема:</strong> <span id="modalSubject"></span></p> <p><strong>Дата:</strong> <span id="modalDate"></span></p> <p><strong>Сообщение:</strong></p> <div id="modalMessage" class="border p-2 bg-light"></div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Закрыть</button> </div> </div> </div> </div> <script src="js/jquery.min.js"></script> <script src="js/bootstrap.min.js"></script> <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.js"></script> <script> // Объявляем глобальную переменную для DataTable var table; $(document).ready(function() { // Инициализация DataTable table = $('#emailsTable').DataTable({ "ajax": { "url": "php/get_emails.php", "dataSrc": "" }, "columns": [ { "data": "from" }, { "data": "subject" }, { "data": "date" }, { "data": null, "render": function(data, type, row) { return '<button class="btn btn-info btn-sm" onclick="openModal(\'' + row.from + '\', \'' + row.subject + '\', \'' + row.date + '\', \'' + row.message + '\')">Читать</button>'; } } ] }); // Обработчик для кнопки "Обновить таблицу" $('#refreshTable').on('click', function() { table.ajax.reload(); // Перезагружаем данные таблицы }); }); function openModal(from, subject, date, message) { $('#modalFrom').text(from); $('#modalSubject').text(subject); $('#modalDate').text(date); $('#modalMessage').text(message); $('#readMailModal').modal('show'); } function refreshTableManually() { if (table) { table.ajax.reload(); // Обновляем таблицу } else { console.error("Таблица не инициализирована."); } } </script> </body> </html>
Таблица DataTable инициализируется в глобальной переменной table.
Вы можете использовать table в любом месте вашего скрипта, например, для обновления данных через table.ajax.reload().
Добавлена кнопка "Обновить вручную", которая использует глобальную переменную table для обновления данных.
Теперь таблица полностью управляется через глобальную переменную, что делает код более гибким и удобным для расширения.