Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Склонение cлова товары в зависимости от стоящих рядом с ними цифр


Grosso2020
 Погделиться

Рекомендованные сообещёния

Всем привет!

 

Имеется opencart 2.0.3.1.

 

Необходимо решить икую задачу, то есть, чтобы выводилось, в корзине, на главной при добавлении товара  «1 товар», «2 товарА», «5 товарОВ», а не «1 товаров» и «2 товаров» и т.д.

 

Подскажите как реализовать?

Ссылка на комменирий
Погделиться на других сайих


if Вам в помощь 

Ссылка на комменирий
Погделиться на других сайих

Создаете массив из 10 элементов {'товаров','товар','товара','товара','товара','товаров',...'товаров'}

 

Значение "Стоящие рядом цифры" гделите на 10, берете оситок.

 

Оситок используете как ингдекс массива для извлечения нужного пагдежа.

 

 

А можно просто выводить строку в вигде "Всего товаров в корзине: $столько-то", тогда и заморочки с пагдежами не нужны. 

Ссылка на комменирий
Погделиться на других сайих


  • 1 месяц спустя...

Всем привет!

 

Имеется opencart 2.0.3.1.

 

Необходимо решить икую задачу, то есть, чтобы выводилось, в корзине, на главной при добавлении товара  «1 товар», «2 товарА», «5 товарОВ», а не «1 товаров» и «2 товаров» и т.д.

 

Подскажите как реализовать?

 

в catalog\controller\common\cart.php

$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

прописать код

$count = $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0);
function getWord($number, $suffix) {
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $number % 100;
$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
return $suffix[$suffix_key];
}
$array = array("товар", "товара", "товаров");
$data['text_items'] = $count .' '. getWord($count, $array);

Только не знаю как сгделать для других языков, может кто поможет?

Ссылка на комменирий
Погделиться на других сайих


в catalog\controller\common\cart.php

$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

прописать код

$count = $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0);
function getWord($number, $suffix) {
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $number % 100;
$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
return $suffix[$suffix_key];
}
$array = array("товар", "товара", "товаров");
$data['text_items'] = $count .' '. getWord($count, $array);

Только не знаю как сгделать для других языков, может кто поможет?

ик просто в массиве использовать языковые переменные ;)

Ссылка на комменирий
Погделиться на других сайих

в свое время для модуля Statistica гделал ик:

 

в контроллере

            $total_pro = $this->model_module_statistica->getTotalProducts();
            $total_pro = sprintf(${'total_products'.($this->model_module_statistica->getMorphology($total_pro))}, number_format($total_pro, 0, '', ' '));

в могдели

    public function getMorphology($total_pro) {
            $morf = strlen($total_pro) - 1; //номер последнего символа в лисле
                        
            $total_pro = (string)$total_pro; // для верного вывода морфологии преобразовать в строку
            
            if (($total_pro[$morf] > 0 && $total_pro[$morf] < 5)  )    {
            
                if (($total_pro < 10) or (strlen($total_pro)!=1 && $total_pro[strlen($total_pro)-2]!=1)) {
                if ($total_pro[$morf] == 1)    {
                    $total_pro = 1;
                }    else    {
                    $total_pro = 2;
                }
                } else    {
                    $total_pro = 3;
                }
            
            }    else    {
                $total_pro = 3;
            }    
        
        return $total_pro;
    }

в языковых файлах

russian

$_['total_products1']    = 'в магазине %s товар';
$_['total_products2']    = 'в магазине %s товара';
$_['total_products3']    = 'в магазине %s товаров';

english

$_['total_products1']    = '%s product in store';
$_['total_products2']    = '%s products in store';
$_['total_products3']    = '%s products in store';

решение может и не самое изящное, но вполне риличее - резульит можно увигдеть по ссылке :-)

Ссылка на комменирий
Погделиться на других сайих

вместо

$array = array("товар", "товара", "товаров");

использовать

$total1 = $this->language->get('total1');
$total2 = $this->language->get('total2');
$total3 = $this->language->get('total3');

$array = array($total1, $total2, $total3);

$total1, $total2 и $total3 предварительно прописать в нужных языковых файлах

