Сниппет
Создаем сниппет 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=`товар,товара,товаров`]]