devel

Нули в цене

Рекомендуемые сообщения

devel    33

Разбираясь с order_form.php наткнулся на такой момент: если добавить в существующий заказ еще товар, то после сообщения об успешном добавлении товара в заказ, цена меняется с дробной на целую. Т.е., допустим было 1550.0000, стало 1550.

Первая цифра выводится php в том виде в котором она есть в БД (1550.0000), и может быть "отформатирована" в нужный формат (хххх.хх) с помощью sprintf (например, так: <?php echo sprintf("%01.2f", $order_product['price']); ?>). А вторая получается в результате отработки javasript в шаблоне:

html += '  <td class="right">' + product['price'] + '<input type="hidden" name="order_product[' + product_row + '][price]" value="' + product['price'] + '" /></td>';

Как "отформатировать" вывод "+ product['price'] +", чтобы был формат хххх.хх, т.е с плавающей точкой, два разряда после точки. Мне кажется, что этот скрипт выводит строку, а нам нужно число. 

Слышал, что на js простого преобразование типов нет. Можете что-нибудь посоветовать?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
rb2    390

Слышал, что на js простого преобразование типов нет. Можете что-нибудь посоветовать?

Слышал, гугл многие советуют.

https://github.com/alexei/sprintf.js

http://www.diveintojavascript.com/projects/javascript-sprintf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
afwollis    1 091

слышал, parseFloat никто не отменял  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

Хватит стебаться, люди! ))

Я вопрос сформулировал не правильно. Если даже product['price'] в js и строка, то и выводился бы как строка хххх.хх, верно?

А выводится без дробной части. Значит, так в json['order_product'] попал. И неважно, str или float.

Верно я говорю? ))

Вот если бы product['price'] все таки был строкой вида хххх.хх, тогда  parseFloat мне бы помог. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

В catalog\controller\checkout\manual.php price уже целое число. Вот такой эксперимент показывает, что json передает то, что в него посылают.

$json['order_product'][] = array(
					'product_id' => $product['product_id'],
					'name'       => $product['name'],
					'model'      => $product['model'], 
					'option'     => $option_data,
					'download'   => $download_data,
					'quantity'   => $product['quantity'],
					'stock'      => $product['stock'],
					'price'      => 1111.11,								
//					'price'      => $product['price'],	
					'total'      => $product['total'],	
					'tax'        => $this->tax->getTax($product['price'], $product['tax_class_id']),
					'reward'     => $product['reward']				
				);

В заказ попадет цена 1111.11.

В БД в order_product цены вида хххх.хххх. А вот в этом месте:

			$products = $this->cart->getProducts();
							
			foreach ($products as $product) {
				$product_total = 0;
				echo var_dump($this->cart->getProducts());
...
...
...

}

в дампе уже вот такая штука:

 ["price"]=>
float(1090)
 ["total"]=>
float(1090)

Т.е. само число целое, но тип данных стоит float... Может быть искать в $products = $this->cart->getProducts()? 

Это, кстати, какой cart.php?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mpn2005    332

Смотрите в system/library/cart.php

Это оттуда функция.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

Посмотрел, ничего необычного не увидел... Я, похоже, в дебри залез. Почему-то действие "submit" ajax-ом вытаскивает цены без дробной части...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

Добавил скрины, чтобы было сразу понятно, о чем я тут глаголю:

Нули после точки исчезают и в Total

post-7857-0-87303100-1384945775_thumb.jpg

post-7857-0-65053200-1384945782_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
rb2    390

Вы бы сперва проверили настройки валюты в админке. Может там стоит округление до "0" знаков после запятой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

Это происходит на чистом opencart 1.5.6, основная валюта: $ (с рублем тоже самое)

 

post-7857-0-56374700-1384949740_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mpn2005    332

А сайт в локалке или на хостинге?

 

Если на хостинге, киньте логин пароль в личку. Попробую поэкспериментировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mpn2005    332

Посмотрел у себя на версии 1.5.4.1 и там тоже похожая ситуация в админке.

 

Скорее всего это будет и на других версиях.

Расскажите подробнее о целях вывода в определённом формате в админке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mpn2005    332

Для форматирования в валюте по умолчанию замените в файле admin/controller/sale/oprder.php строки:

				'price'            => $order_product['price'],
				'total'            => $order_product['total'],

На:

				'price'            =>  $this->currency->format($order_product['price']),
				'total'            => $this->currency->format($order_product['total']),

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mpn2005    332

Для правильной работы ajax запроса правим файл catalog/controller/checkout/manual.php

