Автор Тема: Заказ не подтвержден из-за высокой цены за единицу товара  (Прочитано 1995 раз)

18 Февраль 2014, 18:39:14
  • Новичок
  • *
  • Сообщений: 9
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Господа, помогите пжл. В последней стадии заказа, при нажатии кнопки "Я подтверждаю заказ" выдается следующая ошибка:

Property Order->total_paid is not valid at line 837 in file classes/ObjectModel.php
Я думаю, что из-за высокой цены за единицу товара (58 000 000 р./шт.) prestashop применяет число с плавающей запятой, что приводит к ложному сравнению total_paid и total_paid_real.
18 Февраль 2014, 19:03:10
Ответ #1
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Где у вас сравниваются  total_paid и total_paid_real?
Ошибка указывает что поле total_paid не правильного формата. Функция проверки полей, которая возвращает ошибку.
/**
 * Check for fields validity before database interaction
 *
 * @param bool $die
 * @param bool $error_return
 * @return bool|string
 */
public function validateFields($die = true, $error_return = false)
{
Проверяйте какое значение передается в этой переменной.
18 Февраль 2014, 19:30:46
Ответ #2
  • Новичок
  • *
  • Сообщений: 9
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
18 Февраль 2014, 23:28:34
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Я думаю, что из-за высокой цены за единицу товара (58 000 000 р./шт.) prestashop применяет число с плавающей запятой, что приводит к ложному сравнению total_paid и total_paid_real.
В prestashop нормально реализованна проверка чисел с плавающей точкой. Трудностей нет, так как для сравнения чисел с плавающей точкой используется верхняя граница относительной ошибки при округлении. Эта величина называется машинной эпсилон или единица округления(unit roundoff) и представляет собой самую маленькую допустимую разницу при расчетах. А при сравнении цен она равна
$unit_roundoff = 0.001;
20 Февраль 2014, 01:56:11
Ответ #4
  • Новичок
  • *
  • Сообщений: 9
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В моем случае другое, число очень большое. 58000000 = 5.8E+7
20 Февраль 2014, 11:45:14
Ответ #5
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
Возьмите любой справочник по php и посмотрите определение чисел с плавающей точкой
Цитировать
Размер числа с плавающей точкой зависит от платформы, хотя максимум, как правило составляет ~1.8e308 с точностью около 14 десятичных цифр (64-битный IEEE формат).

Проблема может быть в неверном сравнении двух таких переменных. У вас же ошибка в проверке переменной, она не соотвествует объявленой.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
23 Март 2014, 16:13:53
Ответ #6
  • Новичок
  • *
  • Сообщений: 9
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Где у вас сравниваются  total_paid и total_paid_real?
Ошибка указывает что поле total_paid не правильного формата. Функция проверки полей, которая возвращает ошибку.
/**
 * Check for fields validity before database interaction
 *
 * @param bool $die
 * @param bool $error_return
 * @return bool|string
 */
public function validateFields($die = true, $error_return = false)
{
Проверяйте какое значение передается в этой переменной.
DarinSr,
$this возвращает total_paid
$this->$field возвращает 6.8E+7

Prestashop дает ошибку если значение равно 68000000, независимо total_paid или product_price или другие перемены.
23 Март 2014, 17:37:41
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
this ничего не возвращает, это указатель, , который всегда относится к текущему объекту.
Ошибка
Order->total_paid is not validозначяет, что значение в переменной total_paid не соотвествует объявленому типу.
В кдассе Order эта переменная объявлена как float:
'total_paid' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'required' => true),значение в 68000000 для такого типа проблем не создает.

В версиях PHP 5.3.1 и 5.3.2 на 32bit была проблема, попытки обработать такое значение в виде строки через floatval (т.е. через любой ввод пользователя) приводили к подвешиванию системы. Но использование floatval редко встречается в разработке сайта.
Если у вас эти версии, то нужно проверить платежные модули на floatval.
Обновите prestashop, php. Удалите не стандарные модули. Может это поможет.
23 Март 2014, 18:14:08
Ответ #8
  • Новичок
  • *
  • Сообщений: 9
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
this ничего не возвращает, это указатель, , который всегда относится к текущему объекту.
Ошибка
Order->total_paid is not validозначяет, что значение в переменной total_paid не соотвествует объявленому типу.
В кдассе Order эта переменная объявлена как float:
'total_paid' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'required' => true),значение в 68000000 для такого типа проблем не создает.

