Зачем это нужно?
При разработке интернет-магазина на Webasyst часто требуется динамическое склонение слов в зависимости от количества товаров (например: «1 товар», «2 товара», «5 товаров»).
Ручная проверка условий для каждого случая усложняет разработку. Решение — функция Smarty, которая автоматически выбирает нужную форму слова. В статье разберем её реализацию и применение.
Готовая функция для склонения слов
{function plural n=0 words=["один", "два", "пять"]}
{if intval($n / 10) % 10 != 1 && 1 <= $n % 10 && $n % 10 <= 4}
{if $n % 10 == 1}
{$words[0]}
{else}
{$words[1]}
{/if}
{else}
{$words[2]}
{/if}
{/function}
Как это работает:
intval($n / 10) % 10 != 1
— исключает числа 11-19 (например, 11 товаров, 13 товаров), где всегда используется третья форма.$n % 10
— определяет последнюю цифру числа:- Если 1 — выбирает
words[0]
(1 товар), - Если 2-4 — выбирает
words[1]
(2 товара), - В остальных случаях —
words[2]
(5 товаров).
- Если 1 — выбирает
Пример использования
{$reviews_count}
{call plural n=$reviews_count words=["отзыв", "отзыва", "отзывов"]}
Вариант с системной функцией перевода Webasyst (_wp()
):
{$products_count}
{call plural n=$products_count words=["{_wp("товар")}", "{_wp("товара")}", "{_wp("товаров")}"]}
Результаты:
- Если
$products_count = 1
: «Найден 1 товар»,
- Если
$products_count = 3
: «Найдено 3 товара»,
- Если
$products_count = 7
: «Найдено 7 товаров».
$products_count = 1
: «Найден 1 товар»,$products_count = 3
: «Найдено 3 товара»,$products_count = 7
: «Найдено 7 товаров».Замените массив words
на нужные варианты. Например, для слова «отзыв»:
Преимущества подхода
- Универсальность — можно использовать для любых слов: «пользователь», «заказ», «сообщение».
- Чистый код — логика склонения инкапсулирована в одну функцию.
- Текст правильно выглядит — исключает случаи неверного склоненеия слов. Например: 3 товаров, осталось 2 упаковка и т.д.
Частые ошибки
- Неправильный порядок слов в массиве
Обязательный формат:[форма для 1, форма для 2-4, форма для 5+]
. - Передача нечисловых значений
Убедитесь, чтоn
— целое число (используйтеintval($n)
при необходимости).
Итог
Функция plural
решает проблему склонения слов в Webasyst всего за несколько строк кода. Её легко интегрировать в любую тему дизайна и отображение слов всегда будет правильным, даже при динамическом изменении чисел.