Количество товара нецелым числом в Заказах

Продолжаю извращаться веселиться с количеством товара, которое необходимо выразить нецелым числом.
В корзину нецелые числа получилось запихать.
Общий итог тоже подсчитывается с нецелыми исходными значениями.
При обновлении страницы с корзиной введенные ранее значения сохраняются.

Но возникла новая проблемка, даже две:
1. На странице с информацией об успешной отправке заказа мы видим опять целые значения, если же исходное значение было меньше 1, то видим 0. Эти же самые целые значения приходят и в письме на ящик заказчика. (см. картинку)
2. Если зайти в управление заказами, то там тоже целые значения, которые даже вручную не получается сменить на дробные.

Всю ночь просидел, изучая файлы минишопа, в файле core/components/minishop2/model/schema/minishop2.mysql.schema.xml нашел строчку:
<field key="count" dbtype="int" precision="10" phptype="integer" attributes="unsigned" null="true" default="1" />
заменил на:
<field key="count" dbtype="decimal" precision="12,2" phptype="float" null="true" default="0" />

В базе данных нашел таблицу ms2_order_products, там тоже изменил тип для count, но и эти манипуляции не помогли…
Интересно, что сумма за товар в заказе выводится правильно, то есть равна нецелому значению кол-ва * цену

Подскажите, люди добрые, в какую сторону копать надо?

start.exe
20 октября 2014, 07:09
modx.pro
4
3 422
0

Комментарии: 8

start.exe
20 октября 2014, 14:38
0
Не знаю, что за чудеса такие… ведь сумма строки это:
cost = price * count

При этом результат умножения является правильным, значит и значения тоже правильные, но count всё-равно выводится как целое число… непонятненько…

Нашел кривенький способ — пойти обратным путем и создать новый плейсхолдер [[+mycount]] который будет выводить результат деления cost на price

В чанке msGetOrder добавил строчку:

...
/** @var msOrderProduct $row */
foreach ($rows as $row) {

// добавим строчку вывода количество товара через зад
$row['mycount'] = $row['cost'] / $row['price'];

// а тут переименуем count в mycount
	$outer['cart_count'] += $row['mycount']; 

	$row['old_price'] = $miniShop2->formatPrice(
		$row['original_price'] != $row['price']
			? $row['original_price']
			: $row['old_price']
	);
	$row['price'] = $miniShop2->formatPrice($row['price']);
	$row['cost'] = $miniShop2->formatPrice($row['cost']);

	$row['weight'] = $miniShop2->formatWeight($row['weight']);

	$row['id'] = (integer) $row['id'];
	if (empty($row['name'])) {
		$row['name'] = $row['pagetitle'];
	}
	else {
		$row['pagetitle'] = $row['name'];
	}
	$row['link'] = !empty($row['id'])
		? $row['link'] = $modx->makeUrl($row['id'], '', '', 'full')
		: '';
...
На странице с отправленным заказом теперь отображается всё правильно, в письме тоже приходят правильные значения.

Теперь как-то бы разобраться со значениями в панели управления заказами…
    Виталий Киреев
    20 октября 2014, 18:20
    0
    Изменив схему, вы ничего не изменили, т.к. сама по себе схема ничего не делает, нужно сделать ее билд. Вместо этого быстрее изменить core/components/minishop2/model/minishop2/mysql/msorderproduct.map.inc.php
    Но при обновлении все опять перетрется, так что лучше так не делать.
    Можно попробовать хранить в базе число, увеличенное в 10 или 100 раз, смотря какое округление у чисел, а уже выводить его, поделив на 10 или 100.
      start.exe
      20 октября 2014, 23:58
      0
      О! Спасибо за подсказку, я просматривал мельком этот файл, но не обратил на него внимания. Изменил там тип для count на decimal, теперь и в панели управления заказами проставляются дробные значения.

      Обновления минишопа выходят не так уж часто, поэтому, на мой взгляд затирание изменений это не большая проблема. После обновления опять поправлю пару строчек, да и всё.
      maslitto
      12 декабря 2014, 11:25
      0
      Чем закончилась эпопея? У меня встал аналогичный вопрос. Поделитесь решением.
        start.exe
        12 декабря 2014, 14:32
        0
        Ну в общем и целом всё работает так, как и задумывалось.
        Для вывода кол-ва именно в заказах [[+mycount]] не использую, воспользовался подсказкой, которая указана выше.
        Начало истории с нецелым кол-вом товара в списке товаров, в корзине, в миникорзине вот тут.
        Готовой пошаговой инструкции, к сожалению нет. Внимательно прочитайте посты и комменты на эту тему и у Вас тоже всё получится.
          Дмитрий Мансуров
          12 января 2017, 00:53
          4
          0
          Спустя несколько лет вопрос все еще актуален поэтому напишу краткую инструкцию
          Редактируем файлы
          core/components/minishop2/model/minishop2/mscarthandler.class.php
          Ищем
          $count = inval($count);

          (у меня это строка 153)
          Меняем на
          $count = floatval($count);
          Файл:
          core/components/minishop2/model/minishop2/mysql/msorderproduct.map.inc.php
          Ищем
          'count' => 
              array (
                'dbtype' => 'int',
                'precision' => '10',
                'phptype' => 'integer',
                'attributes' => 'unsigned',
                'null' => true,
                'default' => 1,
              ),
          меняем на
          'count' => 
              array (
                'dbtype' => 'decimal',
                'precision' => '10,2',
                'phptype' => 'float',
                'null' => true,
                'default' => 1,
              ),
          Файл:
          core/components/minishop2/model/schema/minishop2.mysql.schema.xml
          Ищем
          <field key="count" dbtype="int" precision="10" phptype="integer" attributes="unsigned" null="true" default="1"/>
          меняем на
          <field key="count" dbtype="decimal" precision="10,2" phptype="float"  null="true" default="1"/>
            Альберт
            24 июня 2018, 18:55
            0
            Интересно, можно ли часть, начинающуюся с изменения в «mysql/msorderproduct.map.inc.php» как-то сделать без вмешательства в код или все-таки нет?
              Руслан Сафин
              13 августа 2018, 00:39
              0
              Так же столкнулся с это проблемой.

              Добавлю к инструкции, необходимо так же в default.js поправить строку
              if (status['total_count'] < 1) {
                  location.reload();
              }
              на строку
              if (status['total_count'] < 0.1) {
                  location.reload();
              }
              у меня это 283 — 285 строка

              Без этой правки при добавлении в корзину страница будет перезагружаться, пока количество товара в корзине не достигнет единицы
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              8