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

Сервис обмена электронных валют

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

Smarty и собственные функции

#1 RussiaStudent

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

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

Как всегда я к вам с вопросом, на который не сумел найти нормального ответа.
Есть такая задача, реализовать в Smarty собственные функции-обработчики, на подобии cycle, include, insert
Долго читал мануал, но разобраться в нём не сумел. Слишком для меня сложная задача. А решить вопрос всё же надо...

Кто реализовывал, подскажите как это работает и каким макаром вставлять в шаблоны собственные функции обработчики с параметрами.
Хочется реализовать что-то на подобии встраиваемых конструкций в шаблонах, чтобы написал к примеру {gallery} и выводился модуль галереи в системе.
Или написал {member} и подхватывался шаблон member.tpl с нужными мне параметрами(значениями вставок).

Пример PHP-кода:
<?php
include_once("smarty/Smarty.class.php");
$Smarty = new Smarty;
$Smarty->assign('title', "Заголовок сайта");
$Smarty->assign('content', "Какой-то сформированный контент");

$Smarty->display("template.tpl");
?>


Файл template.tpl
<html>
<head>
<title>{$title}</title>
.....
</head>
<body>
{$member} <!-- как раз хочу вставить свою функцию, как это реализовать? -->
{$content}
</body>
</html>


Главное чтобы вызываемая функция работала во всех файлах, которые у меня в состоянии обработать шаблонизатор.

 

 

  • 0

#2 ZiTosS

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

Отправлено 11 Декабрь 2009 - 15:31

RussiaStudent, Тут ничего сложного нет. Достаточно понять структуру Smarty. Просто перечислю по пунктам что в этот шаблонизатор входит(напишу как я её сугубо сам представляю, я не претендую на лучший вариант описания):
Внутри системы:
  • Ядро системы-шаблонизатора (В виде внутренних функций ядра)
  • Встроенные функции обработки(if else, foreach, section, strip и др.)
  • Пользователские функции и модификаторы(плагины)
  • Механизм кеширования
Вне системы:
  • Шаблоны обработки
  • Файлы настроек (конфигурационные файлы)
  • Кеш
  • Плагины
Т.е пользовательские функции (плагины) могут быть включены в систему 2 способами

И так, какие же бывают плагины (Пользовательские функции, расширяющие функционал):
  • Функции шаблона
    Все атрибуты, передаваемые в функции шаблона из самого шаблона, хранятся в $params в виде ассоциативного массива. Получить доступ к его значениям можно напрямую: $params['start'] или используя extract($params) для импорта в таблицу.

    Пример. Функция-плагин с выводом
    <?php
    /*
    * Smarty plugin
    * -------------------------------------------------------------
    * File: function.rodger.php
    * Type: function
    * Name: rodger
    * Purpose: Выводит случайный элемент из массива $answers
    * -------------------------------------------------------------
    */
    function smarty_function_rodger($params, &$smarty)
    {
    $answers = array('Я',
    'Ты',
    'Он',
    'Она',
    'Все',
    'Никто');

    $result = array_rand($answers);
    return $answers[$result];
    }
    ?>

    которая может быть использована в шаблоне следующим образом:
    Вопрос: Кто ролдставил кролика Роджера?
    Ответ: {rodger}.
  • Функции компилятора
    Функции компилятора, как вы наверное догадались, вызываются только в процессе компиляции шаблона. Они могут быть полезными для вставки кода PHP или чувствительного ко времени статического контента в шаблон. Если одновременно зарегистрированы две одноименные функции - пользовательская и компилятора, то приоритет будет у функции компилятора.

    Простой пример функции компилятора
    <?php
    /*
    * Smarty plugin
    * -------------------------------------------------------------
    * Файл: compiler.tplheader.php
    * Тип: compiler
    * Имя: tplheader
    * Назначение: вывести заголовок, содержащий имя исходного файла и
    * время, когда он был скомпилирован.
    * -------------------------------------------------------------
    */
    function smarty_compiler_tplheader($tag_arg, &$smarty)
    {
    return "\necho '" . $smarty->_current_file . " compiled at " . date('Y-m-d H:M'). "';";
    }
    ?>

    Эта функция может быть вызвана из шаблона следующим образом:
    {* Функция выполняется только при компиляции шаблона *}
    {tplheader}
  • Модификаторы
    Модификаторы - это маленькие функции, которые воздействуют на переменные в шаблоне перед тем, как те будут выведены на экран или использованы в ином контексте. Для каждой переменной шаблона, одновременно могут быть использованы несколько модификаторов.
  • Блоковые функции
    Блоковые функции выглядят следующим образом: {func} .. {/func}. Другими словами, они заключены в определенном блоке шаблона и оперируют содержимым этого блока. Блоковые функции имеют приоритет перед пользовательскими функциями, имеющими то же имя, поэтому, вы не сможете использовать одновременно свои функции вида {func} и блоковые функции {func} .. {/func}.
  • Вставки
    Плагины вставок используются для исполнения функций, вызываемых тэгом insert в шаблоне.
  • Префильтры/Постфильтры
    Префильтры используются для обработки исходного кода шаблона непосредственно перед компиляцией. Первый параметр функции префильтра - это исходный код шаблона, который, возможно, уже изменен другими префильтрами. Такой плагин возвращает модифицированый исходный код. Заметьте, что этот исходный код нигде не сохраняется, он используется только для компиляции.

    Постфильтры используются для обработки скомпилированного вывода шаблона (по сути - PHP-кода) сразу по завершению компиляции, но перед сохранением откомпилированного шаблона в файловой системе. Первым параметром функции постфильтра является скомпилированный код шаблона, возможно уже модифицированый другими постфильтрами. Плагин возвращает модифицированную версию этого кода.
  • Фильтры вывода
    Плагины фильтров вывода оперирут выходным кодом шаблона после того, как шаблон был загружен и обработан, но перед его выводом в браузер.
  • Ресурсы
    Плагины ресурсов описывают источники данных, из которых берется исходный код шаблона или компоненты PHP-скрипта для Smarty. Вот примеры ресурсов: базы данных, LDAP, разделяемая память (shared memory), сокеты, и прочее.
