MODX. Склонение слова в зависимости от кол-ва товаров (числа)

Оглавление

Создаем сниппет declension

<?php
/**
 * Declension of words
 * This algorithm taken from https://github.com/livestreet/livestreet/blob/eca10c0186c8174b774a2125d8af3760e1c34825/engine/modules/viewer/plugs/modifier.declension.php
 */
 
/** @var array $scriptProperties */
$number = $modx->getOption('input', $scriptProperties, 0);
$forms = $modx->getOption('options', $scriptProperties, '');
if (is_string($forms)) {
    if ($forms[0] == '[') {
        $forms = $modx->fromJSON($forms);
    }
    else {
        $forms = explode(',', $forms);
    }
}
if (!is_numeric($number)) {
    return;
}
if (!is_array($forms) || empty($forms)) {
    return 'Вы должны указать формы слов для склонения. Например [[*id:declension=`яблоко,яблока,яблок`]].';
}
 
if (count($forms) == 3) {
    $mod100 = $number % 100;
    switch ($number % 10) {
        case 1:
            if ($mod100 == 11) {
                $text = $forms[2];
            }
            else {
                $text = $forms[0];
            }
            break;
        case 2:
        case 3:
        case 4:
            if (($mod100 > 10) && ($mod100 < 20)) {
                $text = $forms[2];
            }
            else {
                $text = $forms[1];
            }
            break;
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 0:
        default:
            $text = $forms[2];
    }
}
elseif (count($forms) == 2) {
    if ($number == 1) {
        $text = $forms[0];
    }
    else {
        $text = $forms[1];
    }
}
else {
    $text = 'Недостаточно форм слов для склонения';
}
 
return $text;
?>

Применяем его как модификатор, например

[[+productsCount:declension=`товар,товара,товаров`]]