Несколько единиц измерения товаров Opencart (OcStore)

Изначально Opencart заточен только для работы со штучными товарами. Но магазины часто продают мерный товар. Например, керамическую плитку. Базовая плита продается с ценой за квадратный метр, а бордюры с ценой за штуку. Как сделать несколько единиц измерения товаров в Opencart? Для этого нужно у каждого товара прописать его единицу измерения: шт, м2, м.п. и тому подобное. Тогда цена будет выводиться так:

1500р./м2
200р./шт

и так далее.

При этом нужно помнить, что мерный товар обычно имеет дробное количество, например 5.048 м2
Как сделать дробное количество товара описано в этой заметке.

Теперь по порядку. Если у вас на сайте установлены модификаторы, например Simple, то после внесения изменений в скрипты не забывайте обновлять модификаторы в админке. Иначе не увидите внесенных изменений.

  1. Для хранения единицы измерения товара можно использовать любое неиспользуемое поле в таблице oc_product, например ean. Но можно завести свое поле, например edizm
    Мы, для удобства, будем использовать поле ean
    Для штучных товаров пишем в это поле шт
    Для мерных товаров пишем м2
    Через админку это сделать не составит труда.
  2. Добавляем поле ean в контроллерах Товар, Категория, модули с товарами. И затем добавляем ean к цене в соответствующих шаблонах. Смотрим на результат.
  3. Добавим ean к товарам в админке:

    файл /system/library/cart.php

    в строке 247 добавим
    'ean' => $product_query->row['ean'],
    .......

    файл /catalog/controller/api/cart.php

    в строке 196 добавим
    'ean' => $product['ean'],
    ........

    файл /admin/model/sale/order.php

    функция getOrderProducts($order_id) должна выглядеть так

    public function getOrderProducts($order_id) {
        $query = $this->db->query("SELECT op.*, p.ean FROM " . DB_PREFIX . "order_product op JOIN " . DB_PREFIX . "product p USING(product_id) WHERE order_id = '" . (int)$order_id . "'");

        return $query->rows;
    }

    файл /admin/controller/sale/order.php

    строка 534
    'name'   => $product['name'],
    'model'  => $product['model'],
    'ean'  => $product['ean'],

    строка 996
    'name'  => $product['name'],
    'model'  => $product['model'],
    'ean'    => $product['ean'],

    строка 1703
    'name'     => $product['name'],
    'model'    => $product['model'],
    'ean'      => $product['ean'],


    Добавляем ean в шаблонах
    файл /admin/view/template/sale/order_form.tpl

    строка 246
    <td class="text-right">Ед.Изм.</td>

    строка 275
    <td class="text-right"><?php echo $order_product['ean']; ?></td>

    строка 1112
    html += '  <td class="text-right">' + product['price'] + '</td>';
    html += '  <td class="text-right">' + product['ean'] + '</td>';
    html += '  <td class="text-right">' + product['total'] + '</td>';

    строка 1211
    html += '  <td class="text-right" colspan="5">' + total['title'] + ':</td>';

    файл /admin/view/template/sale/order_info.tpl

    строка 152
    <td class="text-right"><?php echo $column_quantity; ?></td>
    <td class="text-right">Ед.Изм.</td>
    <td class="text-right"><?php echo $column_price; ?></td>

    строка 172
    <td class="text-right"><?php echo $product['quantity']; ?></td>
    <td class="text-right"><?php echo $product['ean']; ?></td>
    <td class="text-right"><?php echo $product['price']; ?></td>

    строка 189
    <td colspan="5" class="text-right"><?php echo $total['title']; ?></td>

    Обновляем модификаторы в админке.
    Теперь можно проверить редактирование заказа в админке. Открываем на изменение тестовый заказ. Переходим на вторую вкладку изменения товаров. Если сразу появляется ошибка Ajax, то в отчете видно, в какой контроллер не поступает ean. Если ошибки нет, то меняем количество товаров, добавляем товары или удаляем и сохраняем изменения. Ошибок не должно быть.

  4. Если хотим, чтобы в корзине выводились единицы измерения, то редактируем файлы:

    файл /catalog/controller/checkout/cart.php
    строка 159
    'model'     => $product['model'],
    'ean' => $product['ean'],
    'option'    => $option_data,

    файл /catalog/view/theme/default/template/checkout/cart.tpl
    строка 44
    <td class="text-left"><?php echo $column_model; ?></td>
    <td class="text-left">Ед.изм.</td>

    строка 75
    <td class="text-left"><?php echo $product['model']; ?></td>
    <td class="text-left"><?php echo $product['ean']; ?></td>

    строка 82
    <td class="text-right"><?php echo $product['price'] . '/' . $product['ean']; ?></td>
    <td class="text-right"><?php echo $product['total']; ?></td>


  5. Добавляем Единицы измерения товаров в письма покупателю и админу:

    файл /catalog/model/checkout/order.php
    строка 388
    всю строку
    $order_product_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_product WHERE order_id = '" . (int)$order_id . "'");

    меняем на это
    $order_product_query = $this->db->query("SELECT op.*,p.ean FROM " . DB_PREFIX . "order_product op JOIN " . DB_PREFIX . "product p USING(product_id) WHERE order_id = '" . (int)$order_id . "'");

    строка 567
    'name'     => $product['name'],
    'model'    => $product['model'],
    'ean'    => $product['ean'],
    .....


    файл /catalog/view/theme/default/template/mail/order.tpl
    ниже строки 76 добавляем
    <td style="font-size: 12px; border-right: 1px solid #DDDDDD; border-bottom: 1px solid #DDDDDD; background-color: #EFEFEF; font-weight: bold; text-align: right; padding: 7px; color: #222222;">Ед.Изм.</td>

    ниже строки 91 добавляем
    <td style="font-size: 12px;    border-right: 1px solid #DDDDDD; border-bottom: 1px solid #DDDDDD; text-align: right; padding: 7px;"><?php echo $product['quantity']; ?></td>

    строка 100 ниже добавляем
    <td style="font-size: 12px;    border-right: 1px solid #DDDDDD; border-bottom: 1px solid #DDDDDD; text-align: left; padding: 7px;"></td>

    в строке 111 меняем colspan="4" на colspan="5"

    Обновляем модификаторы в админке.
    Делаем тестовый заказ. Смотрим результат.