AGAVA partners programs http://agava.ru/partners/            

Название функции

             
Веб-курсы


Что это?

Оглавление

Основы
Основы основ

Практика
Гостевая книга
Простой сайт
Структура сайта (MVC)
Ядро (Light)
Ядро
Гостевая на SQL
Статические страницы
Модуль новостей
Система регистрации

Теория
Дебаггинг
Регулярные выражения
Введение в ООП
Паттерны проектирования

Репозитарий
BB-code
Почтовый класс
Пагинатор
Всякие полезности

Download
Полезные утилиты

Разное
Видеокурсы
Последние изменения
Вопросы и замечания сюда



Реклама

Диеты для похудения
Фреймворк Kohana. Обучение. Мануал на русском.







Шаг 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);        

    }

Вот и всё. Основные принципы я показал. Если есть желание достроить эту гостевуху до полного ажура - теперь Вы знаете, как это делать.
Добавить в общую вьюшку функцию формирования ссылок постранички и организовать такой же модуль админки к примеру.
Лично я не стал бы на Вашем месте тратить на это время и перешел бы к более серьёзным занятиям - следующему разделу.

А вот итог этого занятия.

Возникшие вопросы можно задать здесь.

Рейтинг@Mail.ru Рейтинг@Mail.ru Яндекс цитирования
irbis-team © 2009