PHP Використання XML Paser Functions під час роботи з шаблонами
Незважаючи на те, що ідея поділу коду та даних не нова, вона зберігає свою актуальність. Зручність незаперечна - оскільки люди, що змінюють дані, часто не повинні мати доступ до коду.
У PHP синтаксис мови заснований на впровадженні коду в дані і в цій статті ми розглянемо один із досить зручних способів їх поділу. Спосіб буде базуватися на мові XML.
Розглянемо таке завдання: У нас є багато клієнтів, і практично кожен з них бажає бачити на своєму сайті гостьову книгу. Щоразу змінювати вихідний текст гостьової книги нам уже набридло. І мови вже не йдеться про те, що помилку, яку ми знайшли, встановлюючи гостьову книгу у вісімнадцятий раз довелося рукам виправляти на попередніх сімнадцяти сайтах.
Щоб уникнути подібної проблеми, необхідно дані відокремити від коду. Нам хотілося б, щоб зовнішній вигляд гостьової книги зберігався в окремому файлі, динамічні дані (записи) зберігалися в базі даних, а код в окремому каталозі.
Так, ми могли б швидко виправити помилку простою заміною старого коду на новий, при цьому збереглося б оригінальне оформлення.
Опишемо шаблон гостьової книги за допомогою XML так:
xml version = "1.0" encoding = "windows-1251" ?>
Кожен шаблон складається з їхньої основної секції всередину якої може поміщатися секція, що описує один запис у гостьовій книзі.
Крім того, там може бути одиночний тег , не місце якого буде вставлений документ описаний за допомогою властивості url, наприклад:
Нижче наведено скорочення схема описаного документа:
Залишилося трохи - написати програму, яка перетворить описаний вище шаблон на HTML документ,містить як зовнішнє оформлення, так і дані, що динамічно змінюються (записи в гостьовій книзі)
У версії PHP 4.3.1 (а можливо, що і раніше) XML Parser functions підтримуються за замовчуванням.
Перейдемо безпосередньо до написання програми – обробника шаблону.
Спочатку вважаємо шаблон у змінну $xmldata:
пропущено підключення до сервера MySql
У змінну $html ми виводитимемо результат роботи нашого скрипта. Наприкінці ми зробимо просто print $html;
Створюємо об'єкт обробник XML документа
Задаємо йому опції та обробники. Функція 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(! ); die(); >
Тепер розглянемо основну частину – це три функції-обробники:
* 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". Вони допоможуть вам вирішити подібні завдання.