Важное предисловие
В статье мы рассмотрим пути решения проблемы с точки зрения разработки, с целью понять принцип и методы, с помощью которых мы можем добавлять новые функции в движок. Имейте ввиду, что по-хорошему вам стоит оформить все правки из статьи в виде модификатора или модуля. Или купить уже готовый модуль в маркетплейсе.
Если вы далеки от разработки и хотите сделать что-то своими руками, то действуйте на свой страх и риск.
Не забывайте про бэкап.
Как вывести краткое описание в Opencart
В качестве подопытного мы обратимся к 3-ей версии Opencart. Принципиального отличия от прошлых версий, в плане вывода кастомных полей из админки, нет. Поэтому, разобравшись с данной инструкцией и действуя по аналогии, вы без особых трудностей сможете получить схожий результат и на других сборках Opencart. Но имейте ввиду:
На других версиях Opencart шаги инструкции могут отличаться, так что действуйте осознанно.
1. Добавление нового поля в БД
Поскольку краткое описание должно сохраняться отдельно для каждого товара, необходимо добавить новое значение в таблицу базы данных. Для этого перейдем к БД магазина в phpMyAdmin и откроем таблицу oc_product_description. Далее перейдем во вкладку структура и добавим после поля «description» одно новое поле.
Этому полю зададим имя short_description, тип TEXT и сравнение utf8_general_ci. Отстальные поля не трогаем.
2. Вывод во фронтенде
2.1. Изменение шаблона Product
Добавим вывод краткого описания в шаблоне product. Напомню, что он находится по адресу: «catalog/view/theme/ВАША_ТЕМА/template/product/product.twig».
Для примера краткое описание я выведу под списком с информацией о производителе, модели и т.д. В стандартной теме это будет выглядеть таким образом:
<ul class="list-unstyled">
{% if manufacturer %}
<li>{{ text_manufacturer }} <a href="{{ manufacturers }}">{{ manufacturer }}</a></li>
{% endif %}
<li>{{ text_model }} {{ model }}</li>
{% if reward %}
<li>{{ text_reward }} {{ reward }}</li>
{% endif %}
<li>{{ text_stock }} {{ stock }}</li>
</ul>
<!-- Краткое описание Start -->
<div class="product-short-decription">{{ short_description }}</div>
<!-- Краткое описание End -->
2.2 Контроллер
Редактировать Controller и Model я рекомендую через модификатор, чтобы не затрагивать оригинальные файлы.
Добавим «упоминание» о short_description в контроллере: «catalog/controller/product/product.php».
- Перед строчкой
if (isset($this->request->get['category_id'])) {
Вставьте следующий код:
if (isset($this->request->get['short_description'])) {
$url .= '&short_description=' . $this->request->get['short_description'];
}
- После строчки
$data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');
Вставьте:
$data['short_description'] = html_entity_decode($product_info['short_description'], ENT_QUOTES, 'UTF-8');
- И, наконец, перед
'price' => $price,
Вставьте строчку:
'short_description' => utf8_substr(trim(strip_tags(html_entity_decode($result['short_description'], ENT_QUOTES, 'UTF-8'))), 0, $this->config->get('theme_' . $this->config->get('config_theme') . '_product_description_length')) . '..',
2.3 Модель
Перейдем к файлу «catalog/model/catalog/product.php» и в массиве, после элемента description добавим новый элемент short_description (по аналогии с description).
Получится так:
'description' => $query->row['description'],
'short_description'=> $query->row['short_description'],
3. Работа с административной частью
3.1 Выводим новое поле в карточке товара
Для того чтобы вывести поле с кратким описанием в редакторе товара в админке перейдем к файлу «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>
И вставим после него вывод поля для краткого описания:
<div class="form-group">
<label class="col-sm-2 control-label" for="input-short-description{{ language.language_id }}">{{ entry_short_description }}</label>
<div class="col-sm-10">
<textarea name="product_description[{{ language.language_id }}][short_description]" placeholder="{{ entry_short_description }}" id="input-short-description{{ language.language_id }}" data-toggle="summernote" data-lang="{{ summernote }}" class="form-control">{{ product_description[language.language_id] ? product_description[language.language_id].short_description }}</textarea>
</div>
</div>
3.2 Модель
В файле «admin/model/catalog/product.php» найдем конструкцию
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']) . "', 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']) . "'");
}
и добавим в нее, по аналогии с description, short_description. Должно получиться так:
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']) . "', short_description = '" . $this->db->escape($value['short_description']) . "', 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']) . "'");
}
ОБРАТИТЕ ВНИМАНИЕ, что ниже в этом же файле есть еще одна такая конструкция. Ее нужно изменить точно также, как и прошлую.
После этого нужно добавить short_description еще и сюда:
foreach ($query->rows as $result) {
$product_description_data[$result['language_id']] = array(
'name' => $result['name'],
'description' => $result['description'],
'short_description'=> $result['short_description'],
'meta_title' => $result['meta_title'],
'meta_description' => $result['meta_description'],
'meta_keyword' => $result['meta_keyword'],
'tag' => $result['tag']
);
}
3.3 Языковой файл
В заключение добавим переменную short_description в языковой файл «admin/language/ru-ru/catalog/product.php»
$_['entry_description'] = 'Описание';
$_['entry_short_description']= 'Краткое описание';
Готово.
Теперь в редакторе товара ниже поля с основным описанием появилось поле для ввода краткой информации о товаре.
И вот как оно отображается в карточке товара на сайте:
Надеюсь, что данное руководство было вам полезно. Удачи!
UPD. Появилась новая статья, в которой я рассказываю о том, как вывести краткое описание на странице категорий: cсылка на статью.