Количество товара нецелым числом в Заказах
Продолжаю извращаться веселиться с количеством товара, которое необходимо выразить нецелым числом.
В корзину нецелые числа получилось запихать.
Общий итог тоже подсчитывается с нецелыми исходными значениями.
При обновлении страницы с корзиной введенные ранее значения сохраняются.
Но возникла новая проблемка, даже две:
1. На странице с информацией об успешной отправке заказа мы видим опять целые значения, если же исходное значение было меньше 1, то видим 0. Эти же самые целые значения приходят и в письме на ящик заказчика. (см. картинку)
2. Если зайти в управление заказами, то там тоже целые значения, которые даже вручную не получается сменить на дробные.
Всю ночь просидел, изучая файлы минишопа, в файле core/components/minishop2/model/schema/minishop2.mysql.schema.xml нашел строчку:
В базе данных нашел таблицу ms2_order_products, там тоже изменил тип для count, но и эти манипуляции не помогли…
Интересно, что сумма за товар в заказе выводится правильно, то есть равна нецелому значению кол-ва * цену
Подскажите, люди добрые, в какую сторону копать надо?
В корзину нецелые числа получилось запихать.
Общий итог тоже подсчитывается с нецелыми исходными значениями.
При обновлении страницы с корзиной введенные ранее значения сохраняются.
Но возникла новая проблемка, даже две:
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, но и эти манипуляции не помогли…
Интересно, что сумма за товар в заказе выводится правильно, то есть равна нецелому значению кол-ва * цену
Подскажите, люди добрые, в какую сторону копать надо?
Комментарии: 8
Не знаю, что за чудеса такие… ведь сумма строки это:
cost = price * count
При этом результат умножения является правильным, значит и значения тоже правильные, но count всё-равно выводится как целое число… непонятненько…
Нашел кривенький способ — пойти обратным путем и создать новый плейсхолдер [[+mycount]] который будет выводить результат деления cost на price
В чанке msGetOrder добавил строчку:
Теперь как-то бы разобраться со значениями в панели управления заказами…
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')
: '';
...
На странице с отправленным заказом теперь отображается всё правильно, в письме тоже приходят правильные значения.Теперь как-то бы разобраться со значениями в панели управления заказами…
Изменив схему, вы ничего не изменили, т.к. сама по себе схема ничего не делает, нужно сделать ее билд. Вместо этого быстрее изменить core/components/minishop2/model/minishop2/mysql/msorderproduct.map.inc.php
Но при обновлении все опять перетрется, так что лучше так не делать.
Можно попробовать хранить в базе число, увеличенное в 10 или 100 раз, смотря какое округление у чисел, а уже выводить его, поделив на 10 или 100.
Но при обновлении все опять перетрется, так что лучше так не делать.
Можно попробовать хранить в базе число, увеличенное в 10 или 100 раз, смотря какое округление у чисел, а уже выводить его, поделив на 10 или 100.
О! Спасибо за подсказку, я просматривал мельком этот файл, но не обратил на него внимания. Изменил там тип для count на decimal, теперь и в панели управления заказами проставляются дробные значения.
Обновления минишопа выходят не так уж часто, поэтому, на мой взгляд затирание изменений это не большая проблема. После обновления опять поправлю пару строчек, да и всё.
Обновления минишопа выходят не так уж часто, поэтому, на мой взгляд затирание изменений это не большая проблема. После обновления опять поправлю пару строчек, да и всё.
Чем закончилась эпопея? У меня встал аналогичный вопрос. Поделитесь решением.
Ну в общем и целом всё работает так, как и задумывалось.
Для вывода кол-ва именно в заказах [[+mycount]] не использую, воспользовался подсказкой, которая указана выше.
Начало истории с нецелым кол-вом товара в списке товаров, в корзине, в миникорзине вот тут.
Готовой пошаговой инструкции, к сожалению нет. Внимательно прочитайте посты и комменты на эту тему и у Вас тоже всё получится.
Для вывода кол-ва именно в заказах [[+mycount]] не использую, воспользовался подсказкой, которая указана выше.
Начало истории с нецелым кол-вом товара в списке товаров, в корзине, в миникорзине вот тут.
Готовой пошаговой инструкции, к сожалению нет. Внимательно прочитайте посты и комменты на эту тему и у Вас тоже всё получится.
Спустя несколько лет вопрос все еще актуален поэтому напишу краткую инструкцию
Редактируем файлы
core/components/minishop2/model/minishop2/mscarthandler.class.php
Ищем
(у меня это строка 153)
Меняем на
core/components/minishop2/model/minishop2/mysql/msorderproduct.map.inc.php
Ищем
core/components/minishop2/model/schema/minishop2.mysql.schema.xml
Ищем
Редактируем файлы
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"/>
Интересно, можно ли часть, начинающуюся с изменения в «mysql/msorderproduct.map.inc.php» как-то сделать без вмешательства в код или все-таки нет?
Так же столкнулся с это проблемой.
Добавлю к инструкции, необходимо так же в default.js поправить строку
Без этой правки при добавлении в корзину страница будет перезагружаться, пока количество товара в корзине не достигнет единицы
Добавлю к инструкции, необходимо так же в default.js поправить строку
if (status['total_count'] < 1) {
location.reload();
}
на строкуif (status['total_count'] < 0.1) {
location.reload();
}
у меня это 283 — 285 строкаБез этой правки при добавлении в корзину страница будет перезагружаться, пока количество товара в корзине не достигнет единицы
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.