Создание дополнительного описания для товара в Opencart

Важное предисловие

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

Если вы далеки от разработки и хотите сделать что-то своими руками, то действуйте на свой страх и риск.

Не забывайте про бэкап.

Как вывести краткое описание в 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сылка на статью.