РНР программирование

 

 Главная        Программа телепередач, энциклопедии и многие другие справочные материалы

 

     стр.  1. 2. 3. 4. 5. 6. 7. 8.

for ($i=0;$i<sizeof($matches[1]);$i++)

    {

// Преобразуем все escaped символы в нормальные. Символ разделения ' ' при этом

// заменяем на символ с кодом 0x01, чтобы не перепутать.

        $match = strtr(strtr($matches[1][$i],array('  '=>"\x02",' '=>"\x01")),"\x02",' ');

// Проверяем, что из себя представляет строка, которую мы пытаемся обработать

        if (strpos($match,"\x01")!==false)

// Эта строка содержит в себе несколько частей. Это значит, что кроме имени эта

// строка содержит какие-то параметры, которые требуют дополнительной обработки.

            {

// Поскольку основная синтаксическая структура у нас состоит из 2 частей - имени

// и значения по-умолчанию - получаем эти две основные части в виде отдельных переменных

                list($key,$default) = explode("\x01",$match,2);

// Исправляем regular expression для дальнейшей замены

                $matches[0][$i] = "/\{$key\ [^\}]+\}/";

// Проверяем, чем является параметр, переданный внутри темплейта. Если он начинается

// с одного из специальных символов, то необходима дополнительная обработка этого значения.

// Однако это необходимо делать толлько в случае, если в переданных в функцию данных для

// замены нет текста для этой подстановки (потому что данные, переданные в качестве

// аргумента имеют более высокий приоритет).

                if ((in_array($default[0],array('#','!'))) && (!isset($params[$key])))

                {

// Получаем список аргументов. Первый символ отбраcываем, потому что это признак

// спеуиальной обработки и не относится к имени.

                    $words = explode("\x01",substr($default,1));

// Поскольку первым в полученном списке стоит имя, которое будет использоваться

// обработчиком - берем его в отдельную переменную и убираем из массива аргументов.

// Теперь в массиве $words - только список аргументов.

                    $name = array_shift($words);

// Проверяем, если количество аргументов - нечетное (т.е. нам необходим еще один, поскольку

// все аргументы рассматриваются как пары "имя-значение"), то добавляем пустую строку.

                    if ((sizeof($words)%2)!=0)

                        $words[] = '';

// Формируем массив параметров. Он должен быть в том же виде, в котором он передается

// в данную функцию (т.е. имя параметра задается в виде ключа ассоциативного массива).

                    $params = array();

                    for ($j=0;$j<sizeof($words);$j+=2)

                        $params[$words[$j]] = $words[$j+1];

                    if ($default[0]=='#')

// Символ '#' указывает на необходимость вставки темплейта с заданным именем

                        $default = insertTemplate($GLOBALS[$name],$params);

                    elseif ($default[0]=='!')

// Символ '#' указывает на необходимость вставки результатов работы пользовательской

// функции с заданным именем

                        $default = call_user_func($name,$params);

                };

// Если в списке текстов для подстановки, переданных в качестве параметра в эту функцию,

// есть текст для подстановки с таким же именем, то используем его, потому что параметры,

// переданные в качестве аргумента имеют более высокий приоритет. Если же такого текста

// нет, то используем текст, имеющийся у нас в качестве значения.

                $replaces[] = (isset($params[$key]))?$params[$key]:$default;

            }

        elseif ($match=='l')

// Эта строка - escaping для левой фигурной скобки, имеющей специальное значение.

            $replaces[] = '{';

        elseif ($match=='r')

// То же самое для правой фигурной скобки

            $replaces[] = '}';

        else

// Эта строка имеет только имя. Если в списке текстов для подстановки, переданных

// в качестве параметра в эту функцию, есть текст для подстановки с таким именем,

// то используем его, в противном случае используем в качестве замены пустую строку.

            $replaces[] = (isset($params[$match]))?$params[$match]:"";

    };

// Теперь у нас есть все необходимые данные и мы можем выполнить замену. Поскольку все

// строки, которые необходимо заменить в данном темплейте сконвертированы в регулярные

// выражения - необходимо просто выполнить замену по имеющимся массивам. Кроме того

// здесь же мы возвращаем нормальные значения escaped символам, которые мы убирали в начале.

    return(strtr(preg_replace($matches[0],$replaces,$template),array("\x03"=>'{',"\x04"=>'}')));

};

?>

Теперь посмотрим, как можно сгенерировать ту же самую простейшую страничку, используя приведенную выше функцию.

Файл templates.php содежит описание всех необходимых темплейтов. Очень похоже на предыдущий вариант этого файла, но здесь в темплейтах используется описанный выше синтаксис для вставки текста.

<?php

// Основной темплейт для страницы

$tplPage = <<<HTML

<html>

<head>

        <title>{title}</title>

</head>

<body>

        {menu #tplMenu}

        {content #tplContent}

        {footer #tplFooter}

</body>

</html>

HTML;

// Темплейт для меню сайта

$tplMenu = <<<HTML

<table width="100%" border="0" cellspacing="0" cellpadding="1">

        <tr>

                {menuItems !createMenu}

        </tr>

</table>

HTML;

// Темплейт для пункта меню для меню сайта

$tplMenuItem = <<<HTML

        <td><a href="{url}">{name}</a></td>

HTML;

// Темплейт для основного content'а страницы

$tplContent = <<<HTML

<p>{content !createPageContent}</p>

HTML;

// Темплейт footer'а сайта

$tplFooter = <<<HTML

<p>{footer (с) 2001 Вася Пупкин}</p>

HTML;

?>

Файл index.php содержит сам код построения страницы

<?php

// Подгружаем все необходимые файлы

include('templates.function.php');

include('templates.php');

// Заголовок страницы

$title = 'Простейшая страничка';

// Содержимое меню

$menu = array(

        array('page1.php','Страница 1'),

        array('page2.php','Страница 2'),

        array('page3.php','Страница 3')

);

// Content страницы

$content = 'Динамический content страницы';

// Функция генерации меню сайта. Она вызывается парсером темплейтов

// во время обработки темплейта $tplMenu.

function createMenu()

{

        global $menu;

   $html = '';

// Вся генерация содержимого меню сводится все к тому же вызову парсера темплейтов.

// При этом в качестве аргументов передаются данные для каждого из имеющихся пунктов меню.

 foreach($menu as $item)

                $html .= insertTemplate($GLOBALS['tplMenuItem'],array('url'=>$item[0],'name'=>$item[1]));

        return($html);

};

// Функция генерации содержимого страницы. В нашем случае она просто возвращает переменную.

function createPageContent()

{

        return($GLOBALS['content']);

};

// Как видите, после всех подготовительных шагов весь код программы сводится к одной строчке :-)

// Мы просто вызываем парсер темплейтов для обработки основного темплейта страницы, а все

// необходимые связи между темплейтами у нас прописаны непосредственно внутри них, что позволит

// впоследствии легко изменить их не меняя кода. Что, собственно, нам и требовалось.

echo insertTemplate($tplPage,array('title'=>$title));

?>

Как видите - код становится намного более компактным и логичным с применением темплейтов. И, кроме того, даже такая простейшая система обработки темплейтов значительно упрощает вам работу. Вы получаете возможность контролировать отдельно логику программы и отдельно - ее визуальную часть, чего мы, собственно, и добивались.

Кстати, эту функцию можно применять не только для генерации HTML (все же она слишком проста для этого), а и для других целей. Например таких, как генерация e-mail. Ведь иногда бывает необходимо сгенерировать текст письма по шаблону, добавив в него какую-то информацию. Использование этой простой функции поможет вам решить эту задачу быстро и легко.

Системы работы с темплейтами

Как я уже говорил - приведенная мной в предыдущем разделе функция для обработки темплейтов слишком проста, чтобы претендовать на роль реальной системы, пригодной для практического использования. Но в интернете вы можете обнаружить множество подобных систем разной степени "навороченности". Я приведу лишь несколько:

Исторически одной из самых первых подобных систем была FastTemplate. Она написана еще для PHP3 и на данный момент, похоже, уже не поддерживается. Все остальные варьируются по сложности и мощи поддерживаемого ими синтаксиса внутри темлейтов, а также наличием дополнительных сервисов.

Самой мощной системой на данный момент похоже является Smarty. Кроме достаточно мощного и гибкого языка (а столь развитый синтаксис иначе как языком назвать по-моему просто нельзя) она имеет и еще рад особенностей, выделяющих ее из всего ряда систем обработки темплейтов, имеющихся на данный момент. Самой замечательной ее особенностью является возможность "компиляции" темплейтов непосредственно в PHP скрипты! Т.е. однажды выполнив парсинг темплейта Smarty генерирует PHP скрипт, который в дальнейшем выполняет ту же работу значительно быстрее.

Поскольку сам я не пользуюсь ни одной из систем обработки темплейтов, предпочитая XML-технологии, я предоставляю вам возможность самим попробовать и сравнить различные системы и выбрать ту, которая наиболее подойдет именно вам.

Напомню, что вы можете скачать исходные тексты всех примеров, приведенных в этой статье в виде ZIP архива.

Заключение

В этом выпуске мы рассмотрели один из наиболее важных механизмов, необходимых при создании любого более-менее большого проекта. Однако, несмотря на все свои достоинства механизмы темплейтов имеют и свои недостатки. Один из основных - отсутствие какой-либо стандартизации синтаксиса между различными системами обработки темплейтов. Каждый автор как првило придумывает свой собственный "самый лучший и удобный" синтаксис и в результате эти системы живут каждая сама по себе.

В дальнейшем мы рассмотрим альтернативу системам темплейтов - технологии XML и XSLT. Эти технологии являются стандартами W3C и, следовательно имеют серьезную поддержку, огромное количество документации и примеров, большое количество программ для работы с данными в этих форматах, их создания, проверки и т.п. PHP тоже имеет расширения для работы с этими технологиями и в будующих выпусках мы рассмотрим, как можно использовать эти технологии для генерации динамических web-страниц.

 

 

Введение

Представленная библиотека представляет собой очередную попытку отделить содержание от оформления. Основная идея не нова - использовать специальное оформление внутри статического HTML-текста, что позволит при обработке этого текста заменить специально оформленные разделы на динамически формируемые данные из PHP-скрипта. Другими словами, мы создаем свой собственный "стиль разметки" HTML-текста, а затем этот специально подготовленный HTML-текст обрабатывается из PHP-скрипта. Простейший пример: требуется показывать на сайте текущую дату. Естественно, что сами данные (день, месяц, год, время) будут меняться, поскольку формируются динамически, однако их оформление, скорей всего, будет одним и тем же (предположим, большая синяя надпись в красной рамке). Самым удобным решением - каким-то образом "подсказать" PHP-скрипту, где именно нужно вывести данные, не касаясь стиля их оформления. Для этого в представленной библиотеки используются как простые замены (специальные последовательности символов), так и специальные HTML-теги.

Подключение библиотеки

Наверх

Для того, чтобы PHP-скрипт мог использовать библиотеку, в нем должны быть две строчки:

// путь к файлам библиотеки из исполняемого PHP-скрипта

define('INCLUDE_DIR',  'parse/');

 

// инициализация библиотеки

require_once(INCLUDE_DIR.'init.inc.php');

Принципы работы и основные функции-обработчики

Наверх

Библиотека работает так же, как и все остальные библиотеки, занимающиеся парсингом HTML-текста, с добавлением в этот текст данных, полученных из PHP-скрипта :

  • Функция "parseStr" - ищет в исходной строке все вхождения вида

<#имя_переменной#>

и заменяет их переменными или константами из PHP-скрипта с совпадающими именами (имена переменных и констант case-sensitive).
Например, если в PHP-скрипте существует такая запись:

$var = '1234';

то при вызове в этом PHP-скрипте функции "parseStr", все вхождения вида <#var#> в исходной строке будут заменены на значение переменной $var:

// инициализация переменной $var

$var = '1234';

 

// вызов функции "parseStr"

echo parseStr('Variable $var has value <#var#>');

 

// результат работы функции "parseStr"

Variable $var has value 1234

Аналогичным образом подставляются значения констант:

// инициализация константы MY_CONST

define('MY_CONST', 1234);

 

// вызов функции "parseStr"

echo parseStr('Constant MY_CONST has value <#MY_CONST#>');

 

// результат работы функции "parseStr"

Constant MY_CONST has value 1234

ПРИМЕЧАНИЕ: Символы начала переменной/константы ( <# ) и символы окончания переменной/константы ( #> ) могут быть изменены двумя способами:

    • изменить значения соответствующих констант в файле "const.inc.php":

o    // новые параметры начала и окончания переменных/констант в PHP-скрипте

o    define('DEFAULT_VARNAME_START', '{');

define('DEFAULT_VARNAME_END', '}');

    • изменить правила парсинга, вызвав функцию "init":

o    // новые параметры начала и окончания переменных/констант в PHP-скрипте

o    $new_pars = array('varstart' => '{', 'varend' => '}');

o     

o    // изменить правила парсинга

$GlobalParser->init($new_pars);

  • Функция "parseFile" - считывает содержимое файла в строку, после чего эта строка передается на обработку функции "parseStr", и
  • Функция "parseTag" - обрабатывает теги специального вида. Мы будем называть эти теги "callback-тегами".

главная                                                                                                                   стр.  1. 2. 3. 4. 5. 6. 7. 8.

 

1. Что такое PHP?

1. 1. Применение РНР при программировании сайтов

1.2. Программа регистрации и авторизации на вашем сайте

1.3. Программа регистрации и авторизации на сайте с шифрованием пароля

2. Глава посвящена программированию
вообще и программированию в частности
сайтов

3. MySQL элементы управления и взаимодействие с PHP

4. Русский перевод файла "httpd.conf" Для Apache 2.0

5. Русский перевод файла "php.ini"