В версиях PHP 5.3.1 и 5.3.2 на 32bit была проблема, попытки обработать такое значение в виде строки через floatval (т.е. через любой ввод пользователя) приводили к подвешиванию системы. Но использование floatval редко встречается в разработке сайта.
Если у вас эти версии, то нужно проверить платежные модули на floatval.
Обновите prestashop, php. Удалите не стандарные модули. Может это поможет.
Я менял цену 68000000 на 68000500, все нормально работает. Не знаю почему.
24 Март 2014, 00:35:07
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 1285
  • Репутация: +13/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Страно у вас работает. Разницы между 68000000 и 68000500 нет.
Попробывал ради интереса ценe 124500000.00
Сохраняю, пишет "Ошибка обновления настройки.".Хотя такую цену сохранил.
Сделал заказ, работает.
Увеличил на разряд, опять работает и так  до 124500000000.
Вот на этом чиде отказался работать. Не сохраняет,пишет "Неправильное поле цена."
Версия 1.5.6.2, работает  до 11 знаков.
24 Март 2014, 10:46:34
Ответ #10
  • Новичок
  • *
  • Сообщений: 9
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Страно у вас работает. Разницы между 68000000 и 68000500 нет.
Попробывал ради интереса ценe 124500000.00
Сохраняю, пишет "Ошибка обновления настройки.".Хотя такую цену сохранил.
Сделал заказ, работает.
Увеличил на разряд, опять работает и так  до 124500000000.
Вот на этом чиде отказался работать. Не сохраняет,пишет "Неправильное поле цена."
Версия 1.5.6.2, работает  до 11 знаков.
Да, странно нашел что именно число 68000000 в отличии от 68000500 не проходит проверку поля. Вы можете попробовать в другом интернет магазине, подставляя цену какого-то товара равную 68000000, или другую цену с 6 или более нулями, желательно чтобы число больше 58000000.
24 Март 2014, 12:25:40
Ответ #11
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Prestashop 1.5.6+PHP5.3+64bit
68 000 000
680 000 000
6 800 000 000
Такие цены у товаров, оплата по банку, в заказе нет проблем.
Вы цену в ручную набираете или копирование (подставнока браузером)? Может быть там не "0"?
24 Март 2014, 13:43:16
Ответ #12
  • Новичок
  • *
  • Сообщений: 9
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Prestashop 1.5.6+PHP5.3+64bit
68 000 000
680 000 000
6 800 000 000
Такие цены у товаров, оплата по банку, в заказе нет проблем.
Вы цену в ручную набираете или копирование (подставнока браузером)? Может быть там не "0"?
У меня Prestashop 1.5.3.1
Цены товара, которые проходят проверку поля:
50 000 000
55 000 000
56 005 000
56 000 005
68 000 500

Не проходят:
56 000 000
58 000 000
68 000 000

Настоящие нули стоят, в ручную набрал.
24 Март 2014, 13:59:05
Ответ #13
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
Похоже, что у вас проблема не в цене, так как между 55 000 000 и 56 000 000 нет разницы.
Нужно проверить логи вебсервера. Посмотрите лог ошибок, возможно там есть более детальное описание ошибки.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
24 Март 2014, 14:18:37
Ответ #14
  • Новичок
  • *
  • Сообщений: 9
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Похоже, что у вас проблема не в цене, так как между 55 000 000 и 56 000 000 нет разницы.
Нужно проверить логи вебсервера. Посмотрите лог ошибок, возможно там есть более детальное описание ошибки.
Я upload prestashop от localhost на server. В localhost цена 68 000 000 проходит, а на server не проходит проверку поля.