PHP, използващ XML функции за прехвърляне с шаблони

Въпреки че идеята за разделяне на код и данни не е нова, тя остава актуална. Удобството е неоспоримо - тъй като хората, които променят данните, често не се нуждаят от достъп до кода.

В PHP синтаксисът на езика не се основава на въвеждането на код в данните и в тази статия ще разгледаме един от доста удобните начини за разделянето им. Методът ще се основава на езика XML.

Нека разгледаме следния проблем: Имаме много клиенти и почти всеки от тях иска да види книга за гости на сайта си. Вече ни писна всеки път да променяме изходния текст на книгата за гости. И няма съмнение, че грешката, която открихме при инсталирането на книгата за гости за осемнадесети път, трябваше да бъде коригирана от ръцете на предишните седемнадесет сайта.

За да избегнете този проблем, е необходимо да отделите данните от кода. Бихме искали външният вид на книгата за гости да се съхранява в отделен файл, динамичните данни (записи) да се съхраняват в базата данни, а кодът в отделна директория.

Така че бихме могли бързо да поправим грешката, която направихме, като просто заменим стария код с новия, докато оригиналният дизайн ще бъде запазен.

Нека опишем шаблона на книгата за гости с помощта на XML, както следва:

xml версия = "1.0" кодиране = "windows-1251" ?>

Всеки шаблон се състои от основен раздел, който може да съдържа раздел, описващ един запис в книгата за гости.

Освен това може да има един таг, на мястото на който ще бъде вмъкнат документът, описан чрез свойството url, например:

По-долу е съкращение на схемата на описания документ:

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

В PHP 4.3.1 (и вероятно по-ранни) функциите на XML Parser се поддържат по подразбиране.

Нека да продължим директно към писането на програма - манипулатор на шаблони.

Първо четем шаблона в променливата $xmldata:

Пропусната връзка с MySql сървър

В променливата $html ще покажем резултата от нашия скрипт. В самия край просто ще отпечатаме $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 (! xml_parse ( $xml_parser , $xmldata )) $error = sprintf ( "Грешка в шаблона: %s на ред %d" , xml_error_string ( xml_get_error_code ( $xml_parser )), xml_get_current_line_number ( $xml_parser )); умри(); >

Сега разгледайте основната част - това са три манипулаторни функции:

* startElement() * endElement() * characterData()

В глобалната променлива $ce запомнете името на тага, който се обработва, така че в манипулатора characterData() да знаем към кой елемент от масива $TMPL да добавим съдържанието.

функция startElement ($parser, $name, $attrs) GLOBAL $ce, $TMPL, $html;

switch ( $name ) case "INCLUDE" : $html .=@ implode ( "" ,@ file ( $attrs ["URL" ])); почивка; > $TMPL [ $name ]= "" ; $ce = $име; >

функция 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 [ "име"], $t); $t = str_replace ( "__EMAIL__", $D [ "имейл"], $t); $t = str_replace ( "__COMMENT__", $D [ "коментар"], $t); $html .= $t ; > почивка; > $ce = "" ; >

функция characterData ($parser, $data) GLOBAL $ce, $TMPL, $html;

switch ( $ce ) case "RECORD" : $TMPL [ $ce ].= $data; почивка; по подразбиране: $html .= $data; > >

Това е като всичко. Ако сте запознати с „XML парсер функциите“, тогава препоръчвам да изучите „XSLT функции“ и „DOM XML функции“. Те ще ви помогнат да разрешите подобни проблеми.