LINUX.ORG.RU

[Smarty] А как делается циклический инклюд файла?


0

1

Назрел следующий вопрос. Предположим, имеется некий форум. К примеру, 30 постов на страницу. Каждый пост имеет сложную структуру HTML-разметки и рендерится в основной HTML через банальный foreach.

А теперь усложню задачу. К форуму прикручивается Ajax, при отправке поста на сервер, с сервера возвращается HTML-код с содержимым поста, который тупо приписывается вниз к остальным постам через «innerHTML += ...». Следовательно универсальное решение тут будет - вынести HTML-код шаблона из цикла в отдельный файл, к которому обращаться как из скрипта, обрабатывающий Ajax-запрос, так и при выводе всех 30 постов. Но в последнем случае получится 30 инклюдов, что довольно затратно по ресурсам.

Так вот, интересует есть ли в Smarty какая-нибудь функция, которая позволит заранее единожды подгрузить этот шаблон с вёрсткой поста и 30 раз его через цикл прорендерить, нежели инклюдить его 30 раз? Или тут какой-то другой приём надо использовать?

>Но в последнем случае получится 30 инклюдов, что довольно затратно по ресурсам.

Если так критично — сделай свой тип ресурса, скажем, из memcached, и грузи оттуда. Т.е. не {include file=«templates/forum/post.html»}, а {include file=«mycache:templates/forum/post.html»}.

Или тут какой-то другой приём надо использовать?


Вообще же, исходный шаблон Smarty скомпилирует, а операционная система полученный файл закеширует, так что у тебя будет 30 чтений из памяти + 30 исполнений готового PHP-файла. Я не замечал на такой фигне потери производительности.

У тебя в другом проблема. Если будешь выводить 30 постингов через AJAX, то это будет 30 чтений с сервера на каждую страницу топика. Так что — никакой «универсализации». Страницу топика выводишь одним классическим запросом, а постинги потом уже дописываешь — да, по одному через AJAX.

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

> Если так критично — сделай свой тип ресурса, скажем, из memcached, и грузи оттуда. Т.е. не {include file=«templates/forum/post.html»}, а {include file=«mycache:templates/forum/post.html»}.

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

Вообще же, исходный шаблон Smarty скомпилирует, а операционная система полученный файл закеширует, так что у тебя будет 30 чтений из памяти + 30 исполнений готового PHP-файла. Я не замечал на такой фигне потери производительности.

Я заранее думаю о возможности если в будущем можно будет выбирать количество постов на страницу. Может будет и 100, может и 250.

У тебя в другом проблема. Если будешь выводить 30 постингов через AJAX, то это будет 30 чтений с сервера на каждую страницу топика. Так что — никакой «универсализации». Страницу топика выводишь одним классическим запросом, а постинги потом уже дописываешь — да, по одному через AJAX.

Ну я в общем-то об этом изначально говорил. Мне интересно, я ничего не упустил из стандартных возможностей Smarty? В современных форумных движках это делается довольно просто - используется свой шаблонизатор, который хранит шаблон в БД и просто дёргает нужную запись шаблона оттуда, которую уже и рендерит в цикле столько раз, сколько потребуется.

karbofos ()
Ответ на: комментарий от karbofos

>В современных форумных движках это делается довольно просто - используется свой шаблонизатор, который хранит шаблон в БД и просто дёргает нужную запись шаблона оттуда

Поверь мне, 100…250 запросов из БД только на выдёргивание куска шаблона — это будет ад :)

В любом случае, никто тебе и на Смарти не запрещает сделать хранение шаблонов в БД и дёргать их оттуда, а не из файла.

Наконец, можно поступить более правильно, и не сносить всю логику в шаблон. А сделать плагин-функцию, генерирующую HTML постинга из Smarty-шаблона, хранящегося в строке (в Smarty3 это уже «из коробки» есть, свой ресурс писать не нужно) и дёргать из Smarty уже эту функцию.

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

> Поверь мне, 100…250 запросов из БД только на выдёргивание куска шаблона — это будет ад :)

В том-то и дело, что дёргаются они форумными шаблонизаторами 1 раз.

Наконец, можно поступить более правильно, и не сносить всю логику в шаблон. А сделать плагин-функцию, генерирующую HTML постинга из Smarty-шаблона, хранящегося в строке (в Smarty3 это уже «из коробки» есть, свой ресурс писать не нужно) и дёргать из Smarty уже эту функцию.

Спасибо, пожалуй это то, что мне нужно.

karbofos ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.