Я безумен

2010-07-25

Плагин для Smarty для склонения существительных с числительными

Filed under: PHP — thekillerfox @ 6:27 пп

Тему склонения я уже как то поднимал в Новости на сайте посредством 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='письма, письма, писем'}
Реклама

2 комментария »

  1. Кстати, вот в шаблоне мы вызываем сие так: {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 пп | Ответить


RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Блог на WordPress.com.

%d такие блоггеры, как: