Допустим, требуется функция, возвращающая значения из параметра в случайном порядке. Насколько я знаю, в стандартном наборе SMARTY такой нет.
Пути к функциям SMARTY храница в свойстве plugins_dir объекта SMARTY.
Это массив, пишем так:
...
$smarty->plugins_dir[] = 'относительный или абсолютный путь к самописным функциям';
...
Рекомендую не хранить пользовательские функции в папке со стандартными. Это облегчит обновление SMARTY. Далее так:
...
<img class="{rand values=''left,center,right''}" src="..." alt="..." />
...
Собственно, {rand} — новая функция. values — её параметр.
Далее в папке, добавленой в plugins_dir, создаём файл function.rand.php. Почему "function" и "rand" — думаю, понятно.
Его содержимое:
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/
/**
* Smarty {rand} function plugin
*
* Type: function
* Name: rand<br/>
* Date: August 30, 2008<br/>
* Purpose: random return given values<br/>
* Input:
* - values = comma separated list of values to
* - delimiter = the value delimiter, default is ","
*
* @author Tsapenko Serghey aka Nck
* @version 1.0
* @param string
* @return string
*/
function smarty_function_rand($params){
$values = (empty($params['values'])) ? 'default' : $params['values'];
$delimiter = (empty($params['delimiter'])) ? ',' : $params['delimiter'];
if ($values == 'default')
return null;
$values = explode($delimiter, $values);
$rand = array_rand($values);
return $values[$rand];
}?>
Коментарии необязательны (об этом лучше никому не говорить), но считаются хорошим тоном.
$params — массив, передаваемый SMARTY в функцию, содержащий параметры из шаблона.
Если параметр values отсутствует — не возвращаем ничего (return null).
Далее, разбиваем $values в массив функцией explode
и возвращаем случайный элемент массива.
Вот и всё.
Теперь более сложный вариант.
Требуется однажды сгенирировать значение, и спользовать его далее есколько раз (гипотетический пример).
В шаблоне пишем так:
...
{rand values="itiltleft,itiltnone,itiltright" assign="rand_value"}
<img class="instant {rand_value}" src="..." alt="..." />
...
Код выглядет так:
<?php
/**
* Smarty plugin
...
* @return string
*/
function smarty_function_rand($params, &$smarty){
$values = (empty($params['values'])) ? 'default' : $params['values'];
$delimiter = (empty($params['delimiter'])) ? ',' : $params['delimiter'];
$var = (empty($params['assign'])) ? 'default' : $params['assign'];
if (($values == 'default') || ($var == 'default'))
return null;
$values = explode($delimiter, $values);
$rand = array_rand($values);
// Смотреть Здесь !
$smarty->assign($var, $values[$rand]);
return null;
}?>
Тоже ничего сложного. В параметрах функции добавилась ссылка на объект SMARTY.
Из массива $params получаем значетие параметра assign и стандартным способом
$smarty->assign($var, $values[$rand]);
её назначаем. Вот собственно и всё.
HI all! good job!
Спасибо, помогло.