Loading
Красноглазым Джедаям
компьютерной вселенной
посвящается.

Шаг первый. Файл view.php

Начинать сайт нужно не с файла index.php, а с написания движка. Под словом Движок имеется ввиду не система управления контентом типа CMS Joomla, а набор файлов, обеспечивающий необходимую функциональность сайта. Систему управления контентом мы создавать вообще не будем, потому что лучше чем в Joomla у нас не получится, а если будем управлять сайтом самостоятельно, то CMS не нужна. Административный модуль добавим после окончания работ над движком. Если сразу нужны исходники, то забираем их в Шаге 9.

Рай, из которого нельзя выйти, превращается в ад.

Разделение логики и представления.

Програмный код должен быть отделен от представления страниц пользователю. То есть код PHP и код HTML должен находиться в разных файлах. Это позволит:

Если знания по PHP ниже среднего либо нулевые, то сначала читаем в книгу Д.Котерова и А.Костарева "PHP5 2-е издание". Потом возвращаемся для дальнейшего изучения материала.

Большинство приведенных здесь методов решения проблем и функций с некоторыми доработками взяты у профессионалов от IRBIS, ну и конечно использованы материалы из этой книги, которая несомненно является бесценной кладезью мудрости для начинающего программиста .

Основная задача языка PHP состоит в динамическом формировании отправляемой браузеру - клиенту HTML разметки. То есть сервер отправляет клиенту полностью готовую страницу. На клиенте код PHP уже не исполняется. Это значит, что в файлы с расширением отличным от .php (например .js или .css или .html) нельзя вставлять PHP код! Из этого и будем пока что исходить. P.S. Мы пока не рассматриваем динамическое подключение шаблонов при помощи инструкции include, и PHP вставки в таких шаблонах.

Создаем библиотеку.

Для начала создадим логическую составляющую сайта, то есть програмный PHP код. Назовем ее "Модель." Основной блок модели составит библиотека. Это набор файлов, обеспечивающих функциональность PHP движка, то есть набор общих для всего сайта PHP функций и переменных.

Для начала создадим папку с именем "libs", где будем размещать две папки библиотек. Теперь в соответствии с постулатом о разделении представления и логики создадим в ней папку "view". В нее будем размещать файлы, отвечающие за обработку представления информации, то есть за правильное формирование выводимых на страницу данных. Теперь создадим папку "model" в которую будем размещать файлы логики, то есть функции, отвечающие за обработку данных, хранимых в базах и файлах.

В папке "view" создадим файл "view.php". В него будем писать общие функции, отвечающие за обработку представления информации.

Обработка данных пользователя.

Прием данных от пользователя нужно обязательно организовать надлежащим образом. Самое необходимое в такой обработке, это исключить передачу специальных символов в необработанном виде, это не только вопрос безопасности, но и вопрос корректного отображения данных, в случае их вывода на странице. В PHP для этого существует функция "htmlspecialchars()". Для удобства создадим к ней функцию обертку с именем htmlChars().

function htmlChars($data) { if(is_array($data)) $data = array_map("htmlChars", $data); else $data = htmlspecialchars($data); return $data; }

В этом коде функция htmlChars() принимает данные $data, проверяет при помощи встроенной PHP функции is_array() полученные данные являются ли они массивом. Если $data содержит массив, то при помощи встроенной PHP функции array_map() каждый элемент массива $data, указанный вторым ее аргументом, передается функции htmlChars() - указанной первым аргументом, где проверка повторяется в глубину вложенных массивов до тех пор, пока переданные в htmlChars() данные будут не массивом. Конечные данные обрабатываются при помощи встроенной PHP функции htmlspecialchars(). Эта обертка позволяет обработать любые полученные от пользователя данные функцией htmlspecialchars($data).

Сразу же применим полученную функцию на практике, то есть обработаем все полученные от пользователя данные. $POST = htmlChars($POST);

$POST это не то же самое что $_POST, но об этом позднее в файле "variables.php". А пока запишем полученную функцию htmlChars() и ее применение $POST = htmlChars($POST); в наш файл "view.php".

Считывание шаблонов.

Наш сайт будет состоять из различных информационных блоков. Например "Главное меню", "Шапка сайта", "Меню в левой колонке", "Комментарии пользователей". Каждый из таких блоков целесообразно вынести в отдельный файл - шаблон и потом при формировании страниц для вывода бережно собрать в единую целую страницу. При этом часто возникает задача не только вставить готовый шаблон, а заполнить его данными из базы данных, после чего многократно вывести готовый шаблон на страницу с вставленными из базы значениями. Примером может служить меню страницы, где каждый пункт сформирован из шаблона, а индивидуальные для текущего пункта данные вставлены из базы. Ну или вывод комментариев пользователей по той же схеме. Контейнер для комментария храним в шаблоне, а комментарии в базе данных. Многократно вставляем в страницу один и тот же шаблон с индивидуальным комментарием.