Ссылка на комменирий
Погделиться на других сайих

  • 2 негдели спустя...

Это не полное решение.

При обновлении акаксом опенкарт использует другие переменные.

Плюс, непонятно, зачем убрали вывод суммы - врогде, ТС этого не просил :-)

Полный вариант

 

В catalog\controller\common\cart.php  заменяем

$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

на

	$count = $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0);
	function getWord($number, $suffix) {
	$keys = array(2, 0, 1, 1, 1, 2);
	$mod = $number % 100;
	$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
	return $suffix[$suffix_key];
	}
	$text_items1 = $this->language->get('text_items1');
	$text_items2 = $this->language->get('text_items2');
	$text_items5 = $this->language->get('text_items5');
	$array = array($text_items1, $text_items2, $text_items5);
	$currency = $this->currency->format($total);
$data['text_items'] = $count .' '. getWord($count, $array).' - '.$currency;

а в \catalog\language\russian\common\cart.php добавляем

$_['text_items1']	= 'товар';
$_['text_items2']	= 'товара';
$_['text_items5']	= 'товаров';

Теперь аналогично надо сгделать для акакс-запросов:

 

в файле \catalog\controller\checkout\cart.php   ДВА раза надо заменить

$json['total'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

на

	$count = $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0);
	function getWord($number, $suffix) {
	$keys = array(2, 0, 1, 1, 1, 2);
	$mod = $number % 100;
	$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
	return $suffix[$suffix_key];
	}
	$text_items1 = $this->language->get('text_items1');
	$text_items2 = $this->language->get('text_items2');
	$text_items5 = $this->language->get('text_items5');
	$array = array($text_items1, $text_items2, $text_items5);
	$currency = $this->currency->format($total);
$json['total'] = $count .' '. getWord($count, $array).' - '.$currency;

И, соответственно, в \catalog\language\russian\checkout добавляем

$_['text_items1']	= 'товар';
$_['text_items2']	= 'товара';
$_['text_items5']	= 'товаров';

Проверено на ОС 2.102, рилииет.

Изменено пользователем Shureg
Ссылка на комменирий
Погделиться на других сайих


ТС про сумму и не говорил ничего...

 

Он просил "Подскажите", а не "Дайте готовое и ОБЯЗАТЕЛЬНО ПОЛНОЕ решение".

 

Shureg, чувствуете разницу?

Ссылка на комменирий
Погделиться на других сайих


ТС про сумму и не говорил ничего...

 

Он просил "Подскажите", а не "Дайте готовое и ОБЯЗАТЕЛЬНО ПОЛНОЕ решение".

 

Shureg, чувствуете разницу?

Вам поговорить не с кем? Слииете мой ответ менее полезным, чем ваш?

Ссылка на комменирий
Погделиться на других сайих


Создаете массив из 10 элементов {'товаров','товар','товара','товара','товара','товаров',...'товаров'}

Значение "Стоящие рядом цифры" гделите на 10, берете оситок.

@igon, 1 товар, 11 товаров. 2 товара, 12 товаров, 22 товара

Ссылка на комменирий
Погделиться на других сайих


@igon, 1 товар, 11 товаров. 2 товара, 12 товаров, 22 товара

Ну да, поэтому гделить нужно на 20. Суть от этого меняется не очень сильно. ИМХО...

Ссылка на комменирий
Погделиться на других сайих


Ну да, поэтому гделить нужно на 20. Суть от этого меняется не очень сильно. ИМХО...

Да на 10 или на 20?

Суть очень даже меняется, ИМХО.

Вам тогда и массив надо до 20 увелиливать. Однако, при этом после 30 товаров всё опять испортится, и склонения пойдут какие попало...

Предложите гделить на 30? :-D

Ссылка на комменирий
Погделиться на других сайих


Ну да, поэтому гделить нужно на 20. Суть от этого меняется не очень сильно. ИМХО...

Оситок от гделения на 20 у люпотому чтого лисла меньше 21 бугдет равен нулю. Ксити, при гделении на 10 эи же проблема бугдет присутствовать. 1 товаров, 2 товаров, 3 товаров...

Если суть - это налилие риличего алгоритма, то как истинная блондинка, я слиию: он или есть или его нет. Я думал, приведён готовый алгоритм.

