Pihaluch Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 Добрый день. На сайте нужно было сделать скидки для групп покупателей. На форумах нашел такое решение: if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; } Следующим шагом пытаюсь реализовать округление цены до 50 копеек в большую сторону. То есть если цена 12.05 должно получиться 12.50, если цена 12.51 округляем до 13.00 Для этого я использую функцию php ceil(), но почему-то цены не приходят к нужному виду. Например была цена 11.82 ( уже со скидкой), записываю округление следующим образом: if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; $price = ceil($price / 0.5) * 0.5; } По логике цена должна округлиться до 12.00, а она округляется до 12.12 И такое происходит со всеми ценами, после округления получается 13.13, 14.14, 6.06, 9.09. Подскажите в каком направлении копать? Возможно неверно использую функцию ceil()? Заранее спасибо за ответ. Надіслати Поділитися на інших сайтах More sharing options...
100napb Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 1 hour ago, Pihaluch said: И такое происходит со всеми ценами, после округления получается 13.13, 14.14, 6.06, 9.09. Подскажите в каком направлении копать? Код выглядит верным. А Ваши результаты выглядят так, словно где-то срабатывает строковая конкатикация. Ради проверки можете после блока вычислений вывести промежуточный результат в журнал ошибок опенкарта. Вот так: Spoiler if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; $price = ceil($price / 0.5) * 0.5; } $this->log->write("New price = " . $price); Посмотрите по коду ниже, какие операции над $price еще производятся. Скорее всего где-то накосячили или "неожиданно" приведение типа переменной к строке работает. Например, когда символ валюты приписывается. Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 $price = round($price+0.5,0) Надіслати Поділитися на інших сайтах More sharing options... whiteblue Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 2 часа назад, Pihaluch сказал: Добрый день. На сайте нужно было сделать скидки для групп покупателей. На форумах нашел такое решение: if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; } Следующим шагом пытаюсь реализовать округление цены до 50 копеек в большую сторону. То есть если цена 12.05 должно получиться 12.50, если цена 12.51 округляем до 13.00 Для этого я использую функцию php ceil(), но почему-то цены не приходят к нужному виду. Например была цена 11.82 ( уже со скидкой), записываю округление следующим образом: if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; $price = ceil($price / 0.5) * 0.5; } По логике цена должна округлиться до 12.00, а она округляется до 12.12 И такое происходит со всеми ценами, после округления получается 13.13, 14.14, 6.06, 9.09. Подскажите в каком направлении копать? Возможно неверно использую функцию ceil()? Заранее спасибо за ответ. все это умеет делать калькулятор Если нет девушки МегаКалькулятора - то есть руки Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 18 вересня 2019 Автор Share Опубліковано: 18 вересня 2019 1 час назад, 100napb сказал: Код выглядит верным. А Ваши результаты выглядят так, словно где-то срабатывает строковая конкатикация. Ради проверки можете после блока вычислений вывести промежуточный результат в журнал ошибок опенкарта. Вот так: Показать контент if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; $price = ceil($price / 0.5) * 0.5; } $this->log->write("New price = " . $price); Посмотрите по коду ниже, какие операции над $price еще производятся. Скорее всего где-то накосячили или "неожиданно" приведение типа переменной к строке работает. Например, когда символ валюты приписывается. По коду дальше с $price ничего подозрительного не происходит, но мне удалось установить от чего, как мне кажется, зависти такой вид цены. Если поставить валюту $ то всё работает корректно. В настройках валюты в админке у нее стоит курс 1.0000000, а у рублей курс 2.01999998 (белорусские рубли). Получается при округлении учитывается еще и курс? Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 18 вересня 2019 Автор Share Опубліковано: 18 вересня 2019 2 часа назад, chukcha сказал: $price = round($price+0.5,0) round не округляет так как мне нужно, притом всё равно конечный результат не верный. Надіслати Поділитися на інших сайтах More sharing options... 100napb Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 4 hours ago, Pihaluch said: Получается при округлении учитывается еще и курс? смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением... Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка... $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше... Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 19 вересня 2019 Автор Share Опубліковано: 19 вересня 2019 16 часов назад, 100napb сказал: смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением... Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка... $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше... Округление делал в файлах контроллера. Видимо поэтому и не получались правильные значения. Так как вы и сказали. Но вчера я нашел куда копать и у меня получилось сделать округление так как надо. Заходим в файл \system\library\currency.php и в функции public function format() находим вот такую строчку: $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); и меняем на такую: $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); В итоге всё округляется верно. Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: if ($this->config->get('config_currency_id') == 4) { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Ничего не происходит, я так подозреваю что ошибка вот в этой строке ($this->config->get('config_currency_id') == 4) Подскажите пожалуйста как правильно это сделать? Надіслати Поділитися на інших сайтах More sharing options... 100napb Опубліковано: 19 вересня 2019 Share Опубліковано: 19 вересня 2019 14 minutes ago, Pihaluch said: Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: посмотрите в сторону $this->session->data['currency'] Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 23 вересня 2019 Автор Share Опубліковано: 23 вересня 2019 (змінено) В 19.09.2019 в 12:19, 100napb сказал: посмотрите в сторону $this->session->data['currency'] Спасибо большое, получилось. Сделал вот так if($this->session->data['currency'] == 'BYN') { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Но теперь почему-то валюту 'USD' в корзине и карточке товара всё равно округляет. То есть в категориях, в поиске, всё в порядке, а в карточке и в корзине та же позиция уже идет с округленной ценой. И это только с 'USD' с 'EUR' такого нету. Почему так происходит? Я так понимаю currency.php это конечный файл, после него с ценой ничего не происходит. Получается в этом файле нужно искать решение? Змінено 23 вересня 2019 користувачем Pihaluch проблема не решена Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 2.x Opencart 2.x: Пісочниця Округление до 50 копеек в большую сторону Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich Промо банери в категоріях товарів Автор: IHOR1989 Trend - адаптивний універсальний шаблон Автор: DSV × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
chukcha Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 $price = round($price+0.5,0) Надіслати Поділитися на інших сайтах More sharing options... whiteblue Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 2 часа назад, Pihaluch сказал: Добрый день. На сайте нужно было сделать скидки для групп покупателей. На форумах нашел такое решение: if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; } Следующим шагом пытаюсь реализовать округление цены до 50 копеек в большую сторону. То есть если цена 12.05 должно получиться 12.50, если цена 12.51 округляем до 13.00 Для этого я использую функцию php ceil(), но почему-то цены не приходят к нужному виду. Например была цена 11.82 ( уже со скидкой), записываю округление следующим образом: if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; $price = ceil($price / 0.5) * 0.5; } По логике цена должна округлиться до 12.00, а она округляется до 12.12 И такое происходит со всеми ценами, после округления получается 13.13, 14.14, 6.06, 9.09. Подскажите в каком направлении копать? Возможно неверно использую функцию ceil()? Заранее спасибо за ответ. все это умеет делать калькулятор Если нет девушки МегаКалькулятора - то есть руки Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 18 вересня 2019 Автор Share Опубліковано: 18 вересня 2019 1 час назад, 100napb сказал: Код выглядит верным. А Ваши результаты выглядят так, словно где-то срабатывает строковая конкатикация. Ради проверки можете после блока вычислений вывести промежуточный результат в журнал ошибок опенкарта. Вот так: Показать контент if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; $price = ceil($price / 0.5) * 0.5; } $this->log->write("New price = " . $price); Посмотрите по коду ниже, какие операции над $price еще производятся. Скорее всего где-то накосячили или "неожиданно" приведение типа переменной к строке работает. Например, когда символ валюты приписывается. По коду дальше с $price ничего подозрительного не происходит, но мне удалось установить от чего, как мне кажется, зависти такой вид цены. Если поставить валюту $ то всё работает корректно. В настройках валюты в админке у нее стоит курс 1.0000000, а у рублей курс 2.01999998 (белорусские рубли). Получается при округлении учитывается еще и курс? Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 18 вересня 2019 Автор Share Опубліковано: 18 вересня 2019 2 часа назад, chukcha сказал: $price = round($price+0.5,0) round не округляет так как мне нужно, притом всё равно конечный результат не верный. Надіслати Поділитися на інших сайтах More sharing options... 100napb Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 4 hours ago, Pihaluch said: Получается при округлении учитывается еще и курс? смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением... Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка... $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше... Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 19 вересня 2019 Автор Share Опубліковано: 19 вересня 2019 16 часов назад, 100napb сказал: смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением... Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка... $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше... Округление делал в файлах контроллера. Видимо поэтому и не получались правильные значения. Так как вы и сказали. Но вчера я нашел куда копать и у меня получилось сделать округление так как надо. Заходим в файл \system\library\currency.php и в функции public function format() находим вот такую строчку: $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); и меняем на такую: $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); В итоге всё округляется верно. Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: if ($this->config->get('config_currency_id') == 4) { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Ничего не происходит, я так подозреваю что ошибка вот в этой строке ($this->config->get('config_currency_id') == 4) Подскажите пожалуйста как правильно это сделать? Надіслати Поділитися на інших сайтах More sharing options... 100napb Опубліковано: 19 вересня 2019 Share Опубліковано: 19 вересня 2019 14 minutes ago, Pihaluch said: Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: посмотрите в сторону $this->session->data['currency'] Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 23 вересня 2019 Автор Share Опубліковано: 23 вересня 2019 (змінено) В 19.09.2019 в 12:19, 100napb сказал: посмотрите в сторону $this->session->data['currency'] Спасибо большое, получилось. Сделал вот так if($this->session->data['currency'] == 'BYN') { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Но теперь почему-то валюту 'USD' в корзине и карточке товара всё равно округляет. То есть в категориях, в поиске, всё в порядке, а в карточке и в корзине та же позиция уже идет с округленной ценой. И это только с 'USD' с 'EUR' такого нету. Почему так происходит? Я так понимаю currency.php это конечный файл, после него с ценой ничего не происходит. Получается в этом файле нужно искать решение? Змінено 23 вересня 2019 користувачем Pihaluch проблема не решена Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 2.x Opencart 2.x: Пісочниця Округление до 50 копеек в большую сторону Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich Промо банери в категоріях товарів Автор: IHOR1989 Trend - адаптивний універсальний шаблон Автор: DSV
whiteblue Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 2 часа назад, Pihaluch сказал: Добрый день. На сайте нужно было сделать скидки для групп покупателей. На форумах нашел такое решение: if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; } Следующим шагом пытаюсь реализовать округление цены до 50 копеек в большую сторону. То есть если цена 12.05 должно получиться 12.50, если цена 12.51 округляем до 13.00 Для этого я использую функцию php ceil(), но почему-то цены не приходят к нужному виду. Например была цена 11.82 ( уже со скидкой), записываю округление следующим образом: if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; $price = ceil($price / 0.5) * 0.5; } По логике цена должна округлиться до 12.00, а она округляется до 12.12 И такое происходит со всеми ценами, после округления получается 13.13, 14.14, 6.06, 9.09. Подскажите в каком направлении копать? Возможно неверно использую функцию ceil()? Заранее спасибо за ответ. все это умеет делать калькулятор Если нет девушки МегаКалькулятора - то есть руки Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 18 вересня 2019 Автор Share Опубліковано: 18 вересня 2019 1 час назад, 100napb сказал: Код выглядит верным. А Ваши результаты выглядят так, словно где-то срабатывает строковая конкатикация. Ради проверки можете после блока вычислений вывести промежуточный результат в журнал ошибок опенкарта. Вот так: Показать контент if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; $price = ceil($price / 0.5) * 0.5; } $this->log->write("New price = " . $price); Посмотрите по коду ниже, какие операции над $price еще производятся. Скорее всего где-то накосячили или "неожиданно" приведение типа переменной к строке работает. Например, когда символ валюты приписывается. По коду дальше с $price ничего подозрительного не происходит, но мне удалось установить от чего, как мне кажется, зависти такой вид цены. Если поставить валюту $ то всё работает корректно. В настройках валюты в админке у нее стоит курс 1.0000000, а у рублей курс 2.01999998 (белорусские рубли). Получается при округлении учитывается еще и курс? Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 18 вересня 2019 Автор Share Опубліковано: 18 вересня 2019 2 часа назад, chukcha сказал: $price = round($price+0.5,0) round не округляет так как мне нужно, притом всё равно конечный результат не верный. Надіслати Поділитися на інших сайтах More sharing options... 100napb Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 4 hours ago, Pihaluch said: Получается при округлении учитывается еще и курс? смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением... Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка... $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше... Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 19 вересня 2019 Автор Share Опубліковано: 19 вересня 2019 16 часов назад, 100napb сказал: смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением... Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка... $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше... Округление делал в файлах контроллера. Видимо поэтому и не получались правильные значения. Так как вы и сказали. Но вчера я нашел куда копать и у меня получилось сделать округление так как надо. Заходим в файл \system\library\currency.php и в функции public function format() находим вот такую строчку: $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); и меняем на такую: $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); В итоге всё округляется верно. Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: if ($this->config->get('config_currency_id') == 4) { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Ничего не происходит, я так подозреваю что ошибка вот в этой строке ($this->config->get('config_currency_id') == 4) Подскажите пожалуйста как правильно это сделать? Надіслати Поділитися на інших сайтах More sharing options... 100napb Опубліковано: 19 вересня 2019 Share Опубліковано: 19 вересня 2019 14 minutes ago, Pihaluch said: Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: посмотрите в сторону $this->session->data['currency'] Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 23 вересня 2019 Автор Share Опубліковано: 23 вересня 2019 (змінено) В 19.09.2019 в 12:19, 100napb сказал: посмотрите в сторону $this->session->data['currency'] Спасибо большое, получилось. Сделал вот так if($this->session->data['currency'] == 'BYN') { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Но теперь почему-то валюту 'USD' в корзине и карточке товара всё равно округляет. То есть в категориях, в поиске, всё в порядке, а в карточке и в корзине та же позиция уже идет с округленной ценой. И это только с 'USD' с 'EUR' такого нету. Почему так происходит? Я так понимаю currency.php это конечный файл, после него с ценой ничего не происходит. Получается в этом файле нужно искать решение? Змінено 23 вересня 2019 користувачем Pihaluch проблема не решена Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 2.x Opencart 2.x: Пісочниця Округление до 50 копеек в большую сторону
Pihaluch Опубліковано: 18 вересня 2019 Автор Share Опубліковано: 18 вересня 2019 1 час назад, 100napb сказал: Код выглядит верным. А Ваши результаты выглядят так, словно где-то срабатывает строковая конкатикация. Ради проверки можете после блока вычислений вывести промежуточный результат в журнал ошибок опенкарта. Вот так: Показать контент if ($this->config->get('config_customer_group_id') == 10) { $price = $price - ($price / 100) * 10; $price = ceil($price / 0.5) * 0.5; } $this->log->write("New price = " . $price); Посмотрите по коду ниже, какие операции над $price еще производятся. Скорее всего где-то накосячили или "неожиданно" приведение типа переменной к строке работает. Например, когда символ валюты приписывается. По коду дальше с $price ничего подозрительного не происходит, но мне удалось установить от чего, как мне кажется, зависти такой вид цены. Если поставить валюту $ то всё работает корректно. В настройках валюты в админке у нее стоит курс 1.0000000, а у рублей курс 2.01999998 (белорусские рубли). Получается при округлении учитывается еще и курс? Надіслати Поділитися на інших сайтах More sharing options...
Pihaluch Опубліковано: 18 вересня 2019 Автор Share Опубліковано: 18 вересня 2019 2 часа назад, chukcha сказал: $price = round($price+0.5,0) round не округляет так как мне нужно, притом всё равно конечный результат не верный. Надіслати Поділитися на інших сайтах More sharing options...
100napb Опубліковано: 18 вересня 2019 Share Опубліковано: 18 вересня 2019 4 hours ago, Pihaluch said: Получается при округлении учитывается еще и курс? смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением... Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка... $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше... Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 19 вересня 2019 Автор Share Опубліковано: 19 вересня 2019 16 часов назад, 100napb сказал: смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением... Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка... $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше... Округление делал в файлах контроллера. Видимо поэтому и не получались правильные значения. Так как вы и сказали. Но вчера я нашел куда копать и у меня получилось сделать округление так как надо. Заходим в файл \system\library\currency.php и в функции public function format() находим вот такую строчку: $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); и меняем на такую: $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); В итоге всё округляется верно. Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: if ($this->config->get('config_currency_id') == 4) { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Ничего не происходит, я так подозреваю что ошибка вот в этой строке ($this->config->get('config_currency_id') == 4) Подскажите пожалуйста как правильно это сделать? Надіслати Поділитися на інших сайтах More sharing options... 100napb Опубліковано: 19 вересня 2019 Share Опубліковано: 19 вересня 2019 14 minutes ago, Pihaluch said: Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: посмотрите в сторону $this->session->data['currency'] Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 23 вересня 2019 Автор Share Опубліковано: 23 вересня 2019 (змінено) В 19.09.2019 в 12:19, 100napb сказал: посмотрите в сторону $this->session->data['currency'] Спасибо большое, получилось. Сделал вот так if($this->session->data['currency'] == 'BYN') { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Но теперь почему-то валюту 'USD' в корзине и карточке товара всё равно округляет. То есть в категориях, в поиске, всё в порядке, а в карточке и в корзине та же позиция уже идет с округленной ценой. И это только с 'USD' с 'EUR' такого нету. Почему так происходит? Я так понимаю currency.php это конечный файл, после него с ценой ничего не происходит. Получается в этом файле нужно искать решение? Змінено 23 вересня 2019 користувачем Pihaluch проблема не решена Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку
Pihaluch Опубліковано: 19 вересня 2019 Автор Share Опубліковано: 19 вересня 2019 16 часов назад, 100napb сказал: смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением... Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка... $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше... Округление делал в файлах контроллера. Видимо поэтому и не получались правильные значения. Так как вы и сказали. Но вчера я нашел куда копать и у меня получилось сделать округление так как надо. Заходим в файл \system\library\currency.php и в функции public function format() находим вот такую строчку: $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); и меняем на такую: $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); В итоге всё округляется верно. Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: if ($this->config->get('config_currency_id') == 4) { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Ничего не происходит, я так подозреваю что ошибка вот в этой строке ($this->config->get('config_currency_id') == 4) Подскажите пожалуйста как правильно это сделать? Надіслати Поділитися на інших сайтах More sharing options...
100napb Опубліковано: 19 вересня 2019 Share Опубліковано: 19 вересня 2019 14 minutes ago, Pihaluch said: Есть только один момент, как прописать условие при котором если выбрана одна валюта округление работает, а в иных случаях не работает? Я пробовал делать вот так: посмотрите в сторону $this->session->data['currency'] Надіслати Поділитися на інших сайтах More sharing options... Pihaluch Опубліковано: 23 вересня 2019 Автор Share Опубліковано: 23 вересня 2019 (змінено) В 19.09.2019 в 12:19, 100napb сказал: посмотрите в сторону $this->session->data['currency'] Спасибо большое, получилось. Сделал вот так if($this->session->data['currency'] == 'BYN') { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Но теперь почему-то валюту 'USD' в корзине и карточке товара всё равно округляет. То есть в категориях, в поиске, всё в порядке, а в карточке и в корзине та же позиция уже идет с округленной ценой. И это только с 'USD' с 'EUR' такого нету. Почему так происходит? Я так понимаю currency.php это конечный файл, после него с ценой ничего не происходит. Получается в этом файле нужно искать решение? Змінено 23 вересня 2019 користувачем Pihaluch проблема не решена Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0
Pihaluch Опубліковано: 23 вересня 2019 Автор Share Опубліковано: 23 вересня 2019 (змінено) В 19.09.2019 в 12:19, 100napb сказал: посмотрите в сторону $this->session->data['currency'] Спасибо большое, получилось. Сделал вот так if($this->session->data['currency'] == 'BYN') { $string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point); } else { $string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point); } Но теперь почему-то валюту 'USD' в корзине и карточке товара всё равно округляет. То есть в категориях, в поиске, всё в порядке, а в карточке и в корзине та же позиция уже идет с округленной ценой. И это только с 'USD' с 'EUR' такого нету. Почему так происходит? Я так понимаю currency.php это конечный файл, после него с ценой ничего не происходит. Получается в этом файле нужно искать решение? Змінено 23 вересня 2019 користувачем Pihaluch проблема не решена Надіслати Поділитися на інших сайтах More sharing options...
Recommended Posts