Считывание шаблонов в переменную и вставка в них нужной информации из базы данных и будет нашей главной задачей. Можно конечно сделать это в цикле при помощи конструкции include, но мы пойдем другим путем. Причина проста - нужно избежать многократного обращения к файловой системе при вставке. Создадим фукцию обертку с именем getTpl().

function getTpl($tpl) { if(file_exists($tpl)) return file_get_contents($tpl); else die('Файл - шаблон '. $tpl .' не найден!'); }

Проверяет при помощи встроенной PHP функции file_exists() наличие файла шаблона $tpl. В $tpl должен быть передан полный путь к файлу, но не сетевой его адрес, а именно путь в файловой системе. Об этом чуть позднее в файле "config.php", чтобы не отвлекаться от темы. Если файл на месте, то считываем его содержимое file_get_contents().

На практике это будет выглядеть примерно так: $tpl = getTpl('comments.html'); Пока запомним принцип, потому что чисто в таком виде функция работать не будет. Допишем ее до рабочего состояния после того как определимся с путями для файлов.

Заполнение шаблонов данными из базы.

Итак мы получили переменную $tpl, в которой содержится наш шаблон. Теперь мы можем вставлять туда данные из базы и многократно вписывать его в страницу. Начнем с вставки данных. Создадим фукцию обертку с именем parseTpl().

function parseTpl($cont, $data = '') { if(is_array($data)) { extract($data, EXTR_PREFIX_ALL, 'tpl'); ob_start(); eval('?>'. $cont .'<?php '); $cont = ob_get_contents(); ob_end_clean(); } return $cont; }

Здесь $count будет содержать шаблон, считанный в строку. $data - необязательный аргумент, поэтому такая форма записи $data = '', содержит массив данных для вставки в шаблон, например это может быть строка из базы данных. Таким образом нужно вызывать указанные функции в паре примерно так: $tpl = getTpl('comments.html'); $content = parseTpl($tpl, $row); Где $row будет содержать строку из базы данных.

Функция проверяет является ли $data массивом при помощи встроенной PHP функции is_array(). Далее массив $data преобразуется в набор переменных с именами ключей массива и значениями значений массива при помощи встроенной PHP функции extract(). При этом имена переменных получат префикс "tpl_". Таким образом был массив: data["key1"] = "value1"; data["key2"] = "value2"; Стал набор переменных: $tpl_key1 = "value1"; $tpl_key2 = "value2";

В шаблоне в местах вставки будет код <?php echo $tpl_key1; ?> <?php echo $tpl_key2; ?> Переменные следует называть так же как поля в таблице базы данных. В данном случае поля базы будут соответственно называться "key1" и "key2".

Далее запускается буферизация ob_start() и функция eval() исполнит нашу строку $cont, содержащую считанный шаблон как PHP код, вставив соответствующие значения переменных. Особое внимание нужно обратить на вставку закрывающего тэга PHP: eval('?>'. $cont .'<?php ');. Без него шаблон сразу будет интерпретироваться как код PHP. А там у нас обычный HTML код с PHP вставками. Попытка интерпретатора исполнить HTML код неминуемо приведет к ошибке. Буферизация необходима потому, что без нее eval() выдает результаты своей работы прямо в поток документа, а это приведет нас к краху нашей идеи, потому что нам нужен результат в переменной. Получим его при помощи $cont = ob_get_contents();. То есть мы фактически переписываем заново значение переменной $cont новыми данными с вставленными из базы значениями. ob_end_clean(); закроет текущий контекст буфера. А return $cont; позволит нам собирать итоговую строку из результатов работы функции.

$comments = '';//в эту строку соберем шаблоны с результатами выборки из базы if(mysql_num_rows($rscart)>0)//если в базе были данные {$tpl = getTpl('comments_text.tpl');//считываем шаблон while($row = htmlChars(mysql_fetch_assoc($rscart)))//выбираем данные построчно { $comments .= parseTpl($tpl,$row);//вставляем заполненный шаблон } } $rscart содержит результат выборки из базы данных. $row содержит массив с результатами выборки каждой строки базы данных. И мы уже видим знакомые нам функции в реальном деле!

Запишем функцию parseTpl() в наш файл "view.php". Мы еще не закончили с этим файлом. Продолжим в Шаге 2.


Контактная информация

E-Mail: oleynikww@gmail.com

Добавить комментарий

Комментарии пользователей