8 лет назад
Продолжаем...
Создадим скрипт обработки клика по ссылкам и по кнопкам отправки форм. Открываем файл /js/jquery.sfb.js и добавляем следующий код:
//функция обработки всех запросов со страницы
//elem = элемент страницы
function sfbRequest(elem)
{
//получаем путь запроса из атрибута href элемента и если атрибут отсутствует путь берем из строки запроса браузера
if ($(elem).is("[href]")) { path = $(elem).attr("href"); } else { path = location; }
//проверяем наличие специального атрибута элемента и получаем данные
var atr = $(elem).data("sfb") ? $(elem).data("sfb") : "";
//парсим путь и получем путь и get параметры если присутствуют
var url = parseUrl(path);
//получаем данные формы если она существует
var post = $("form[name="+$(elem).attr("id")+"]").serialize();
//делаем запрос
$.ajax({type: "POST", dataType: "json", url: "/index.php", data: {page:url["path"], get:url["get"], post:post},
//функция выпоняемая перед выполнением запроса
beforeSend: function () { $.blockUI({message: "Подождите идёт загрузка...", overlayCSS: {backgroundColor: "#000", opacity: 0.5}}); },
//функция выполняемая после удачного выполнения запроса
success: function (result)
{
//если получены данные в результате запроса
if (result)
{
//выполняем javascript полученный в результате запроса (если javascript при выполнении ловит ошибку выводим сообщение)
if (result["data"]) { try { eval(result["data"]); } catch (err) { showMessage("Ошибка", "Что то пошло не так... Попробуйте обновить страницу...", 10000, "error", false, "top-left"); } }
//если существует атрибут элемента page
if (atr.page)
{
//пишем страницу в историю браузера
history.pushState("", "", path);
//меняем адресную строку браузера
history.replaceState("", "", path);
}
}
},
//функция выполняемая в случае неудачного завершения запроса
error: function () { $.unblockUI(); showMessage("Ошибка", "Что то пошло не так... Попробуйте обновить страницу...", 10000, "error", false, "top-left"); },
//функция выполняемая после завершения запроса
complete: function () { $.unblockUI(); }});
return false;
}
//вешаем обработчик "клик" на все ссылки имеющие класс sfb-link
$(document).on("click", ".sfb-link", function() { sfbRequest($(this)); return false; });
//парсинг url в результате которого получаем путь и get параметры
function parseUrl(path) { var url = []; var rx = new RegExp("^(([^:/?#]+):)?(//(([^:/?#]*)(?::([^/?#]*))?))?([^?#]*)(?([^#]*))?(#(.*))?$"); var parts = rx.exec(href); url["path"] = parts[7]; url["get"] = parts[9]; return url; }
//сообщение (заголовок, текст, скрыть после времени, иконка, заменять предыдущее сообщение, позиция в окне браузера)
function showMessage(title, text, hide, icon, stack, position)
{
$.toast({ heading: title, text: text, hideAfter: hide, icon: icon, stack: stack, position: position });
}
Открываем файл template.php.
Добавляем к нашим ссылкам в главном меню class="sfb-link" и атрибут data-sfb='{"page":1}'. Атрибутом data-sfb мы обозначили что это ссылка на страницу и надо поменять адресную строку браузера. При клике у нас срабатывает блокировка страницы с помощью плагина jquery blockUI пока запрос не завершится. Это сделано для того чтобы пользователь дождался ответа прежде чем нажать что нибудь другое. Код имеет комментарии если что не понятно пишите будем разбирать.
Теперь нужно нам обработать ajax запросы в нашем файле index.php открываем его и добавим следующий код
//если ajax запрос
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']))
{
//если реферер не передан завершаем работу
if (!isset($_SERVER['HTTP_REFERER'])) { exit(header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true)); }
//если реферер не соответствует нашему домену завершаем работу
if (!mb_strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'])) { exit(header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true)); }
//запрашиваемая страница
$page = isset($_POST['page']) ? $_POST['page'] : '';
//парсим post данные в массив
if (isset($_POST['get'])) { parse_str($_POST['get'], $get); }
//парсим get данные в массив
if (isset($_POST['get'])) { parse_str($_POST['post'], $post); }
//если пустая строка запроса или запрашивается index.php показываем пользователю главную страницу
if ($page == '' || $page == '/') { $page = 'index'; }
//удаляем крайние слеши, получаем страницу которую запрашивает пользователь
$page = trim($page, '/');
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(SFB_DIR.'/pages/'.$page.'.php'))
{
//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//подключаем запрашиваемую страницу
include(SFB_DIR.'/pages/'.$page.'.php');
//в переменную $content помещаем на буфер
$content = ob_get_clean();
//завершаем работу и отдаём данные в json формате (javascript который добавляет в элемент c ID sfb-content полученный результат выполнения скрипта)
exit(json_encode(['data' => '$("#sfb-content").html("'.$content.'");']));
}
else
{
exit(json_encode(['data' => 'window.location.replace("/404");']));
}
}
else
{
//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(SFB_DIR.'/pages/'.$page.'.php'))
{
//подключаем запрашиваемую страницу
include(SFB_DIR.'/pages/'.$page.'.php');
}
else
{
//если не существует выдаём заголовок браузеру 404
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true);
//подключаем нашу страницу ошибки
include(SFB_DIR.'/pages/404.php');
}
//в переменную $content помещаем на буфер
$content = ob_get_clean();
//подключаем шаблон сайта
include(SFB_DIR.'/template.php');
}
заменив этот
//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(SFB_DIR.'/pages/'.$page.'.php'))
{
//подключаем запрашиваемую страницу
include(SFB_DIR.'/pages/'.$page.'.php');
}
else
{
//если не существует выдаём заголовок браузеру 404
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true);
//подключаем нашу страницу ошибки
include(SFB_DIR.'/pages/404.php');
}
//в переменную $content помещаем на буфер
$content = ob_get_clean();
//подключаем шаблон сайта
include(SFB_DIR.'/template.php');
Добавляем в файле template.php к элементу id="sfb-content".
Открываем в браузере и любуемся нашим сайтом )))