Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

Шаблонизатор PHP

#1 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0
0

Отправлено 28 Апрель 2009 - 00:16

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

<html>
<head>
$header
$meta
</head>
<body>
<div>$head</div>
<div>$content</div>
<div>$footer</div>
</body>
</html>


И каким образом сформированные данные поместить в этот шаблон?

 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 28 Апрель 2009 - 01:02

Зачем в шаблон помещать данные, нам легче из него эти данные забирать. Но нужно учесть, чтобы шаблонные вставки не перекликались с остальным текстом файла(тем же кодом HTML)
Для того чтобы вытащить нужный нам шаблон можно использовать file_get_contents(). Затем нам нужно пройтись по возвращенной строке(файлу) и заменить шаблонные вставки на их эквиваленты. Пример ниже:

document.tpl
<html>
<head>
</head>
<body>
Вставка 1: <%vstavka_1%><br>
Вставка 2: <%vstavka_2%><br>
Вставка 3: <%vstavka_3%><br>
.........................................................
Вставка N: <%vstavka_N%><br>
</body>
</html>


functions.php
// простейшая функция шаблонизации
function parseTpl($file, $macros) {
$info = file_get_contents($file);
foreach($macros as $key=>$value)
{
$info = str_replace("<%$key%>", $value, $info);
}
$info = ereg_replace("<%[a-zA-Z0-9_-]*%>", "", $info);
return $info;
}


Файл, который всё собирает:
Вариант без БД without_db.php
include_once "functions.php";

$html = "";
$parse = array(
"vstavka_1" => "Текст1",
"vstavka_2" => "Текст2",
"vstavka_3" => "Текст3",
....................................
"vstavka_N" => "ТекстN",
);

// вызываем обработчик шаблона
$html = parseTpl("document.tpl", $parse);

//можем продолжать собирать дальше... другие шаблоны присоединять и т.д.

// печатаем собранный шаблон
echo $html;


Вариант c БД with_db.php
Тогда структура таблицы: table(vstavka_1,vstavka_2,vstavka_3,...,vstavka_N);
include_once "mysql.php";// подключение к БД
include_once "functions.php";

$html = "";

$resource = mysql_query([query]);
while($array = mysql_fetch_array($resource))
{
$html .= parseTpl("document.tpl", $array);
}

//можем продолжать собирать дальше... другие шаблоны присоединять и т.д.

// печатаем собранный шаблон
echo $html;

  • 0

#3 Dengere_Ash

Dengere_Ash
  • Пользователь
  • 27 сообщений
  • Репутация: 0

Отправлено 29 Апрель 2009 - 12:08

gaaarfild, думаю, что проше будет написать php код со вставками HTML'a.

<?php 
require "./head.html";
$meta = "<meta http-equiv='content-type' type='text/html, charset=windows-1251' />";
$content = "bla-bla-bla";
$footer = require("./footer.html");
?>

  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 29 Апрель 2009 - 15:12

Dengere_Ash, зря вы так... Я не думаю, что gaaarfild не знает как включать файлы в исполняемые. Он хотел именно понять работу шаблонизаторов.
  • 0

#5 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 19 Октябрь 2009 - 03:34

Dengere_Ash
ZiToss прав. Этот способ-то я знаю.

Кстати, возник еще один вопрос. В этим шаблонизатором небольшая проблема при использовании AJAX. Когда нужно обновить какую-то информацию в поле с помощью него, а именно, отобразить что либо, он отображает не только эти данные, но и весь шаблон. Тоесть есть например Блок <div></div> В него надо написать после срабатывания скрипта AJAX - Успешно. Но в него отображается весь шаблон полностью а не только надпись "Успешно".

gaaarfild, думаю, что проше будет написать php код со вставками HTML'a.

$footer = require("./footer.html");

Кстати, конструкция неправильна. Он не загрузит файл в переменную а сразу присоединит его к странице. =)
  • 0

#6 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 19 Октябрь 2009 - 13:12

вот натолкнулся, что по этому поводу скажите?
module.php
--------------
<?
include('config.php');

$data = $db->query('SELECT * FROM guestbook')->asArray();

include('template.html');
?>

  • 0

#7 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 21 Октябрь 2009 - 11:06

А что это? =)
  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 21 Октябрь 2009 - 15:41

gaaarfild,

Кстати, возник еще один вопрос. C этим шаблонизатором небольшая проблема при использовании AJAX. Когда нужно обновить какую-то информацию в поле с помощью него, а именно, отобразить что либо, он отображает не только эти данные, но и весь шаблон. То есть есть например Блок <div></div> В него надо написать после срабатывания скрипта AJAX - Успешно. Но в него отображается весь шаблон полностью а не только надпись "Успешно".

Хех... Ну ты подумай сам, что шаблон это просто начальное формирование контента и за последующие вставки JavaScript и Ajax он не отвечает.
Вообще я всегда делаю так: Если страница формируется на начальном этапе - то применимы шаблоны и шаблонизатор. Если мы хотим проитзвести какие либо действия с помощью Ajax, мы лмбо просто выводом на экран формируем контент, либо у нас должен быть отдельный шаблон, который выводит то что нам нужно.

А у тебя... К примеру, ты загрузил низ страницы и меняешь в нём с помощью Ajax, зачем же заменять целую часть шаблона если тебе ,к примеру, в div нужно вернуть успешность выполнения или полученный контент.
Я думаю концепция подхода у тебя не правильна. Чаще всего если Ajax-скрипт возвращает что-то, что должно изменить страницу, для этых действий должен быть создан специальный контейнер и содержимое должно вставляться в него.

sc2r2bey,

вот натолкнулся, что по этому поводу скажите?

module.php
--------------

<?
include('config.php');

$data = $db->query('SELECT * FROM guestbook')->asArray();

include('template.html');
?>

Это просто набор символов... И ничего больше сказать нельзя... Что тут реализуется?
  • 0

#9 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 21 Октябрь 2009 - 22:10

это я наткнулся на тему по поводу самописных cms там был поднят вопрос модульности, мог вот код, а остальное от лукавого :)
  • 0

#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 22 Октябрь 2009 - 11:25

sc2r2bey, да уж это такая супер-пупер модульность, что у меня аж прям слов нету...
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru