Smarty функции и темплейты

player

Новичок
Smarty функции и темплейты

Хотел бы узнать как можно реализовать следующее:

есть функция, которую хочу использовать в главном темплейте вызовом {sponsors}. Эта функция (например блок в CMS) в свою очередь должна форматировать данные по схеме еще одного темплейта

общии темплейт:
<html>
<body>
// вызов функции
{sponsors}
</body>
</html>

темплейт блока (block_r.tpl) должен выдавать одну ячейку таблицы с названием блока, и несколько строчек содержания блока, то есть циклом, примерно:
<tr><td background="rght_menu_title_bg.png">$title</td></tr>
foreach($cells as $cell){
<tr><td>$cell</td></tr>
}

PHP:
function smarty_function_sponsors(&$smarty){
	
    $answers = array('Yes',
                     'No',
                     'No way',
                     'Outlook not so good',
                     'Ask again soon',
                     'Maybe in your reality');

    $title = array_rand($answers);
    $cells=array("1", "2", "3", "4");
    $content=include("themes/emotion/block_r.tpl");
    return $content;
}
конечно же это не работает, но я не знаю где ошибки и как это можно реализовать

ошибка:
syntax error: unrecognized tag 'sponsors'... Где я недосмотрел, функция же вроде бы на месте
 

magic

lancer
Как называется файл с плагином? Где находится? Настройки папки с плагинами есть?
 

player

Новичок
хаха, оказывается у меня никаких плагинов нет, щас попробую разобраться. а какой плагин мне для этого нужен и как его привязать?
 

player

Новичок
у мня там установлены те плагины которые устанавливаются автоматически при инсталляции смарти, а как называется нужный мне?
 

magic

lancer
Скопируй уже существующий и назови так, как тебе нравится. Только чтобы имя файла и функции совпадали.

Например function.sponsors.php для smarty_function_sponsors().
 

alexhemp

Новичок
Это все можно сделать через {include file=sponsors.tpl} - это на порядок проще и лучше чем плагин делать.
 

player

Новичок
а есть еще какиенибудь способы? например я одно время делал массив $blocks['top'][] для блоков в голове сайта
$blocks['left'][] для левого столбца и тд
во время выполнения скрипта, еще до вывода на экран я привязывал темплейты, то есть уже готовые блоки писал в массив. теперь думаю не лучше ли так делать, и какие еще есть возможности и что работает лучше
 

FreeSpace

Чукча-читатель
Так делают в некоторых других, "блочных" шаблонизаторах.
А в Smarty для этого и сделаны инклюды, чтобы избавиться от парсинга каждого блока по отдельность и от всего избыточного (хотя избыточность здесь - вопрос спорный) кода, который связан с таким блочным подходом.

В общем, в данном конкретном случае include лично мне кажется самым удачным подходом.
 

player

Новичок
значит поотдельности декларировать смарти-переменные и передавать темплейту? не слишком ли много их тогда получится, каждому блоку несколько переменных
 

FreeSpace

Чукча-читатель
Ну для каждого сайта структура данных уникальна, так что не зная этой структуры сложно сказать о том, сколько и куда надо будет передавать переменных.

В данном конкретном случае, ты можешь передать в Smarty массив $advertisement со всеми необходимыми данными для нормального отображения шаблона block_r.tpl, а внутри этого шаблона работать только с этим массивом. Само собой, block_r.tpl нужно будет переписать под синтаксис Smarty.

Да и вообще, мешать в системе два синтаксиса (Smarty и native PHP) - это достаточно "грязная" идея.
 
Сверху