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

Как добавить свое поле в товар OpenCart

Добавить кастомное поле в товар OpenCart — типичная задача: «Страна производства», «Срок годности», «Видеообзор», «Материал». Стандартный OpenCart не даёт такой возможности из коробки, но создать дополнительное поле можно за 4 шага — через БД, модель, форму админки и шаблон витрины.

В этой статье — — пошаговая инструкция для OpenCart 3.x с примерами кода, многоязычные поля и типовые ошибки.

Пошаговая инструкция

Шаг 1. Добавьте колонку в таблицу товара

ALTER TABLE oc_product ADD COLUMN custom_field VARCHAR(255) AFTER meta_description;

Для многоязычных полей создайте отдельную таблицу:

CREATE TABLE oc_product_custom_field (
    product_id INT(11) NOT NULL,
    language_id INT(11) NOT NULL,
    custom_field TEXT NOT NULL,
    PRIMARY KEY (product_id, language_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Шаг 2. Обновите модель товара в админке

Откройте admin/model/catalog/product.php и найдите методы addProduct и editProduct.

В addProduct добавьте:

$this->db->query("INSERT INTO " . DB_PREFIX . "product SET 
    ...,
    custom_field = '" . $this->db->escape($data['custom_field']) . "'");

В editProduct добавьте:

$this->db->query("UPDATE " . DB_PREFIX . "product SET 
    custom_field = '" . $this->db->escape($data['custom_field']) . "'
    WHERE product_id = " . (int)$product_id);

Шаг 3. Добавьте поле в форму админки

Откройте admin/view/template/catalog/product_form.twig и добавьте HTML-элемент:

<div class="form-group">
  <label class="control-label" for="input-custom-field">Страна производства</label>
  <input type="text" name="custom_field" value="{{ custom_field }}" id="input-custom-field" class="form-control" />
</div>

Не забудьте передать значение в контроллер:

// В controller/catalog/product.php, в методе index
$data['custom_field'] = $this->model_catalog_product->getProduct($product_id)['custom_field'];

Шаг 4. Отобразите на витрине

Откройте catalog/view/theme/default/template/product/product.twig и добавьте вывод:

{% if product.custom_field %}
<div class="product-custom-field">
  <span>Страна производства:</span> {{ product.custom_field }}
</div>
{% endif %}

Многоязычные поля

Если поле должно быть разным для разных языков — используйте отдельную таблицу с привязкой к language_id:

// В модели — получение для текущего языка
$query = $this->db->query("SELECT custom_field FROM " . DB_PREFIX . "product_custom_field 
    WHERE product_id = " . (int)$product_id . " 
    AND language_id = " . (int)$this->config->get('config_language_id'));

// В контроллере — передача в шаблон
$data['custom_field'] = $query->row['custom_field'];

Типичные ошибки

ОшибкаПричинаРешение
Поле не сохраняетсяНе добавлено в INSERT/UPDATE запросПроверьте методы addProduct/editProduct
Ошибка БДНеверный префикс таблицыИспользуйте DB_PREFIX
Поле не отображается на витринеНе передано в контроллере product.phpДобавьте получение из БД в контроллер
Данные теряются при обновленииПравки файлов ядра без OCMODИспользуйте OCMOD
Поле не работает для фильтровКастомные поля не индексируются автоматическиДобавьте индекс или используйте стандартные атрибуты

Альтернатива: стандартные атрибуты

Прежде чем создавать кастомное поле — проверьте, нет ли нужного атрибута в стандартной системе атрибутов OpenCart. Стандартные атрибуты:

  • работают с фильтрами и сравнением;
  • поддерживают многоязычность из коробки;
  • отображаются в админке без доработок.

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

Рекомендации из практики

Как лучше: Создайте новое поле через модуль Extra Fields или OCMOD — это безопасно и не сломается при обновлении OpenCart.

Как не делать: Не добавляйте поля напрямую в файлы шаблона. При обновлении темы изменения сотрутся.

Кейс из практики: Добавили поле «Артикул поставщика» через OCMOD-модификатор. Настройка заняла 30 минут, поле отображается в карточке товара и в админке.

По практике, OCMOD — правильный способ добавления полей без риска при обновлении. Закажите доработку OpenCart

Чек-лист проверки

  • Колонка добавлена в БД
  • Модель обновлена (addProduct + editProduct)
  • Форма админки отображает поле
  • Значение сохраняется при сохранении товара
  • Поле отображается на витрине
  • Многоязычность работает (если нужно)
  • Данные не теряются при обновлении OpenCart

Частые вопросы

Кастомное поле или стандартный атрибут — что выбрать?

Стандартный атрибут — если нужен простой текстовый/числовой/выборочный параметр. Кастомное поле — если нужна специфическая логика отображения, интеграция с API или нестандартный формат данных.

Как создать дополнительное поле с выпадающим списком?

Используйте <select> вместо <input>. В модели сохраняйте значение как строку. В шаблоне — проверяйте соответствие допустимым значениям.

Как защитить поле от SQL-инъекций?

Всегда используйте $this->db->escape() для строковых значений и (int) для числовых.

Связанные темы

Добавление кастомных полей в товар — типичная задача для OpenCart. Если нужна помощь — доработка OpenCart это наш профиль.

Из практики. В практике работы с OpenCart я не раз сталкивался с ситуацией, когда стандартное решение не подходит, и нужно адаптировать CMS под конкретные задачи бизнеса. В одном проекте мы потратили неделю на поиск проблемы, которая решилась простым изменением конфигурации — потому что не посмотрели в логи сразу. С тех пор у нас правило: начинать диагностику с логов, а не с предположений.

Как не надо. Не копируйте готовые решения из интернета без проверки совместимости с вашей версией OpenCart и установленными модулями. То, что сработало у другого владельца магазина, может сломать ваш сайт — особенно если у вас нестандартная сборка. Всегда делайте бэкап перед любыми изменениями.

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

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

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

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

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