Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Как заставить работать с дробным количеством товара?

Следить
Главная
20:34
15 дек
#
?
Виктор, Triolan-Net, Киев написал:

Здравствуйте!

Как заставить CMS работать с дробным количеством товара? Товар продается метрами, может быть не целое количество, но в корзине возможно оперировать только целыми числами, и в админке тоже. А при торговле отрезами ткани может быть например 1.2 метра.

В шаблоне админпанели есть файл admin_page.htm в нем есть строка count = parseInt(object.value);

Поменял на count = parseFloat(object.value); и в файле шаблона админпанели admin_order.htm добавил в поле ввода количества атрибут step="0.01"

Работает! Но при сохранении не запоминаются числа 2.2 и тому подобные дробные.

22:43
15 дек
#
?
Дмитрий, LocalNet, Стаханов написал:

В этой CMS все работы по созданию клиентской и админской части модулей, отвечающих за работу с корзиной и заказами, а также связанные с ними таблицы и файлы шаблонов (дефолтных клиентского и админского) к сожалению выполнялись без возможности дробных значений в колонке "Количество товара". Поэтому решать вашу задачу можно двумя "костыльными" способами.

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

Второй способ легче, он в принципе напоминает проделанный вами путь выше. Только ваши правки касались обработки введенного дробного количества в пределах формы на клиентской стороне. Вне этой формы количество товара обрабатывалось уже как целое число, ведь исходный код (серверная часть) модуля так и остался неизменным.

  • Вам нужно было делить на 100 входящий целочисленный параметр "Количество" прямо на входе в форму, то есть когда рендерится тег поля ввода в файле шаблона или же перенести это не клиентскую сторону (например в событие body.onload).
  • Внутри формы работать с полем так как вы расписали выше.
  • А при отправке формы (то есть в событии form.onsubmit) этот дробный параметр умножать на 100, чтобы снова получить целочисленный для передачи модулю как будто никаких преобразований не было.

Таким образом, таблица заказов будет хранить данные о приобретенном метраже тканей в сантиметрах, например 120 см, а в форме ввода это целое число всего лишь будет представлено как дробное 1.2 метра.

01:31
16 дек
#
?
Nikolay, ER-Telecom, Самара написал:

Костыль еще тот. Придется повторить его и в корзине фронтенда. И админу вводить цены за сантиметр)

11:41
16 дек
#
?
Дмитрий, LocalNet, Стаханов написал:

Ну если знаете способ проще - предлагайте. Мой пока меньший по количеству исправлений.

20:30
16 дек
#
?
Виктор, Triolan-Net, Киев написал:

В таблице orders_products базы данных изменил тип поля quantity со значения int на значение float, всё равно сохраняется целое число.

Помогите пожалуйста очень нужно! У нас товар не метрами, а штуками и половинками, например 10.5, 2.5 штук.

17:37
17 дек
#
?
Дмитрий, LocalNet, Стаханов написал:

Предпочли все-таки первый способ? Тогда понадобится выполнить следующие шаги в модельке базы данных (определенном PHP-классе), предназначенной для работы с таблицой заказов:

  • 1. исправить тип поля quantity
  • 2. запустить в CMS проверку целостности таблиц
  • 3. исправить алгоритм сохранения поля quantity

Для реализации шага 1 откройте файл objects/.db-models/Orders.php, найдите ближе к концу файла метод check_products и в нем есть следующая строка, которую я помечу сейчас таким цветом как неправильную для вашей задачи.

public function check_products () {
    ...
    // количество
    $name = 'quantity';
    $type = 'INT(11)';
    ...
}

Измените эту строку так, чтобы тип был FLOAT с некоторым размером поля в виде общего количества цифр и количества цифр после запятой. Для понятности я показал это изменение таким цветом.

public function check_products () {
    ...
    // количество
    $name = 'quantity';
    $type = 'FLOAT(17,6)';
    ...
}

Теперь нужно выполнить шаг 2, так как в CMS встроен механизм автоматической коррекции структуры таблиц согласно прописанным в их модельках базы данных.

  • Для этой операции зайдите в админпанель,
  • далее идите в меню "утилиты -> Очистка кешей",
  • включите там флажок "Инициировать проверку структурного соответствия таблиц базы данных"
  • и нажмите кнопку Выполнить.

Теперь нужно выполнить шаг 3. Снова откройте файл упоминавшейся выше модельки, найдите метод update_product и в нем будет такая неправильная для вас строка.

public function update_product () {
    ...
    if (isset($item->quantity)) ...value_as_integer($item->quantity)) . '\'';}
    ...
}

Измените эту строку так.

public function update_product () {
    ...
    if (isset($item->quantity)) ...value_as_float($item->quantity)) . '\'';}
    ...
}

Тогда CMS сможет сохранять поле количества в дробном виде.

19:15
17 дек
#
?
Виктор, Triolan-Net, Киев написал:

Сделал все Ваши действия, но все равно при сохранении становится целое число! Уже неделю долблюсь

19:06
18 дек
#
?
Дмитрий, LocalNet, Стаханов написал:

Каюсь, упустил что еще надо сделать соответствующее изменение и в модели редактора.

В общем, вам следует выполнить шаг 4 - откройте файл objects/.any-models/Editor.php и найдите там метод processOrderItems, а в нем следующие строки.

public function processOrderItems ( & $item, $id, & $cancel ) {
    ...
    // количество
    $quantity = 1;
    if (isset($_POST['orderitem_quantity'][$id][$index])) {
        $quantity = intval($_POST['orderitem_quantity'][$id][$index]);
        if ($quantity < -10000) $quantity = -10000;
        if ($quantity > 10000) $quantity = 10000;
        if ($quantity == 0) $quantity = 1;
        $item->products[$index]->quantity = $quantity;
    }
    ...
}

Замените отмеченную выше строку следующими строками, обозначенными таким цветом.

public function processOrderItems ( & $item, $id, & $cancel ) {
    ...
    // количество
    $quantity = 1;
    if (isset($_POST['orderitem_quantity'][$id][$index])) {
        $quantity = $_POST['orderitem_quantity'][$id][$index];
        $quantity = $this->number->floatValue($quantity);
        $quantity = round($quantity, 2);
        if ($quantity < -10000) $quantity = -10000;
        if ($quantity > 10000) $quantity = 10000;
        if ($quantity == 0) $quantity = 1;
        $item->products[$index]->quantity = $quantity;
    }
    ...
}

Здесь я разложил одно действие на три строки: берем СТРОЧНОЕ значение из пришедшей формы, парсим его как ДРОБНОЕ ЧИСЛО, округляем до 2 знаков после запятой.

20:41
18 дек
#
?
Виктор, Vedekon2-Net, Киев написал:

Без вашей помощи я бы еще две недели искал решение. Короче я так понимаю, мы почти земляки (я с Шахтерска). Огромное спасибо и низкий поклон, а также желаю Вам и Вашим близким крепкого здоровья, мира, любви, счастья и благополучия. С наступающим Вас!

Написание ответа

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


Обратите внимание! Для противодействия спаму новые посты форума проявляются с задержкой от нескольких минут, пока не пройдут модерацию.