Услуги Создание магазина Доработка Интеграция 1С О компании FAQ Блог Кейсы Отзывы Контакты
А
Автор статьи

Как добавить свое поле в заказ 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 это наш профиль.

Из практики. Клиент жалуется, что заказы перестали приходить на почту — при этом оплаты проходят, деньги списываются. В одном проекте оказалось, что SMTP-сервер хостинга добавил домен в чёрный список из-за массовой рассылки с соседнего аккаунта на shared-хостинге. Мы перенастроили отправку писем через внешний SMTP (SendGrid) — письма с заказами стали доставляться, а заодно появилась статистика доставки.

Как не надо. Не полагайтесь на стандартную функцию mail() в PHP — большинство хостингов блокируют её или отправляют письма в спам. Настройте SMTP через почтовый сервис (SendGrid, Mailgun, Яндекс.Почта для домена). И обязательно проверьте SPF- и DKIM-записи для вашего домена — без них письма будут улетать в спам.

← Предыдущая Как добавить свое поле в товар OpenCart Следующая → Как добавить новый способ доставки в OpenCart

Комментарии (0)

Пока нет комментариев. Будьте первым!

Оставить комментарий

Ваш комментарий появится после проверки модератором.