Шаг 8
Логическое завершение
И так, мы логично и последовательно подкрались к популярному в некоторых кругах (их называют угловатыми) native-синтаксису. Вот пример такого шаблона:
1
2
3
4
5
6
7
8
9
10
11
12
|
<div id="header">Header. <a href="<?php echo WEB_ROOT;?>">Home</a> | <?php if (isset($_SESSION['user'])) :?> <a href="<?php echo WEB_ROOT;?>?page=logout">Sign out</a> <?php if (!empty($_SESSION['usermode'])) :?> | <a href="<?php echo WEB_ROOT;?>?page=clean-usermode">Exit user mode</a> <?php endif;?> <?php else :?> <a href="<?php echo WEB_ROOT;?>?page=login">Sign in</a> <?php endif;?> </div>
|
Практически это php в чистом виде, а где же разделение...
Мы пойдем другим путем. Будем выводить в шаблон исключительно переменные и по одной штуке. Ну и в редком исключении вызовы функций. Это будет похоже на html теги и никакой динамики. Для этого нам понадобится промежуточный файл, который присвоит результаты работы логических файлов переменным. А их уже мы и выведем в шаблон, дабы не шокировать верстальщиков обилием ифов, форов, форечей и прочих таинств программной части. В этом файле, назовем его
view.php, мы приводить в порядок вывод, который потребуется на разных страницах. В нашем случае он будет выглядеть так:
libs/view.php
1
2
3
4
5
6
7
8
9
10
|
<?php
/** * Date formatting * Форматирование даты */ $date = formatDate(date("Y-m-d"), false);
|
Теперь, раз уж мы взялись реализовывать паттерн
MVC (Model-View-Controller), еще раз немного изменим структуру.
1. Файлам, отвечающим за конкретные действия, вычисления, запросы и т.д, необходимые для формирования нужного функционала, добавим постфикс
_controller. То есть если это файл, который формирует приветствие, так как он единственный, называться будет
read_controller.php.
Вот и вынесем в него эти вычисления:
modules/main/read_controller.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
/** * Выбор случайного значения из массива * Choice of casual value from a file */ $arr_who = array( 1 => IRB_WHO_FIRST, IRB_WHO_SECOND, IRB_WHO_THIRD, IRB_WHO_FOURTH, IRB_WHO_FIFTH );
$who = $arr_who[rand(1,count($arr_who))];
|
2. За одно, как обещано, исправим историческую несправедливость и переименуем индексы модулей. Называться они теперь будут
router.php То есть маршрутизатор.
Почему так. Дело в том, что в модуле может быть несколько контроллеров, это мы рассмотрим позже. А пока просто подготовим почву:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
/** * Контроллер формирования случайного обращения * The controller of formation of the casual reference */ include './modules/main/read_controller.php'; /** * Подготовка к выводу * Preparation for a conclusion */ include './modules/main/view.php';
|
3. Ну и, как видно из кода, должен быть еще и вид у каждого модуля. Справедливости ради нужно отметить, что это совсем не обязательно. В простых модулях достаточно одного контроллера и незачем делить все это на три. Но мы поделим, что бы привыкнуть к структуре, к тому же нам это пригодится в дальнейшем.
И так, файл
modules/main/view.php, непосредственно в модуле. А что бы он не простаивал, подключим в систему дебаггер, который проходили раньше.
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
/** * Подключаем шаблон * Includes a templates */ include './skins/tpl/main/show.tpl'; dbg($page);
|
Ну и второй по аналогии.
А вот так теперь выглядит индекс.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
<?php
/** * The main router * Главный маршрутизатор (роутер) * @author IT studio IRBIS-team * @copyright © 2009 IRBIS-team */ /////////////////////////////////////////////////////////
/** * We establish the charset and level of errors * Устанавливаем кодировку и уровень ошибок */ header("Content-Type: text/html; charset=utf-8"); error_reporting(E_ALL); /** * Debug * Дебаггер * @TODO To clean in release */ define('IRB_TRACE', true); include './debug.php';
/** * We connect a configuration file * Подключаем конфигурационный файл */ include './config.php';
/** * We connect a file of the language * Подключаем языковой файл */ include './language/'. IRB_LANGUAGE .'.php'; /** * Получаем файл переменных * Receive a variables file */ include './variables.php'; /** * We connect a file of the general functions * Подключаем файл общих функций */ include './libs/default.php'; /** * We put in order a conclusion * Приводим в порядок вывод */ include './libs/view.php'; ob_start();
/** * Подключаем меню * Includes the menu */ include './skins/tpl/menu.tpl';
/** * The switch of modules * Переключатель страниц */ switch($page) { /** * Подключаем модуль приветствия * Includes the greeting module */ case 'main': include './modules/main/router.php'; break; /** * Подключаем модуль второй страницы * Includes the module of the second page */ case 'second': include './modules/second/router.php'; break; /** * Подключаем модуль приветствия по умолчанию * Includes the greeting module */ default: include './modules/main/router.php'; break; }
$content = ob_get_contents(); ob_end_clean(); /** * Подключаем главный шаблон * Includes the basic template */ include './skins/tpl/index.tpl';
|
Ну и для полноты ощущений добавим в скин папки для картинок и javascript
.
Теперь окончательная структура приложения будет такой:
Ну вот и готово. В следующих разделах мы рассмотрим эту структуру более широко, как говорится в боевом исполнении. Сейчас важно было понять сам принцип построения.
Всё это может показаться слишком навороченным и совсем ненужным. Так оно и есть, если сайт предполагается из 2-3 страниц. Но когда приложение будет большим и многофункциональным, без структурного подхода будет крайне трудно и разрабатывать и обслуживать сайт. По этому лучше сразу привыкать к структурному мышлению.
Плюсы такого метода.
1. Можно спокойно и непринужденно разрабатывать дополнительный модуль (расширение), а потом за несколько минут внедрить в рабочий сайт.
2. Готовые модули в процессе работы накапливаются и в следующий раз можно просто собрать из них новый сайт как конструктор лего.
3. С шаблонами такого плана справится любой верстальщик, который боится шаблонизаторов или нативе.
4. Шаблоны этого типа можно разрабатывать параллельно с логикой, потому что они друг от друга практически не зависят.
5. Скорость исполнения и ресурсобережливость. По этой схеме в оперативную память грузятся только те файлы, которые действительно принимают участие в формировании данной страницы. И напрочь отсутствует разбор шаблонов с помощью регулярных выражений. А они как известно не самое быстрое явление в php.
6. Прозрачность кода. Структура построена без ООП парадигмы, которая никогда прозрачностью не отличалась. А принцип построения остался практически тем же самым..
Вообще тут показана даже не верхушка айсберга, а только маленький снежок, слепленный на его склоне. На самом деле тонкостей и хитростей у этого подхода очень много, что позволяет делать сайты быстрыми, эффективными и с очень оригинальным функционалом.
Постараемся в следующих уроках более подробно рассказать об этом.