Эта тема на forum.dklab.ru


Дмитрий Эсс: Шаблонизатор и foreach
Как организовать показ определённого числа записей из базы данных на каждой странице?? Например, как в гостевой книге.

Я знаю, что этот вопрос уже был рассмотрен на http://forum.dklab.ru/php/advises/IshodnikiIzMoeyKnigi.html, но я так и не понял:

Лобач Олег писал(а):
Приведённый Вами код относился к содержимому блока или шаблону?

Видимо, к шаблону.

мне, что придётся создавать новый шаблон персонально к этой странице?

Я бы поместил цикл foreach в блок.

Я планировал использовать только 1 шаблон для всего сайта, как быть?
WingedFox:
Для начала, Вы ставите вопрос несколько неправильно - сначала надо решить, как все будет работать, затем определить функциональные блоки и только потом - начинать думать о коде.

Делать один шаблон на все - идеологически неправильно. Ведь может появиться какая-то страничка, которая будет плохо вписываться именно в этот шаблон.

Я описываю страницу таким образом:
1. Создаю основной управляющий шаблон, содержащий разметку страницы, на базе Шаблонизатора Д.Котерова.
2. Создаю "пассивные" шаблоны блоков, описывающих разметку текста в блоке. Я предпочитаю Template_PHPLIB.

Далее, в описании блока управляющего шаблона я просто заполняю нужные "пассивные" шаблоны и вставляю их в блок.
Пример заполнения блока новостей:

function newsblock ($who,$num) {
/***************************************\
|patterns to format the date
| \\4 = day, \\3 = month, \\1\\2 = year
\***************************************/
$patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/",
"/^\s*{(\w+)}\s*=/");
$replace = array ("\\4.\\3.\\1\\2", "$\\1 =");
$t = new Template;
$MyDB = new DB_mysql();
$MyDB->query(sql_placeholder("SELECT * FROM NEWS WHERE TYPE=? ORDER BY DATE LIMIT ?",$where,$num));
$nr=$MyDB->num_rows();
$t->setFile("tplfile", "news.tpl");
$t->setBlock("tplfile", "template", "template_blck");
for ($i=0;$i<$nr;$i++){
$data = $MyDB->fetch_assoc();
$t->setVar (array ("date" => preg_replace($patterns,$replace,$data['DATE']),
"text" => $data['TEXT'],
"link" => $data['LINK']),true);
$t->parse ("template_blck","template",true);
}
return $t->p("template_blck");
}

Block("NEWS",newsblock("main",2));


Плюс такого подхода в том, что код и шаблон не смешиваются практически никогда.
Дмитрий Эсс:
Что-то я ничего не понял :(, абсолютно.

Конкретный пример:

У меня страница:


_____________________________________________________________________________________________
| |
| лого |
| ____________________________________________________________________________|
| | back 1 2 3 4 5 6 7 8 9 ... next |
| меню | |
| меню | содержимое |
| меню | |
| меню | |
| | |
| | |
_____________________________________________________________________________________________


Содержимое конкретной страницы сайта - это просто таблица, отображающая всё что есть в базе данных по 50 записей на страницу.
"back 1 2 3 4 5 6 7 8 9 ... next" - навигация по страницам: 1 - первые 50 записей, 2 - с 50 по 100 запись и т.д. (содержится в блоке)
Ничего кроме содержимого никогда не меняется.

Я сделал 1 шаблон:


_____________________________________________________________________________________________
| |
| лого |
| ____________________________________________________________________________|
| | |
| меню | |
| меню | сюда вставляется один единственный блок "main" |
| меню | |
| меню | |
| | |
| | |
_____________________________________________________________________________________________


и только 1 блок:
на данной странице это цикл foreach, генерирующий таблицу.

Каким образом здесь применить "пассивные" шаблоны??? и что это за библиотека Template_PHPLIB??? и что это за класссы DB_mysql и Template???
Я ничего не понял из кода не зная этого, sorry.
WingedFox:
Давайте начнем с начала.
Блоков, в Вашем случае, должно быть, как минимум, 2:
1. блок разметки сообщения
2. блок навигации
3. опционально - блок меню.

Управляющий блок - то, что описано в книге и наблах Д. Котерова,
блок в котором есть возможность управлять выводом информации.
default.htm:

<table>
<tr><td><?=Blk("body")?></td></tr>
<tr><td><?=Blk("nav")?></td></tr>
</table>


"Пассивный" блок - это конструкция, которую заполняют в скрипте.
guestbook.tpl:

<!-- BEGIN template -->
<table>
<tr>
<td>{date}</td>
<td>{author}</td>
</tr>
<tr>
<td colspan=2>{message}</td>
<tr>
</table>
<!-- END template -->


Библиотека Template=Template_PHPLIB - это библиотека для работы с "пассивными" шаблонами.
Библиотека DB_mysql - элементарный враппер запросов к базе mySQL.
Все это можно найти, например, на pear.php.net

Модифицируем пример, приведенный выше:


include "template_phplib.inc";
include "db_mysql.inc";
include "sql_placeholder.inc";

function guestbook ($num,$cnt) {
/***************************************\
|patterns to format the date
| \\4 = day, \\3 = month, \\1\\2 = year
\***************************************/
$patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/",
"/^\s*{(\w+)}\s*=/");
$replace = array ("\\4.\\3.\\1\\2", "$\\1 =");
$t = new Template;
$MyDB = new DB_mysql();
$MyDB->query(sql_placeholder("SELECT * FROM GUESTBOOK ORDER BY DATE LIMIT ?,?",$num,$cnt));
$nr=$MyDB->num_rows(); //количество найденных записей
$t->setFile("tplfile", "guestbook.tpl"); //куда будем вставлять данные из базы
$t->setBlock("tplfile", "template", "template_blck"); //определяем основной блок
for ($i=0;$i<$nr;$i++){
$data = $MyDB->fetch_assoc(); //вытаскиваем очередную запись
$t->setVar (array ("date" => preg_replace($patterns,$replace,$data['DATE']),
"author" => $data['TEXT'],
"message" => $data['LINK']),true); //кладем ее в блок
$t->parse ("template_blck","template",true); //парсим блок и добавляем к предыдущим
}
return $t->p("template_blck"); //возвращаем готовое содержимое странички
}

Block("body",guestbook($_GET['num'],10)); //рисуем 10 записей, начинающихся с 'num'


Дальше - своей головой =)
Дмитрий Эсс:
Спасибо, что уделяете мне столько времени. Теперь вродебы всё ясно :)
WingedFox:
На здоровье! 8)

А, вообще, писать свою книгу - дело неблагодарное. Можно вытащить любую из тысяч, валяющихся в интернете, установить и заняться более интересными делами. ;)

Эта тема на forum.dklab.ru