Шаг 6
Паттерн MVC. Вид.
Ну а теперь займемся приведением в порядок отображения. У нас с ним далеко не все в порядке. Начнем с того, что уже проходили. А именно с возврата данных. Самые наблюдательные могли заметить, что у нас пропала обработка данных, которыен выводятся в элементы формы. Напомню:
1
2
3
4
|
<input name="value1" type="text" value="<?php echo $POST['value1'] ?>"/>
|
Тут отсутствует функция
htmlspecialchars(). Это все неспроста.
Дело в том, что данные у нас хранятся не в разрозненных переменных, а в массиве
$POST (не путать с
$_POST). А раз они в массиве, то и обработать их можно одним махом. Для этого сочиним специальную функцию-обертку, которая заставит
htmlspecialchars() работать с массивами.
Поместим её в файл
libs/view.php, так как данные нужно обрабатывать всегда и повсеместно.
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
|
<?php
/** * Library of the views functions * Библиотека функций отображения * @author IT studio IRBIS-team * @copyright © 2009 IRBIS-team */ /////////////////////////////////////////////////////////<br />
/** * Function of processing of variables for a conclusion in a stream * Функция обработки переменных для вывода в поток */ function htmlChars($data) { if(is_array($data)) // Если данные - массив, вызываем эту же функцию. $data = array_map("htmlChars", $data); else // Если нет, обрабатываем htmlspecialchars() $data = htmlspecialchars($data); // На выход return $data; }
/** * Date formatting * Форматирование даты */ $date = formatDate(date("Y-m-d"), false);
|
А теперь просто открываем вьюшку модуля и добавляем туда всего одну строчку:
modules/second/view.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
/** * View * Вид * @author IT studio IRBIS-team * @copyright © 2009 IRBIS-team */ /////////////////////////////////////////////////////////
$POST = htmlChars($POST);
/** * Подключаем шаблон * Includes a templates */ include './skins/tpl/second/show.tpl';
|
Все, теперь ни одна мышь не проскочит незамеченной. Все данные будут обязательно обработаны. Это мало того, что удобно, так еще и повышает безопасность.
Только один момент, эта обработка должна производиться непосредственно перед подключением шаблона, как не был велик соблазн обработать все сразу на входе. Это приведет к искажению данных.
Поехали дальше. Блок чтения информации. Тут точно также можно обработать сразу весь массив:
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
|
/** * The block of reading of the information * Блок чтения информации */ $posts = getData('./data/'. $GET['num']); include './libs/bb_tags.php'; $rows = ''; foreach($posts as $id => $post) { $post = htmlChars($post); $date = $post['date']; $name = $post['name']; $mess = nl2br(bbTags($post['mess'])); $rows .= '<div class="guest_post">'. $date .' / <strong> '. $name .'</strong><hr width="30%" align="left" /> '. $mess .'</div>';
}
|
Это удобно, но не столь важно. А важно то, что вот и попались нам эти бессовестные html теги, которым совсем не место в контроллере. Их нужно немедленно поместить в шаблон. Вот так:
1
2
3
4
5
6
7
8
9
10
11
|
<!-- skins/tpl/second/rows.html begin -->
<div class="guest_post"> <?php echo $date; ?> / <strong><?php echo $name; ?></strong> <hr width="30%" align="left" /> <?php echo $mess; ?> </div>
<!-- skins/tpl/second/rows.tpl end -->
|
А вот сам этот шаблон запихать в переменную
$rows . Но как это сделать, ведь там переменные, и они должны меняться в каждом витке цикла... А для этого сочиним функцию, которая нам в этом поможет. Поместим её в файл
libs/view.php
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
|
<?php
/** * Library of the views functions * Библиотека функций отображения * @author IT studio IRBIS-team * @copyright © 2009 IRBIS-team */ /////////////////////////////////////////////////////////
/** * Function of analysis of a template * Функция разбора шаблона */ function parseTpl($file, $data = array()) { extract($data);
ob_start(); include $file; $cont = ob_get_contents(); ob_end_clean();
return $cont; } /** * Function of processing of variables for a conclusion in a stream * Функция обработки переменных для вывода в поток */ function htmlChars($data) { if(is_array($data)) // Если данные - массив, вызываем эту же функцию. $data = array_map("htmlChars", $data); else // Если нет, обрабатываем htmlspecialchars() $data = htmlspecialchars($data); // На выход return $data; }
/** * Date formatting * Форматирование даты */ $date = formatDate(date("Y-m-d"), false);
|
Что это за зверь такой. Ну вопервых, сразу оговорочка. Так делать вообще то нежелательно, потому что мы при каждой интерации (витке) цикла вынуждены обращаться к файловой системе. В следующем разделе я покажу, как этого избежать. А пока для наглядности так.
Но по порядку. Функция
extract() разбирает массив на переменные. Теперь (хоть их и не видно) у нас внутри функции определены переменные с названиями, эдентичными ключам массива, и значениями соответственно. Тоесть, если мы передадим в неё массив
1
2
3
4
5
6
7
8
|
array( 'name' => 'Вася', 'mess' => 'Привет!' )
|
то внутри нашей функции, после обработки
extract() образуются переменные
1
2
3
4
5
6
|
$name = 'Вася'; $mess = 'Привет!';
|
которые мы и подставим в подключенный шаблон. А дальше вступает в силу буферизация, и мы получаем шаблон с нужными значениями в виде строки. Которую и выдаем, как результат работы функции. Теперь нужно немного изменить контроллер (блок чтения) и все будет в порядке. Весь вывод - в шаблонах. А логика в контроллере.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * The block of reading of the information * Блок чтения информации */ $posts = getData('./data/'. $GET['num']); include './libs/bb_tags.php'; $rows = ''; foreach($posts as $id => $post) { $post = htmlChars($post); $post['mess'] = nl2br(bbTags($post['mess'])); $rows .= parseTpl('./skins/tpl/second/rows.tpl', $post);
}
|
Вот и всё. Основные принципы я показал. Если есть желание достроить эту гостевуху до полного ажура - теперь Вы знаете, как это делать.
Добавить в общую вьюшку функцию формирования ссылок постранички и организовать такой же модуль админки к примеру.
Лично я не стал бы на Вашем месте тратить на это время и перешел бы к более серьёзным занятиям - следующему разделу.
А вот итог этого занятия.
Возникшие вопросы можно задать
здесь.