2025 — WAHUB

Зачем это нужно?

При разработке интернет-магазина на 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}

Как это работает:

  1. intval($n / 10) % 10 != 1 — исключает числа 11-19 (например, 11 товаров, 13 товаров), где всегда используется третья форма.
  2. $n % 10 — определяет последнюю цифру числа:
    • Если 1 — выбирает words[0] (1 товар),
    • Если 2-4 — выбирает words[1] (2 товара),
    • В остальных случаях — words[2] (5 товаров).

Пример использования

{$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 товаров».

Замените массив words на нужные варианты. Например, для слова «отзыв»:

Преимущества подхода

  • Универсальность — можно использовать для любых слов: «пользователь», «заказ», «сообщение».
  • Чистый код — логика склонения инкапсулирована в одну функцию.
  • Текст правильно выглядит — исключает случаи неверного склоненеия слов. Например: 3 товаров, осталось 2 упаковка и т.д.

Частые ошибки

  1. Неправильный порядок слов в массиве
    Обязательный формат: [форма для 1, форма для 2-4, форма для 5+].
  2. Передача нечисловых значений
    Убедитесь, что n — целое число (используйте intval($n) при необходимости).

Итог
Функция plural решает проблему склонения слов в Webasyst всего за несколько строк кода. Её легко интегрировать в любую тему дизайна и отображение слов всегда будет правильным, даже при динамическом изменении чисел.