Навигация
Главная
Поиск
Форум
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
Бип из системно... 59616
Invision Power ... 58147
Организация зап... 58032
Модуль Forms 56784
Приложение «Про... 55809
Создание отчето... 55575
Оператор выбора... 55295
Подключение Mic... 55215
ТЕХНОЛОГИИ ДОСТ... 51698
Программируемая... 48613
Пример работы с... 47481
Имитационное мо... 47323
21 ошибка прогр... 42303
Реклама
Сыворотка нано ботокс для лица krasotulya.moscow.
Сейчас на сайте
Гостей: 12
На сайте нет зарегистрированных пользователей

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

Моделирование работы аэропорта на GPSS + Пояснительная записка
Моделирование работы ЭВМ на GPSS + Пояснительная записка
Обратное размещение элементов ЭВС на Delphi + Пояснительная записка

Реклама

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 Комментариев · 7591 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Preview
Fig [Исходник на ...
Xrumer 4 Platinum...
Расширенный загру...
Шаблон для новост...
Turbo Pascal for ...
Импорт новостей ...
PHP 5. Полное рук...
39 статьи по Delphi
Blib [Исходник на...
Доступа к БД Fire...
C++ для начинающих
Запрет гостям ск...
Программирование ...
Панель случайной ...
Философия C++. Пр...
OnlineIP
Halcyon
Панель "ссылки"
TMS

Топ загрузок
Приложение Клие... 100289
Delphi 7 Enterp... 76495
Converter AMR<-... 20017
Borland C++Buil... 10576
GPSS World Stud... 9029
Borland Delphi ... 7564
Turbo Pascal fo... 6874
Visual Studio 2... 4884
Калькулятор [Ис... 3909
FreeSMS v1.3.1 3482
Случайные статьи
2-32)
Компоновка данных ...
Микроконтроллер Ad...
Центробежный насос
Какое было принято...
Сигналы RTS и CTS ...
east.microsoft.
Коллекция параметров
Определение вторич...
Что агентство IANA...
ММ С.2.
Подмена функций ст...
Каким должен быть ...
ФУНКЦИИ СТАНДАРТНО...
Редактирование диз...
Получить доступ в ...
Листинг 5.3. Функц...
Прожигатетели врем...
Office 365 уже сег...
Вложения в электро...
Прежде чем перейти...
Маршалер свободной...
Общие подходы к пр...
Физическая установ...
Моделирование банка
Статистика



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


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