Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 5 Ответов
  • 1159 Просмотров
*

goga_pgasovav

  • Захожу иногда
  • 385
  • 4 / 0
  • Внимательный джумловод
Товарищи, надоело мне, что в корзине отображается "1 товаров" и решил я попробовать тут красоту навести.
Нашёл в интернетах функцию, которая якобы это всё делать должна, но почему-то не срабатывает.

В файле шаблона корзины mytemplate/html/mod_multi_basket_ajax/default.php добавил следующее:
Код
<?php
function RusEnding($n, $n1, $n2, $n5) {
    $n = $cart->count_product;
    if($n >= 11 and $n <= 19) return $n5;
    $n = $n % 10;
    if($n == 1) return $n1;
    if($n >= 2 and $n <= 4) return $n2;
    return $n5;
    }
?>

Ну и, собственно, в месте вывода нужного текста сделал так:
Код
<?php echo '<span class="total_text">'.$cart->count_product.' '.RusEnding($cart->count_product, "товар", "товара", "товаров").'</span> <b>'.formatprice($cart->getSum(0,1), null, 0, 1).'</b>'; ?>

Почему-то всегда выводится только последнее значение — «товаров».
Может кто поймёт почему так? Или может кто-то уже свой велосипед для этого давно изобрёл.

P.S.: я знаю, что надо всё в языковые переменные вынести. Я так и сделал уже, просто для упрощения примера текст прямо в коде.
« Последнее редактирование: 14.02.2023, 13:40:48 от goga_pgasovav »
*

sivers

  • Живу я здесь
  • 2465
  • 336 / 0
Re:
« Ответ #1 : 13.02.2023, 19:29:40 »
Попробуйте этот вариант:
Код
function quant($cnt=0, $one=' штука', $two=' штуки', $five=' штук', $withnum=false) {
        if(in_array($cnt%100,array(11,12,13,14))||in_array($cnt%10,array(0,5,6,7,8,9))) {
            return ($withnum ? $cnt : '').$five;
        } elseif($cnt%10==1) {
            return ($withnum ? $cnt : '').$one;
        } else {
            return ($withnum ? $cnt : '').$two;
        }
    }

Если последний параметр true, то число будет выведено перед количественным словом.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

goga_pgasovav

  • Захожу иногда
  • 385
  • 4 / 0
  • Внимательный джумловод
Re:
« Ответ #2 : 14.02.2023, 13:32:36 »
sivers, просто восхитительно!
Низкий поклон  :D

Для тех кто, так же как и я, не так силён в программировании, вывод делается следующим образом:
Код
<?php
echo quant($cart->count_product);
?>
« Последнее редактирование: 14.02.2023, 13:41:27 от goga_pgasovav »
*

goga_pgasovav

  • Захожу иногда
  • 385
  • 4 / 0
  • Внимательный джумловод
Re:
« Ответ #3 : 14.02.2023, 13:51:15 »
По ходу воплощения задуманного возник ещё один вопрос:
Если я в параметры функции передаю текстовую переменную, а не просто строку (текст), то получаю белый экран.
Я имею в виду, если так делаю:

Код
function quant($cnt=0, $one=JText::_('СART_TOTAL1'), $two=JText::_('СART_TOTAL2'), $five=JText::_('СART_TOTAL'), $withnum=false)

Как это правильно сделать не понимаю.

P.S.: Вот теперь точно всё! Дошло до меня  ^-^
Надо передавать все параметры при вызове функции:
Код
echo quant($cart->count_product, JText::_('CART_TOTAL1'), JText::_('CART_TOTAL2'), JText::_('CART_TOTAL'));

Ещё раз огромное спасибо товарищу sivers!
« Последнее редактирование: 14.02.2023, 14:03:46 от goga_pgasovav »
*

sivers

  • Живу я здесь
  • 2465
  • 336 / 0
Re:
« Ответ #4 : 14.02.2023, 14:13:46 »
Надо передавать все параметры при вызове функции:

Да, верно. Параметры по умолчанию добавил просто для наглядности.

Пользуйтесь на здоровье.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

goga_pgasovav

  • Захожу иногда
  • 385
  • 4 / 0
  • Внимательный джумловод
Re:
« Ответ #5 : 14.02.2023, 14:30:56 »
Ещё небольшое дополнение для тех, кто захочет повторить.
Т.к. у нас корзина не простая, а AJAX, то при обновлении количества товаров в реальном времени текст заменяется на статический (в итоге всё равно получаем «1 товаров»).

Сначала в файл mytemplate/html/mod_multi_basket_ajax/default.php в самом конце добавляем три строки:
Код
<span class="datac-p1"><?php echo JText::_('CART_TOTAL1')?></span>
<span class="datac-p2"><?php echo JText::_('CART_TOTAL2')?></span>
<span class="datac-p3"><?php echo JText::_('CART_TOTAL')?></span>
Естественно, языковые переменные должны были быть уже обозначены (либо в админке переопределением языковых констант, либо в .tpl_ языковом файле вашего шаблона).

С javascript у меня чуть получше, чем с РНР, поэтому чуть погуглив сделал так:

1. Открываем файл yoursite/modules/mod_multi_basket_ajax/js/ajax.js
2. В начале файла там целый список языковых переменных для JS, примерно после 15-й строки добавляем следующее:
Код
p1=jQuery('span.datac-p1').text();
p2=jQuery('span.datac-p2').text();
p3=jQuery('span.datac-p3').text();
3. Ниже добавим функцию, аналогичную той, что привёл sivers, только для JS:
Код
function num_word(value, words){  
value = Math.abs(value) % 100;
var num = value % 10;
if(value > 10 && value < 20) return words[2];
if(num > 1 && num < 5) return words[1];
if(num == 1) return words[0];
return words[2];
}
4. Ну и, в нужном месте, там где раньше выводился статический текст, вставляем этот код:
Код
num_word(a.count_product, [p1, p2, p3])
где a.count_product — текущее количество товаров в корзине.

На этом всё   yes!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться