Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Бип из системно... 62592
Организация зап... 59772
Invision Power ... 59429
Приложение «Про... 58658
Оператор выбора... 57776
Модуль Forms 57716
Подключение Mic... 57062
Создание отчето... 56988
ТЕХНОЛОГИИ ДОСТ... 53281
Программируемая... 51052
Пример работы с... 49163
Имитационное мо... 48763
21 ошибка прогр... 43521
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

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

База данных - рабочее место кассира на Delphi + бд Access
База данных - словарь терминов на Delphi + Пояснительная записка
Моделирование станции технического обслуживания на GPSS + Отчет

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании

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 17:22:57 · 0 Комментариев · 7912 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Программирование ...
isoCanvas (Редакт...
Delphi 2005 для .NET
Task Shedule
Упорядоченный дин...
Программирование ...
Delphi 2005. Разр...
Защита от спама ...
Аватары в комме...
C# Учебный курс
Matrix2D
Запрет гостям ск...
Еext Editor
CABfiles
Язык программиров...
AboutSystem
Основы программир...
БД сеть компьютер...
Реализация ЭЦП по...
База Allsubmitter...

Топ загрузок
Приложение Клие... 100333
Delphi 7 Enterp... 79806
Converter AMR<-... 20025
Borland C++Buil... 10823
GPSS World Stud... 9726
Borland Delphi ... 7846
Turbo Pascal fo... 6910
Visual Studio 2... 4926
Калькулятор [Ис... 4123
FreeSMS v1.3.1 3488
Случайные статьи
Терминология объек...
Стохастические про...
Локхид
5.1. Автоматизация...
Прогиб мембраны
6.5. Создание стр...
Особенности знаний
Изменения в SVR4.1/ES
Удостоверьтесь, чт...
Загрузка объекта W...
Сайты, посвященные...
Поддержка пользова...
Система воспроизве...
свой технический п...
Поднятие тИЦ и PR
Иерархия классов о...
Ушу СПб
Загрязнение объект...
1. Служба DHCP Ser...
«Использование» ша...
Устройства имеют с...
Язык С: инструкции
SMB-подписиSMB-, и...
Нетиповые операции...
Процедура Getlmage...
Статистика



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


  • Стать учеником ведьмы
  • Узнай, к чему снится ведьма. Современный сонник. Читай на сайте
  • империя-сильнейших-ведьм.рф
Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?