PHP - Урок 12. Обзор модели MVC. Добавляем шаблоны страниц в наше приложение.
Предыдущие уроки:
Программируем на PHP - Введение
PHP - Запросы от браузера к серверу
PHP - Как работает сервер
PHP - Урок 4. PHP - интерпретатор
PHP - Урок 5. Переменные сервера и глобальные переменные
PHP - Урок 6. Конструкции print и echo. Кавычки одинарные и двойные и конкатенация строк
PHP - Урок 7. Переменные, константы и условия
PHP - Урок 8. Точка входа в приложение. Настройка mod_rewrite и файл .htaccess
PHP - Урок 9. Массивы и switch. Кодим основной каркас
PHP - Урок 10. COOKIE
PHP - Урок 11. Функции. Добавляем ядро системы core.php
MVC: Модель - Вид - Контроллер
В программировании есть такое понятие как паттерны проектирования. Это ни что иное как выработанные годами методики написания программ. Чем сложнее программа тем чаще к ней применяются конкретные методики. Одной из наиболее часто употребляемых методик является разделение вашего приложения на 3 составные части - Модель, Вид и Контролер. Разберем каждую часть более подробно.Для начала напомню что представляет из себя любое приложение.
- Ввод. Получение входных данных от пользователя (например через веб-формы).
- Обработка. Обработка полученных данных (сохранение их в файлах и/или формирование запроса на поиск данных в файлах на основании этих входных данных для выдачи информации пользователю.
- Вывод. Форматирование данных для ответа и отображение пользователю (отправка в браузер запросившего их клиента).
Контролер - он позволяет принимать данные из браузера (http - запрос) и в соответствии с ним выполнять некоторое действие. В частности - загружать данные из модели или сохранять их туда.
В нашем приложении роль контролера выполняет switch который сидит в index.php.Модель - представляет данные и логику их отбора (вычисления). По сути все что работает с файлами ибазой данных - относится к модели.
Мы будем взаимодействовать с базой данных через функции, которые у нас в ядре sys/core.php.Вид - Отображение данных у нас будет реализовано в виде HTML-страниц с подстановкой данных (переменных) из модели.
Этим мы сегодня и займемся.
Итак последовательность работы нашего приложения следующая: Запрос от клиента попадает в контроллер и там на основании его данных выбирается нужное действие (в case);
В контролере происходит обращение к модели (нужным функциям в core.php которые либо сохраняют данные, либо загружают их из базы данных или файлов, или даже просто их обрабатывают);
Данные загруженные из модели в контролере сохраняются в переменных. Нам остается только подключить HTML-шаблон нужной страницы, где эти переменные подставляются и соответственно отображается их значение.
Добавляем шаблоны в наше приложение
Будем использовать следующие соглашения - У нас будет одни главный шаблон (обертка) с названием index.tpl.php внутри которого будут подключаться шаблоны страниц (имя_страницы.tpl.php).
То есть в главном шаблоне у нас будет меню, шапка и подвал. А содержание будет в шаблонах страниц. Что ж приступим.
В папке sys (где у нас файл core.php созданный на прошлом уроке) создадим подпапку templates. В нее то мы и будем класть наши файлы шаблонов.
Первым делом мы создадим в ней файл обертку (index.tpl.php), в который будут подключаться "внутряки".
Вот его первоначальный код
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title><?=$title?></title>
</head>
<body>
<section class="container">
<?php include_once(ROOT.'/sys/templates/'.$tpl.'.tpl.php'); ?>
</section>
<footer>
<p><small>© 2016</small></p>
</footer>
</body>
</html>
Здесь <?=$title?>
это подстановка переменной (мы ее зададим в контроллере). А <?php include_once(ROOT.'/sys/templates/'.$tpl.'.tpl.php'); ?>
- это мы в нашем главном шаблоне подключаем внутренний шаблон - его мы будем также назначать в контроллере (switch-e).
Теперь в файле index.php подключим наш главный шаблон обертку. Следующий код нужно вставить снизу после оператора swithc!
include_once(ROOT.'/sys/templates/index.tpl.php');
Так как все настройки - данные, шаблоны и др. Мы задаем в switch-e перед тем как они будут добавлены в шаблон.
Если вы все зделали и попробуете ради интереса зайти на тестовый сайт, то увидите предупреждение php-интерпретатора
Warning: include_once(Z:/home/thesite.loc/www/sys/templates/.tpl.php) [function.include-once]: failed to open stream: No such file or directory in Z:\home\thesite.loc\www\sys\templates\index.tpl.php on line 8
Warning: include_once() [function.include]: Failed opening 'Z:/home/thesite.loc/www/sys/templates/.tpl.php' for inclusion (include_path='.;C:\php\pear') in Z:\home\thesite.loc\www\sys\templates\index.tpl.php on line 8
Оно тут из-за того, что в index.tpl.php как мы помним мы подключали файл "внутряк" <?php include_once(ROOT.'/sys/templates/'.$tpl.'.tpl.php'); ?>
Вот только переменную $tpl мы не задали. То есть название нашего файла шаблона. Давайте это исправим.
Как помним если в URL не указано страниц куда мы хотим перейти, или таких разделов в нашем свитче нету, то мы попадаем в секцию default.
Вот для этой секции и напишем первый наш шаблон.
В папке sys/templates создадим файл default.tpl.php
<h2>Страница по умолчанию</h2>
<p>Сюда мы попадаем, если не ввели в запросе нужную страницу</p>
А в раздел default нашего switch-a контроллера пишем вместо того что там было
$title = "Страница по умолчанию";
$tpl = "default";
Теперь обновим страницу и у нас все работает.
Это мое PHP-приложение
Страница по умолчанию
Сюда мы попадаем, если не ввели в запросе нужную страницу
© 2016
Теперь логика ясна. Если мы допустим хотим создать страницу авторизации, то мы создаем в папке файл login.tpl.php а в секции case "login" устанавливаем соответствующие значения для переменных title и tpl.
В прочем этим мы и займемся в следующем уроке.
Итак полный сегодняшний код:
<h1>Это мое PHP-приложение</h1>
<?php
define(ROOT, $_SERVER['DOCUMENT_ROOT']);
require(ROOT.'/sys/core.php');
$page = route(1);
$ext = route(2);
//echo 'Запрашиваемая страница: '.$page;
//echo '<br />Дополнительные данные: '.$ext;
switch($page){
case 'login':
echo '<h2>Страница авторизации</h2>';
break;
case 'logout':
echo '<h2>Тут мы разлогиваемся</h2>';
break;
case 'register':
echo '<h2>Страница авторизации</h2>';
break;
case 'user':
echo '<h2>Профиль пользователя</h2>';
break;
case 'post':
echo '<h2>Конкретный пост</h2>';
break;
case 'news':
echo '<h2>Страница новостей</h2>';
break;
default:
$title = "Страница по умолчанию";
$tpl = "default";
}
include_once(ROOT.'/sys/templates/index.tpl.php');
<html lang="ru">
<head>
<meta charset="utf-8">
<title><?=$title?></title>
</head>
<body>
<section class="container">
<?php include_once(ROOT.'/sys/templates/'.$tpl.'.tpl.php'); ?>
</section>
<footer>
<p><small>© 2016</small></p>
</footer>
</body>
</html>
<h2>Страница по умолчанию</h2>
<p>Сюда мы попадаем, если не ввеи в запросе нужную страницу</p>
Привет!
Этот пост был выбран Академией Голоса и попал в список программы поддержки качественных образовательных постов.
Ссылка на твой пост будет опубликована в отчете Академии.
Спасибо за полезный контент (ノ◕ヮ◕)ノ*:・゚✧