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


Выбрать шаблон и создать сайт

Собственный шаблонизатор

#1 Евгений

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

Отправлено 01 Июнь 2009 - 23:34

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

как я понял
файл html обрабатывается регулярками и все что находится между знаками допутстим {} записывается в переменную? которая заменяется на значение этой переменной.

а как же циклы?

если цикл выводит у меня по 200 страниц информации, то это никак не засунуть в одну переменную)) я понимаю что я чего то не понимаю, но поиски ответа меня никчему не привели

 

 

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Шаблонизатор PHP
  2. Smarty и собственные функции
  3. 1-й стабильный релиз шаблонизатора SMARTY 3-й линейки
  4. Создание собственной CMS

#2 ZiTosS

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

Отправлено 02 Июнь 2009 - 13:30

Евгений, шаблонизаторы делятся по сложности на: Простые и сложные.
Простые делают замену в шаблоне одних лексем на другие. По определённому ключу. У меня есть подобный шаблонизатор, мне хватает и даже данные из базы обрабатывать. Вся основа тут это регулярные выражения и ассоциативный массив. У которого ключ - это имя заменяемой лексемы, значение - на что заменяем.
Чтобы к примеру вывести 100 кусков одного и того же кода через простой шаблонизатор, мы просто делаем как обычно
$query = "SELECT [поля_возможно с переименованиями] FROM [таблица] .....";
$resource = mysql_query($query)
while($array = mysql_fetch_array($resource))
{
// обработка шаблона, в качестве параметра передаём имя шаблона и ассоциативный массив
}



Как же устроены сложные шаблонизаторы? К примеру smarty
Да всё также, только, написан целый класс для обработки шаблонов, включено множество конструкций, тех же самых циклов и условий. Как передаются данные не сложно догадаться, так же массив в массиве, или объекты. Как заблагорассудится тебе написать обработку шаблонизатором.

Кстати ничего сложного нету, скачать исходники smarty и почитать их, конечно не всё быстро придёт, но теорией проб и ошибок можно во всём разобраться.
  • 0

#3 v1ex

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

Отправлено 03 Июнь 2009 - 05:57

Я давно себе писал, может пригодится:
<?php
// Шаблонизатор
class Templater {
private $template_dir;

// В конструктор передаем директорию, в которой находятся шаблоны
public function __construct($template_dir) {
$this->template_dir = $template_dir;
}

public function setDir($dir) {
$this->dir = $dir;
}
public function getDir($dir) {
return $this->dir;
}

// Добавляем переменную шаблона (значение, имя переменной)
public function addVariable($variable, $name) {
$this->$name = $variable;
}

// Выводим шаблон
public function displayTemplate($template_file) {
require_once $this->template_dir.$template_file;
}
}
?>

Класс использовать примерно так:
<?php
$templater = new Templater('templates/');
$templater->addVariable('Главная страница', 'title');
$templater->addVariable('Содержимое главной', 'content');
$templater->displayTemplate('template.tpl');
?>

Ну и сам шаблон (template.tpl):
<html>
<head>
<title>
<?php print $this->title; ?>
</title>
</head>
<body>
<?php print $this->content; ?>
</body>
</html>

  • 0

#4 Евгений

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

Отправлено 05 Июль 2009 - 15:42

мне в прицнипе много не надо, вполне подходит "шаблонизатор" который v1ex дал вот тут http://www.masterweb...5674#entry25674

когда начал разбираться, столкнулся с проблемой.

в menu.tpl какая то рамочка, в рамочке пункты меню, пункты выводятся из mysql. Единсвенный выход вижу в том чтобы в menu.tpl засунуть цикл который будет вытаскивать из базы то что надо, но тогда ломается весь смысл шаблонов. Как это сделать правильно?


  • 0

#5 v1ex

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

Отправлено 06 Июль 2009 - 04:34

Евгений, а почему в самой логике скрипта нельзя вытаскивать из базы пункты меню и передавать шаблонизатору?
  • 0

#6 Евгений

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

Отправлено 07 Июль 2009 - 12:16

религия не позволяет =) шучу.. пример можно?
  • 0

#7 v1ex

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

Отправлено 07 Июль 2009 - 12:34

Логика скрипта:
$res = mysql_query("выборка_пунктов_меню", $msConnect);
$puncts = array();
while ($row = mysql_fetch_array($res))
{
$puncts[] = $row;
}
$template['puncts'] = $puncts;
// Дальше выводим шаблон

В шаблоне:
<?php foreach ($template['puncts'] as $punkt) : ?>
<li><a href="<?php print $punkt['href']; ?>"><?php print $punkt['name']; ?></a></li>
<?php endforeach; ?>

Думаю суть ясна.
  • 0

#8 Евгений

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

Отправлено 08 Июль 2009 - 14:58

с этим разобрался, спасибо :)

вот еще проблема

вот этот код
display_template(header.tpl, $text);
display_template(content.tpl, $text);
display_template(footer.tpl, $text);

выведет сначала шапку, потом контент и футер. А если контент разделен на 2 части? левую и центр. Чтобы допустим в левой колонке то же меню вывести.

решение вижу только такое, но оно опять смешивает шаблон с логикой.
display_template(header.tpl, $text);
echo '<table><tr><td width=200>';
display_template(left.tpl, $text);
echo '</td><td>';
display_template(content.tpl, $text);
echo '</td></tr></table>';
display_template(footer.tpl, $text);

  • 0

#9 v1ex

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

Отправлено 08 Июль 2009 - 18:50

А не разместить <table><tr><td width=200>ШАБЛОН_МЕНЮ</td> в menu.tpl, а <td width=200>ШАБЛОН_КОНТЕНТА</td> в content.tpl? Или у вас в зависимости от логики может исчезать левая колонка?
  • 0

#10 WebKiD

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

Отправлено 14 Июль 2009 - 01:04

0_0
Я представлял шаблонизатор "своей мечты" несколько по другому.
Для меня в идеале была бы следующая схема:
Есть текстовик с переменными и "тегами" на которые заменяются эти переменные.
В место текстовика можно и БД MySQL использовать.
Что кстати быстрее будет и меньшую нагрузку на сервер будет оказывать?
  • 0

robot

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


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