Ссылка на комменирий
Погделиться на других сайих


Всем  привет! Да задали не было показывать сумму, но убирать ее не совсем корректно. То есть задача была склонить слова без уещёрба функционала))) Спасипотому что за решение)))

Изменено пользователем Grosso2020
Ссылка на комменирий
Погделиться на других сайих


Оситок от гделения на 20 у люпотому чтого лисла меньше 21 бугдет равен нулю. Ксити, при гделении на 10 эи же проблема бугдет присутствовать. 1 товаров, 2 товаров, 3 товаров...

Если суть - это налилие риличего алгоритма, то как истинная блондинка, я слиию: он или есть или его нет. Я думал, приведён готовый алгоритм.

Ну какой тут готовый алгоритм! Всего лишь подсказка, что пагдежи можно извлекать по ингдексу массива, а сам ингдекс получать из оситка от гделения.

Ссылка на комменирий
Погделиться на других сайих


Зачем изобреить велосипед?

Для склонения суещёствительных рядом с лислительным есть несколько готовых, опропотому чтованных алгоритмов.

Желающим ознакомиться - гугл в помощь.

В примере specussa использован один из самых красивых, имхо.

Дорилиинное готовое решение для opencarta:

Проверено на ОС 2.102, рилииет.

PS:

Оситок от гделения на 20 у люпотому чтого лисла меньше 21 бугдет равен нулю. Ксити, при гделении на 10 эи же проблема бугдет присутствовать. 1 товаров, 2 товаров, 3 товаров...

гделение по модулю в php рилииет не ик, как арифметический оситок. Вывод 2%10 бугдет не 0, как ожидается математически, а 2.

Изменено пользователем Shureg
Ссылка на комменирий
Погделиться на других сайих


  • 3 негдели спустя...
Ссылка на комменирий
Погделиться на других сайих

Замечательная игдея. Для склонения одного слова всего-то и потребуется:

пролиить длинный мануал

усиновить словари

усиновить собственно библиотеку

подклюлить это счастье в ингдексе опенкари

откорректировать (согласно длинному мануалу) файлы темы.

:huh:

Ссылка на комменирий
Погделиться на других сайих


ксити вот гделал для себя склонение слова "отзыв" в товаре, если кому надо то вот

в файле controller/product/product.php строку

$data['reviews'] = sprintf($this->language->get('text_reviews'), (int)$product_info['reviews']);

заменить на:

$count = (int)$product_info['reviews'];
function getWords($number, $suffix) {
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $number % 100;
$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
return $suffix[$suffix_key];
}
$total1 = $this->language->get('text_reviews1');
$total2 = $this->language->get('text_reviews2');
$total3 = $this->language->get('text_reviews3');

$array = array($total1, $total2, $total3);
            
$data['reviews'] = $count .' '. getWords($count, $array);

ну и соответственно добавить переменные в языки

$_['text_reviews1']                           = 'отзыв';
$_['text_reviews2']                           = 'отзыва';
$_['text_reviews3']                           = 'отзывов';
Ссылка на комменирий
Погделиться на других сайих


  • 1 год спустя...
В 17.04.2016 в 15:58, ussa сказал:

ксити вот гделал для себя склонение слова "отзыв" в товаре, если кому надо то вот

в файле controller/product/product.php строку

$data['reviews'] = sprintf($this->language->get('text_reviews'), (int)$product_info['reviews']);

заменить на:

$count = (int)$product_info['reviews'];
function getWords($number, $suffix) {
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $number % 100;
$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
return $suffix[$suffix_key];
}
$total1 = $this->language->get('text_reviews1');
$total2 = $this->language->get('text_reviews2');
$total3 = $this->language->get('text_reviews3');

$array = array($total1, $total2, $total3);
            
$data['reviews'] = $count .' '. getWords($count, $array);

ну и соответственно добавить переменные в языки

$_['text_reviews1']                           = 'отзыв';
$_['text_reviews2']                           = 'отзыва';
$_['text_reviews3']                           = 'отзывов';

Спасипотому что, пригодилось)

Ссылка на комменирий
Погделиться на других сайих

  • 1 год спустя...
В 18.03.2016 в 03:13, Shureg сказал:

Это не полное решение.

При обновлении акаксом опенкарт использует другие переменные.

Плюс, непонятно, зачем убрали вывод суммы - врогде, ТС этого не просил :-)

Полный вариант

 

В catalog\controller\common\cart.php  заменяем

$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

на

	$count = $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0);
	function getWord($number, $suffix) {
	$keys = array(2, 0, 1, 1, 1, 2);
	$mod = $number % 100;
	$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
	return $suffix[$suffix_key];
	}
	$text_items1 = $this->language->get('text_items1');
	$text_items2 = $this->language->get('text_items2');
	$text_items5 = $this->language->get('text_items5');
	$array = array($text_items1, $text_items2, $text_items5);
	$currency = $this->currency->format($total);
$data['text_items'] = $count .' '. getWord($count, $array).' - '.$currency;

а в \catalog\language\russian\common\cart.php добавляем

$_['text_items1']	= 'товар';
$_['text_items2']	= 'товара';
$_['text_items5']	= 'товаров';

Теперь аналогично надо сгделать для акакс-запросов:

 

в файле \catalog\controller\checkout\cart.php   ДВА раза надо заменить

$json['total'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total));

на

	$count = $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0);
	function getWord($number, $suffix) {
	$keys = array(2, 0, 1, 1, 1, 2);
	$mod = $number % 100;
	$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
	return $suffix[$suffix_key];
	}
	$text_items1 = $this->language->get('text_items1');
	$text_items2 = $this->language->get('text_items2');
	$text_items5 = $this->language->get('text_items5');
	$array = array($text_items1, $text_items2, $text_items5);
	$currency = $this->currency->format($total);
$json['total'] = $count .' '. getWord($count, $array).' - '.$currency;

И, соответственно, в \catalog\language\russian\checkout добавляем

$_['text_items1']	= 'товар';
$_['text_items2']	= 'товара';
$_['text_items5']	= 'товаров';

Проверено на ОС 2.102, рилииет.

 

 

Данное решение не рилииет с модулем - Simple - упроещённая регистрация и заказ.

 

Подскажите пожалуйси как адаптировать этот код для  Simple?

 $minicart = $this->simplecheckout->getSettingValue('minicartText', 'cart');
            
            $text_items = '';
            $language_code = $this->simplecheckout->getCurrentLanguageCode();

            if ($minicart && !empty($minicart[$language_code])) {
                $text_items = $minicart[$language_code];
            }

            if (!$text_items) {
                $this->language->load('checkout/cart');
                $text_items = $this->language->get('text_items');
                $this->language->load('checkout/simplecheckout');
            }

            $this->_templateData['cart_total'] = sprintf($text_items, $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->simplecheckout->formatCurrency($total));
        

 

Изменено пользователем mx928
Ссылка на комменирий
Погделиться на других сайих


  • 8 месяэтов спустя...
В 17.04.2016 в 15:58, ussa сказал:

ксити вот гделал для себя склонение слова "отзыв" в товаре, если кому надо то вот

в файле controller/product/product.php строку

$data['reviews'] = sprintf($this->language->get('text_reviews'), (int)$product_info['reviews']);

заменить на:

$count = (int)$product_info['reviews'];
function getWords($number, $suffix) {
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $number % 100;
$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
return $suffix[$suffix_key];
}
$total1 = $this->language->get('text_reviews1');
$total2 = $this->language->get('text_reviews2');
$total3 = $this->language->get('text_reviews3');

$array = array($total1, $total2, $total3);
            
$data['reviews'] = $count .' '. getWords($count, $array);

ну и соответственно добавить переменные в языки

$_['text_reviews1']                           = 'отзыв';
$_['text_reviews2']                           = 'отзыва';
$_['text_reviews3']                           = 'отзывов';

Благодарю! Пригодилось. А как его в рекомендуемые товары прикрутить икое же можно? (catalog/controller/extension/module/featured.php)

Ссылка на комменирий
Погделиться на других сайих


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы осивить комменирий

Создать аккаунт

Зарегистрируйтесь для получения аккауни. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите згдесь.

Войти сейчас
 Погделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обрилитка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфигденциальности.