PHP 4 на практике

         

Вывод файла


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

файла создается отдельный метод, приведенный в листинге 12.5, однако в зависимости от ситуации вывод также может интегрироваться с методом f i I e_parser().

Листинг 12.5. Метод вывода файла в браузере

function pnnt_file($file_id) {


// Вывести содержимое файла с идентификатором

$file_id print $this->files[$file id];

}

Все очень просто — при вызове print_file( ) содержимое файла, представленного ключом $file_id, передается в браузер.

В листинге 12.6 приведен пример использования класса template.

Листинг 12.6. Пример использования класса template

// Включить класс шаблона, include("tempiate.class");

// Присвоить значения переменным

$page_title = "Welcome to your homepage!";

$bg_color = "white"; $user_name = "Chef Jacques":

// Создать новый экземпляр класса $template= new template;

// Зарегистрировать файл "homepage.html" с псевдонимом "home"

$template->register_file("home", "homepage.html");

// Зарегистрировать переменные

$template->register_variables("home", "page_title, bg_color.user_name");

$template->file_parser("home");

// Передать результат в браузер

$template->print_file("home");

Если бы шаблон, приведенный в листинге 12.1, хранился в файле homepage.html в одном каталоге со сценарием из листинга 12.6, то в браузер был бы направлен следующий код HTML:

<html>

<head>

<title>:::::Welcome to your homepage!:::::</title>

</head>

<body bgcolor=white>

Welcome to your default home page, Chef Jacques!<br>

You have 5 MB and 3 email addresses at your disposal.<br>

Have fun!

</body>

</html>

Как видно из приведенного примера, все зарегистрированные переменные были заменены соответствующими значениями. При всей своей простоте класс tempi ate

обеспечивает стопроцентное разделение уровней программирования и дизайна. Полный код класса template приведен в листинге 12.7.

Листинг 12.7. Полный код класса template

class template {

VAR $files = array( );

VAR $variables = array( );

VAR $opening_escape = '{';

VAR $closing_escape = '}' ;

// Функция: register_file( )

// Назначение: сохранение в массиве содержимого файла.

// определяемого идентификатором $file_id

function register_file($file_id. $file_name) {

// Открыть $file_name для чтения или завершить программу

// с выдачей сообщения об ошибке.

$fh = fopen($file_name, "r") or die("Couldn't open $file_name!");

// Прочитать все содержимое файла $file_name в переменную.

$file_contents = fread($fh, filesize($file_name));

// Присвоить содержимое элементу массива

// с ключом $file_id. $this->files[$file_id] = $file_contents;

// Работа с файлом завершена, закрыть его.

fclose($fh):

} // Функция: register_variables( )

// Назначение: сохранение переменных, переданных

// в параметре $variable_name. в массиве с ключом $file_id.

function register_variables($file_id, $variable_name) {

// Попытаться создать массив.

// содержащий переданные имена переменных

$input_variables = explode(".", $vahable_name);

// Перебрать имена переменных

while (list(, $value) = each($input_variables)) :

// Присвоить значение очередному элементу массива $this->variables $this->variables[$file_id][] = $value:

endwhile;

} // Функция: file_parser( )

// Назначение: замена всех зарегистрированных переменных

// в файле с идентификатором $file_id

function file_parser($file_id) {

// Сколько переменных зарегистрировано для данного файла?

$varcount = count($this->variables[$file_id]):

// Сколько файлов зарегистрировано?

$keys = array_keys($this->files):

// Если файл $file_id существует в массиве $this->files

// и с ним связаны зарегистрированные переменные

if ( (in_array($file_id. $keys)) && ($varcount > 0) ) :

// Сбросить $х $x - 0;

// Пока остаются переменные для обработки...

while ($x < sizeof($this->variables[$file_id])) :

// Получить имя очередной переменной

$string = $this->variables[$file_id][$x];

// Получить значение переменной. Обратите внимание:

// для получения значения используется конструкция $$.

// Полученное значение подставляется в файл вместо

// указанного имени переменной.

GLOBAL $$string;

// Построить точный текст замены вместе с ограничителями

$needle = $this->opemng_escape.$string.$this->closing_escape;

// Выполнить замену.

$this->files[$file_id] = str_replace( $needle, $$string,

$this->files[$file_idj);

// Увеличить $х $x++;

endwhile;

endif;

}

// Функция: print_file()

// Назначение: вывод содержимого файла,

// определяемого параметром $file_id

function print_file($file_id) {

// Вывести содержимое файла с идентификатором $file_id

print $this->files[$file_id];

}

} //END template.class

Содержание раздела