Тему склонения я уже как то поднимал в Новости на сайте посредством twitter’a, теперь же всплыла задача когда необходимо было реализовать данное склонение в качестве плагина для Smarty. И обертка готова, кому нужно может пользоваться.
Нужно сохранить код приведенный ниже в файл function.decliner.php в каталоге с плагинами Smarty
<?php
/**
* Smarty {decliner} function plugin
*
* Type: function<br>
* Name: decliner<br>
* Purpose: handle word declines based on quantity number<br>
* @author Dmitriy Soloduhin <darkomen86 at gmail dot com>(credits to http://mcaizer.habrahabr.ru/blog/11555/)
* @param array $params
* <pre>
* Params: qty: number of items to choose correct declining form
* word: declining forms of word. Ex: день, дня, дней.
* </pre>
* @param Smarty
* @return string
*/
function smarty_function_decliner($params, &$smarty)
{
// be sure equation parameter is present
if (empty($params['qty']))
$params['qty']=0;
if (empty ($params['word'])) {
$smarty->trigger_error("decliner: missing required parameter");
return;
}
$forms=explode(',',$params['word']);
$params['qty'] = abs($params['qty']) % 100;
$n1 = $params['qty'] % 10;
if ( $params['qty'] > 10 && $params['qty'] < 20) return $forms[2];
else if ($n1 > 1 && $n1 < 5) return $forms[1];
else if ($n1 == 1) return $forms[0];
return $forms[2];
}
/* vim: set expandtab: */
?>
Затем в шаблонах можно использовать вот так.
{decliner qty=4 word='письма, письма, писем'}
Кстати, вот в шаблоне мы вызываем сие так: {decliner qty=4 word=’письма, письма, писем’}, но по сути это функция – вопрос: как её вызвать из php c возвратор результата в переменную? К примеру $result = Smarty::… что то там;
комментарий от Mr.Rvil — 2011-08-25 @ 3:41 пп |
Думаю использовать функции смарти для вызова из php несколько не нормально.
Можно конечно использовать просто вызов smarty_function_decliner, но для него надо будет предварительно собрать правильный массив params.
Т.е. оно примет вид echo smarty_function_decliner(array(‘qty’=>4,’word’=>’письма, письма, писем’),false);.
Правда скорей всего функция будет не определена. Так что такой вариант наверное не пройдет.
Так что самым правильным будет скопировать весь код в отдельную функцию, и вызывать ее.
комментарий от thekillerfox — 2011-09-4 @ 5:00 пп |