Как добавить свое поле в заказ OpenCart
Добавить — своё поле в заказ OpenCart — типичная задача: «желаемая дата доставки», «промокод друга», «этаж для курьера», «комментарий к подарку». Стандартный OpenCart не даёт такой возможности из коробки, но добавить поле можно за 4 шага — через БД, шаблон, модель и админку.
В этой статье — пошаговая инструкция с примерами кода для OpenCart 3.x, типовые ошибки и как их избежать.
Пошаговая инструкция
Шаг 1. Добавьте поле в базу данных
Создайте новую колонку в таблице заказов:
ALTER TABLE oc_order ADD COLUMN custom_field VARCHAR(255) AFTER comment;
Для больших текстовых полей используйте TEXT вместо VARCHAR(255):
ALTER TABLE oc_order ADD COLUMN delivery_notes TEXT AFTER comment;
Важно: используйте префикс таблицы (oc_ или ваш). Проверьте текущий префикс в config.php.
Шаг 2. Добавьте поле в шаблон checkout
Откройте файл шаблона оформления заказа. Путь зависит от темы:
| Тема | Путь к шаблону |
|---|---|
| Стандартная тема | catalog/view/theme/default/template/checkout/checkout.twig |
| Кастомная тема | catalog/view/theme/yourtheme/template/checkout/checkout.twig |
| OnePage Checkout | Зависит от модуля — проверьте документацию |
Добавьте HTML-элемент перед кнопкой «Оформить заказ»:
<div class="form-group">
<label class="control-label" for="input-custom-field">Желаемая дата доставки</label>
<input type="date" name="custom_field" id="input-custom-field" class="form-control" />
</div>
Шаг 3. Сохраните значение в модели заказа
Откройте файл catalog/model/checkout/order.php и найдите метод addOrder. Добавьте сохранение нового поля:
// В методе addOrder, после формирования массива $data
$data['custom_field'] = $this->db->escape($this->request->post['custom_field']);
// В запросе INSERT добавьте новую колонку
$this->db->query("INSERT INTO " . DB_PREFIX . "order SET
...,
custom_field = '" . $data['custom_field'] . "',
...");
Не забудьте: экранировать значение через $this->db->escape() для защиты от SQL-инъекций.
Шаг 4. Отобразите поле в админке
Откройте файл admin/view/template/sale/order_info.twig и добавьте вывод значения поля в информацию о заказе:
<tr>
<td>Желаемая дата доставки</td>
<td>{{ order.custom_field }}</td>
</tr>
Альтернатива: кастомные поля через OCMOD
Если не хотите править файлы ядра — используйте OCMOD-модификацию. Это безопаснее: при обновлении OpenCart ваши изменения сохранятся.
Создайте XML-файл модификации:
<modification>
<code>custom_order_field</code>
<name>Custom Order Field</name>
<version>1.0</version>
<author>Your Name</author>
<file path="catalog/model/checkout/order.php">
<operation>
<search><![CDATA[// After last query]]></search>
<add><![CDATA[
// Add custom field
$data['custom_field'] = $this->db->escape($this->request->post['custom_field']);
]]></add>
</operation>
</file>
</modification>
Типичные ошибки
| Ошибка | Причина | Решение |
|---|---|---|
| Поле не сохраняется | Не добавлено в INSERT-запрос или не экранировано | Проверьте модель order.php, добавьте escape() |
| Ошибка БД при установке | Неверный префикс таблицы | Используйте DB_PREFIX, а не хардкодьте oc_ |
| Поле не отображается в админке | Не добавлено в шаблон order_info.twig | Добавьте вывод в шаблон админки |
| Поле ломает оформление заказа | Конфликт с JavaScript темы | Проверьте консоль браузера на ошибки |
| Данные теряются при обновлении OpenCart | Правки файлов ядра без OCMOD | Используйте OCMOD или модуль-обёртку |
Рекомендации из практики
Как лучше: Используйте событие (event) OpenCart для добавления поля в заказ — это архитектурно правильно и не требует правки ядра.
Как не делать: Не редактируйте файлы ядра OpenCart для добавления полей. Каждое обновление будет их затирать.
Кейс из практики: Добавили поле «Желаемая дата доставки» в заказ через событие checkout. Поле отображается в админке и в письме клиенту. При обновлении OpenCart до 3.0.3.8 поле сохранилось.
По практике, события OpenCart — правильный путь для расширения функционала. Закажите доработку OpenCart
Чек-лист проверки
- Колонка добавлена в БД (проверьте через phpMyAdmin)
- Поле добавлено в шаблон checkout
- Значение сохраняется в модели order.php
- Экранирование через escape() работает
- Поле отображается в админке (карточка заказа)
- Оформление заказа не ломается
- Данные сохраняются при повторном открытии заказа
Частые вопросы
Можно ли добавить поле без правки файлов ядра?
Да, через OCMOD-модификацию или готовый модуль. OCMOD позволяет менять логику без прямой правки файлов — изменения применяются поверх ядра при генерации страницы.
Как добавить несколько полей одновременно?
Повторите шаги 1–4 для каждого поля. В БД — несколько ALTER TABLE. В шаблоне — несколько HTML-элементов. В модели — несколько полей в INSERT. В админке — несколько строк вывода.
Как защитить поле от SQL-инъекций?
Всегда используйте $this->db->escape() для строковых значений и (int) для числовых. Не подставляйте пользовательский ввод в SQL без экранирования.
Связанные темы
- Как создать дополнительное поле в товар OpenCart — похожая задача для карточки товара
- Как добавить новый способ оплаты в OpenCart — доработка checkout
- WMS и маркировка — автоматизация склада
Добавление кастомных полей — типичная задача для OpenCart. Если нужна помощь с доработкой — доработка OpenCart это наш профиль.
Из практики. Клиент жалуется, что заказы перестали приходить на почту — при этом оплаты проходят, деньги списываются. В одном проекте оказалось, что SMTP-сервер хостинга добавил домен в чёрный список из-за массовой рассылки с соседнего аккаунта на shared-хостинге. Мы перенастроили отправку писем через внешний SMTP (SendGrid) — письма с заказами стали доставляться, а заодно появилась статистика доставки.
Как не надо. Не полагайтесь на стандартную функцию mail() в PHP — большинство хостингов блокируют её или отправляют письма в спам. Настройте SMTP через почтовый сервис (SendGrid, Mailgun, Яндекс.Почта для домена). И обязательно проверьте SPF- и DKIM-записи для вашего домена — без них письма будут улетать в спам.
Комментарии (0)
Пока нет комментариев. Будьте первым!
Оставить комментарий