Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 22
На сайте нет зарегистрированных пользователей

Пользователей: 13,372
новичок: vausoz
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных - словарь терминов на Delphi + Пояснительная записка
База данных студентов на Delphi + Microsoft SQL Server
Компьютерный магазин на Turbo Pascal (База данных) + Пояснительная записка

PHP: Использование XML Paser Functions при работе с шаблонами
Несмотря на то, что идея разделения кода и данных не нова, она сохраняет свою актуальность. Удобство неоспоримо - так как люди изменяющие данные зачастую не должны иметь доступ к коду.

В PHP синтаксис языка основан не внедрении кода в данные и в этой статье мы рассмотрим один из достаточно удобных способов их разделения. Способ будет основываться на языке XML.

Рассмотрим следующую задачу: У нас есть много клиентов, и практически каждый из них, желает видеть на своем сайте гостевую книгу. Каждый раз изменять исходный текст гостевой книги нам уже поднадоело. И речи уже не идет о том, что ошибку, которую мы нашли, устанавливая гостевую книгу в восемнадцатый раз пришлось рукам исправлять в на предыдущих семнадцати сайтах.
Данные:

Для того, чтобы избежать подобной проблемы, необходимо данные отделить от кода. Нам бы хотелось чтобы внешний вид гостевой книги хранился в отдельном файле, динамические данные (записи) хранились в базе данных, а код в отдельном каталоге.

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

Опишем шаблон гостевой книги с помощью XML следующим образом:
<?xml version="1.0" encoding="windows-1251"?>

<guestbook>
<include url="../top.html" />

<![CDATA[
<H3>Гостевая книга - место для трепа</H3>
<table width=100% cellspacing=5><tr><td>
<br><center>
]]>

<record><![CDATA[
<table cellpadding=7 cellspacing=0 bgcolor=#F0F8F8 width=95%>
<tr bgcolor=#E0F0F0><td>__NAME__
(<a href=mailto:__EMAIL__>__EMAIL__</a>)</tr>
<tr><td>__COMMENT__
</td></tr>
</table>
<br>
]]></record>

<![CDATA[
<br>
<center><BR><font face=Verdana size=2>
<A href=/add/>Добавить запись (Add record)</A>
</font></center>
</td></tr></table>
]]>

<include url="../bottom.htm />

</guestbook>

Каждый шаблон состоит их основной секции <guestbook></guestbook> внутрь которой может помещаться секция <records></record> описывающая одну запись в гостевой книге.

Кроме того, там может находится одиночный тег <include />, не место которого будет вставлен документ описанный с помощью свойства url, например:
<include url="../bottom.htm />

Ниже приведена сокращения схема описанного документа:
<?xml version="1.0" encoding="windows-1251"?>

<guestbook>
<include url="../top.html" />
<record>
тело одной записи
</record>
<include url="../bottom.htm />
</guestbook>
Код:

Осталось малость - написать программу, которая превратит описанный выше шаблон в HTML документ, содержащий как внешнее оформление, так и динамически изменяемые данные (записи в гостевой книге)

Для обработки шаблона мы будем использовать XML Parser functions (http://www.php.net/manual/en/ref.xml.php). Это расширение PHP предоставляет доступ к функциям библиотеки Expat, автором которой является Джеймс Кларк (James Clark). Библиотека Expat написана на языке C и предназначенная для разбора XML документов основанного на событиях. Она не проверят XML документ на ошибки и не работает с объектой моделью XML документа, так как это делают некоторые другие библиотеки (например tinyXML)

В версии PHP 4.3.1 (а возможно, что и в более ранних) XML Parser functions поддерживаются по умолчанию.

Перейдем непосредственно к написанию программы - обработчика шаблона.

Сначала считаем шаблон в переменную $xmldata:
<?
$xmldata=implode("",file("template.xml"));
// Ассоциативный массив - хранит данные, соответствующие тегам.
$TMPL=Array();
// Обрабатываемый тег
$ce="";
/*

...

пропущено подключение к серверу MySql

...

*/

$result=mysql_query("SELECT * FROM guestbook_database");

В переменную $html мы будет выводить результат работы нашего скрипта. В самом конце мы сделаем просто print $html;
$html="";

Создаем объект обработчик XML документа
$xml_parser = xml_parser_create();

Задаем ему опции и обработчики. Функция startElement() будет вызываться, когда в XML документе встретится открывающийся тег. Функция endElement() будет вызываться, когда будет встречен закрывающий тег. Для данных (то, что внутри тега) будет вызываться функция characterData() xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData");

Вызовем обработчик XML документа
if (!xml_parse($xml_parser, $xmldata)) {
$error=sprintf("Ошибка в шаблоне: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser));
die();
}

xml_parser_free($xml_parser);

Вывод данных
print $html;

Теперь рассмотрим основную часть - это три функции-обработчика:
startElement()
endElement()
characterData()

В глобальной переменной $ce запомним название обрабатываемого тега, чтобы в обработчике characterData() знать к какому элементу массива $TMPL дописывать содержимое.
function startElement($parser, $name, $attrs) {
GLOBAL $ce,$TMPL,$html;

switch ($name) {
case "INCLUDE":
$html.=@implode("",@file($attrs["URL"]));
break;
}
$TMPL[$name]="";
$ce=$name;
}


function endElement($parser, $name) {
GLOBAL $ce,$TMPL,$result,$html;

switch ($name) {
case "RECORD":
while ($D=mysql_fetch_array($result)) {
$t=$TMPL["RECORD"];
$t=str_replace("__NAME__",$D["name"],$t);
$t=str_replace("__EMAIL__",$D["email"],$t);
$t=str_replace("__COMMENT__",$D["comment"],$t);
$html.=$t;
}
break;
}
$ce="";
}


function characterData($parser, $data) {
GLOBAL $ce,$TMPL,$html;

switch ($ce) {
case "RECORD":
$TMPL[$ce].=$data;
break;
default:
$html.=$data;
}
}

Вот вроде и все. Если вы разобрались с "XML parser functions", то рекомендую изучить "XSLT functions" и "DOM XML functions". Они вам помогут решить подобные задачи.
Опубликовал Kest November 02 2008 14:22:57 · 0 Комментариев · 10585 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Battle.Net - мони...
Пример работы с р...
CaptionButton
Crypt32
JanReplace
32 урока по Delphi
Программирование ...
Дешифратор содерж...
C++ Builder 6 СПР...
C# 2005 и платфор...
MiniChat
BSButton
Swat [Исходник на...
Создание оригинал...
VFW
Delphi 6. Учебный...
Черный круг двига...
Flash MP3 Player ...
Работа с матрицами
Delphi World 6.0

Топ загрузок
Приложение Клие... 100795
Delphi 7 Enterp... 98040
Converter AMR<-... 20299
GPSS World Stud... 17061
Borland C++Buil... 14250
Borland Delphi ... 10377
Turbo Pascal fo... 7393
Калькулятор [Ис... 6084
Visual Studio 2... 5236
Microsoft SQL S... 3674
Случайные статьи
Определяя переменн...
Установка основных...
Структуры данных н...
Программа формиров...
Настройка окон раб...
INLINE error
Упорядочить по воз...
Отдых и развлечения
Бизнес
3. Как внедрение D...
Коллекция диалогов
Кроме того, устано...
Онлайновая инфогра...
Завершение установ...
Модульность програ...
Онлайновая инфогра...
ПОСТРОЕНИЕ ЭКСПЕРТ...
Резюме
Программирование п...
Волновой алгоритм ...
Нам нужна такая ре...
Как мне пометить с...
Использование комп...
Сообщения имеют сл...
Работа с сообщением
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?