Частично взято со smarty.net

А теперь попробуйте распространить рассмотренные примеры на свой.
  • 0

#3 RussiaStudent

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

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

ZiTosS, я так понимаю мне надо использовать функции шаблона?
Вот к примеру у меня есть модуль галереи и мне просто надо подключить файл PHP, который выводит галерею. С этим я сумел справиться:
файл галереи gallery.php (формирует и выводит её)
<?php

// формирование и вывод галереи

?>
Файл с функцией шаблона галереи function.gallery.php, который я поместил в [Smarty]/plugins
<?php
/**
* Smarty {gallery} function plugin
*
* Type: function
* Name: gallery
* Purpose: Вывод галереи
*
*/
function smarty_function_gallery($params, &$smarty)
{
include "gallery.php";

}

?>


А мне к примеру надо выводить шаблон member.tpl в любом месте с нужными мне параметрами. Как это осуществить?
  • 0

#4 ZiTosS

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

Отправлено 12 Декабрь 2009 - 17:41

RussiaStudent, Ничего сложного.
Например вам надо вывести данные текущего пользователя(они вам заведомо известны):

файл function.member.php в папке [Smarty]/plugins
<?php
/**
* Smarty {member} function plugin
*
* Тип: function
* Имя: member
* Назначение: Вывод информации о пользователе
*
*/
function smarty_function_member($params, &$smarty)
{
if( !array_key_exists( "data", $params) ) // если не передан параметр data
{
$smarty->trigger_error("member -> assign: Отсутствие обязательного параметра 'data'"); // выдаём ошибку
return;
}

$smarty->assign("user", $params['data']); // передаём в шаблон вставку user в виде массива данных о пользователе $params['data']
return $smarty->fetch("member.tpl"); // возвращаем результат обработки шаблона member.tpl в то место шаблона где была вставка {member ...}
}

?>


Так же есть файл, где мы вызываем какой-то шаблон, в котором встречается вставка {member ...}
<?php

$smarty = new Smarty;

// Заведомо у нас есть переменная $cur_user (массив), содержащий параметры пользователя: [b]id[/b] (ID), [b]fio[/b] (ФИО), [b]about[/b] (О себе), [b]age[/b] (Возраст)
//Мы должны этот массив передать в шаблон

$smarty->assign("user_data", $cur_user); // передали в шаблон данные текущего пользователя
$smarty->display("custom.tpl"); // выводим какой-то шаблон
?>


Код шаблона custom.tpl к примеру может быть таким
<!-- Контент_начало -->

Информация о вас:
{member data=$user_data}

<!-- Контент_конец -->

  • 0


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