Для создания дополнительного поля в карточке товара в CMS OpenCart 3.x нужно добавить запись в БД, добавить код в админ-панель (back-end) и на фронтальную часть сайта (front-end).
Создадим поле description2 в БД (с настройками как и поле description)

Далее, откроем файл /admin/view/template/catalog/product_form.twig
после блока
<div class="form-group">
<label class="col-sm-2 control-label" for="input-description{{ language.language_id }}">{{ entry_description }}</label>
<div class="col-sm-10">
<textarea name="product_description[{{ language.language_id }}][description]" placeholder="{{ entry_description }}" id="input-description{{ language.language_id }}" data-toggle="summernote" data-lang="{{ summernote }}" class="form-control">{{ product_description[language.language_id] ? product_description[language.language_id].description }}</textarea>
</div>
</div>
добавим блок
<hr>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-description{{ language.language_id }}">Описание товара в карточке 2</label>
<div class="col-sm-10">
<textarea name="product_description[{{ language.language_id }}][description2]" placeholder="{{ entry_description }}" id="input-description2{{ language.language_id }}" data-toggle="summernote" data-lang="{{ summernote }}" class="form-control">{{ product_description2[language.language_id] ? product_description[language.language_id].description2 }}</textarea>
</div>
</div>
Файл /admin/controller/catalog/product.php
После блока
if (isset($this->request->post['product_description'])) {
$data['product_description'] = $this->request->post['product_description'];
} elseif (isset($this->request->get['product_id'])) {
$data['product_description'] = $this->model_catalog_product->getProductDescriptions($this->request->get['product_id']);
} else {
$data['product_description'] = array();
}
добавим блок
// descr 2
if (isset($this->request->post['product_description2'])) {
$data['product_description2'] = $this->request->post['product_description2'];
} elseif (isset($this->request->get['product_id'])) {
$data['product_description2'] = $this->model_catalog_product->getProductDescriptions($this->request->get['product_id']);
} else {
$data['product_description2'] = array();
}
Файл /admin/model/catalog/product.php
Запрос к БД в районе 12-13 строки должен выглядеть так (дописали сохранение поля description2):
foreach ($data['product_description'] as $language_id => $value) {
$this->db->query("INSERT INTO " . DB_PREFIX . "product_description SET product_id = '" . (int)$product_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($value['name']) . "', description = '" . $this->db->escape($value['description']) . "', description2 = '" . $this->db->escape($value['description2']) . "', tag = '" . $this->db->escape($value['tag']) . "', meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "'");
}
В районе 147 строки запрос должен выглядеть так (дописали функционал для поля description2):
foreach ($data['product_description'] as $language_id => $value) {
$this->db->query("INSERT INTO " . DB_PREFIX . "product_description SET product_id = '" . (int)$product_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($value['name']) . "', description = '" . $this->db->escape($value['description']) . "', description2 = '" . $this->db->escape($value['description2']) . "', tag = '" . $this->db->escape($value['tag']) . "', meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "'");
}
Далее, в методе getProductDescriptions (433 строка) — дописали строку:
‘description2’ => $result[‘description2’],
Должно выглядеть вот так:
foreach ($query->rows as $result) {
$product_description_data[$result['language_id']] = array(
'name' => $result['name'],
'description' => $result['description'],
'description2' => $result['description2'],
'meta_title' => $result['meta_title'],
'meta_description' => $result['meta_description'],
'meta_keyword' => $result['meta_keyword'],
'tag' => $result['tag']
);
}
После этих действий в админ-панели в карточке товара появится новое поле, оно уже сохраняет данные:

Далее выведем описание в карточку товара на сайте.
Откроем файл /catalog/model/catalog/product.php
В районе 14 строки после строки
‘description’ => $query->row[‘description’],
Вставим строку
‘description2’ => $query->row[‘description2’],
Файл /catalog/controller/product/product.php
После строки
$data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');
Вставим строку
$data['description2'] = html_entity_decode($product_info['description2'], ENT_QUOTES, 'UTF-8');
После строки
‘price’ => $price,
Вставим строку
‘description2’ => html_entity_decode($result[‘description2’]),
В файле /catalog/view/theme/[название_темы]/template/product/product.twig
В нужном месте делаем вывод описания на сайте в карточке товара, вставим строку
{{ description2 }}
















Сделал по инструкции, в админке появилось поле, в шаблоне не вылазит. Шаблон дефолтный, может проверите, вдруг чего-то не хватает?
скорее всего не обновили модификаторы
Спасибо ты настоящий друг! ++++++++
Спасибо большое! Очень подробно, всё получилось. Opencart 3.0.3.7
Cool + for the post
very good