Как добавить свое поле в товар 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 — доработка checkout
- WMS и маркировка — автоматизация склада
Добавление кастомных полей в товар — типичная задача для OpenCart. Если нужна помощь — доработка OpenCart это наш профиль.
Из практики. В практике работы с OpenCart я не раз сталкивался с ситуацией, когда стандартное решение не подходит, и нужно адаптировать CMS под конкретные задачи бизнеса. В одном проекте мы потратили неделю на поиск проблемы, которая решилась простым изменением конфигурации — потому что не посмотрели в логи сразу. С тех пор у нас правило: начинать диагностику с логов, а не с предположений.
Как не надо. Не копируйте готовые решения из интернета без проверки совместимости с вашей версией OpenCart и установленными модулями. То, что сработало у другого владельца магазина, может сломать ваш сайт — особенно если у вас нестандартная сборка. Всегда делайте бэкап перед любыми изменениями.
Комментарии (0)
Пока нет комментариев. Будьте первым!
Оставить комментарий