Строки:

					'price'      => $product['price'],	
					'total'      => $product['total'],	

Меняем на:

					'price'      => $this->currency->format($product['price']),	
					'total'      => $this->currency->format($product['total']),	

Вроде всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

Цель проста - единый вид выводимых данных. Я занимался этим вопросом, и столкнулся с тем, что независимо от настроек валюты в админке, относительно количества разрядов после разделителя дробной и целой частей в некоторых местах формат вывода цен имеет отличный вид: либо хххх (целое), либо хххх.хххх (с плавающей точкой, но с бОльшим числом разрядов после точки). В админке у меня стандартно - 2 разряда после точки. Валюта рубль. Пробовал на чистом и "пиленном" ИМ, с разными валютами.  Я пришел к выводу, что отображение цен в order_form.tpl не проработанно в 1.5.6. Пришлось вносить правки в контроллер и шаблон, Но полностью решить проблему не удается. После обновления формы (нажатия кнопки "Добавить товар", например) все  цены выводится, игнорируя настройки валюты. Например, НДС высчитывается юолее 6 разрядов после точки. А цена и Итого - целые числа. Я не использую копеек в ИМ, но так не должно быть, по идее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

mpn2005, спасибо!

В контроллере я раньше эти правки внес. А вот manual.php... 7 раз смотрел на этот массив, и не заметил. Пытался передавать из него число 1111.22, и все работало. Не додумался =) 

Только у меня в контроллере:

'price'    => $this->currency->format($product['price'], $order_info['currency_code'], $order_info['currency_value']),
'total'    => $this->currency->format($product['total'], $order_info['currency_code'], $order_info['currency_value'])

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

Заметил следующее. Зашел как покупатель (не логинился, просто открыл главную), установил валюту евро. Зашел в админку админом, открыл кем-то ранее созданный заказ, изменил кол-во товара и отправил запрос (нажал кнопку) - цены стали в евро )))). Это если вкладки открыты в одном браузере. Если в разных - такого не происходит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mpn2005    332

Тут уже смотря как надо. Можно с налогом или без налога.

Можно (если надо) в другую валюту перевести.

 

Добавление товара идёт через этот manual.php.

 

Если надо проводить манипуляции с товарами в заказе, то надо туда и вносить изменения.

И ajax запрос будет нормально отрабатывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mpn2005    332

Заметил следующее. Зашел как покупатель (не логинился, просто открыл главную), установил валюту евро. Зашел в админку админом, открыл кем-то ранее созданный заказ, изменил кол-во товара и отправил запрос (нажал кнопку) - цены стали в евро )))). Это если вкладки открыты в одном браузере. Если в разных - такого не происходит

 

Эти функции разнесены на пользовательскую часть и админскую.

При формате валюты в клиентской части берётся валюта из сессии пользователя.

 

По хорошему там нужно напрямую указать например валюту по умолчанию в магазине.

И в неё переводить.

 

Подробнее можно глянуть в system/library/currency.php

Функция - public function format($number, $currency = '', $value = '', $format = true)

Вторым параметром идёт код валюты.

Добавьте его в вышеописанные правки явным образом.

Например: $this->currency->format($product['total'], 'RUB')

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

mpn2005, я тогда задам еще один вопрос, на эту же тему. В табе Итоги выводится общая сумма и налог. В шаблоне это строка:

<td class="right"><?php echo $order_total['value']; ?></td>

Выводятся цены без копеек. Я пошел по легкому пути, увидел в БД поле text и вывел его:

<td class="right"><?php echo $order_total['text']; ?></td>

Но это же не верно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mpn2005    332

С полем total нужно проделать те же изменения.

В обоих файлах.

 

Чтобы и при открытии страницы и при добавлении товара (ajax запросом) было всё корректно.

 

P.S.: В том месте нет ajax запросов по изменению товаров.

Достаточно поменять вывод в админ части.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33
Например: $this->currency->format($product['total'], 'RUB')

Да, это работает. Внес в manual.php

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

С полем total нужно проделать те же изменения.

В обоих файлах.

 

Чтобы и при открытии страницы и при добавлении товара (ajax запросом) было всё корректно.

 

P.S.: В том месте нет ajax запросов по изменению товаров.

Достаточно поменять вывод в админ части.

Я имею ввиду Totals:

post-7857-0-95820000-1384961985_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mpn2005    332

С тоталсами можно как Вы и писали value заменить на text

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
devel    33

ОК. Большое спасибо, mpn2005! Реально помогли. 

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу