Как добавить в OpenCart 3.x новую вкладку в карточке товара

14
4481

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

 

Для начала добавим новое поле а БД, откроем Базу Данных в phpmyadmin и сделаем запрос

ALTER TABLE `oc_product_description` ADD `sostav` MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `description`;

 

В итоге добавится новое поле sostav, где и будет храниться текст вкладки. Далее редактируем файлы сайта.

 

Админка, файл \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-sostav{{ language.language_id }}">Состав</label>
<div class="col-sm-10">
  <textarea name="product_description[{{ language.language_id }}][sostav]" placeholder="Введите состав" id="input-sostav{{ language.language_id }}" data-toggle="summernote" data-lang="{{ summernote }}" class="form-control">{{ product_description[{{ language.language_id }}] ? product_description[{{ language.language_id }}].sostav }}</textarea>
  </div>
</div>

(назовем вкладку СОСТАВ)

 

файл \admin\controller\catalog\product.php

 

перед

if (isset($this->request->post['model'])) {

вставляем

if (isset($this->request->post['sostav'])) {
	$data['sostav'] = $this->request->post['sostav'];
} elseif (isset($this->request->get['product_id'])) {
	$data['sostav'] = $this->model_catalog_product->getProductDescriptions($this->request->get['product_id']);
} else {
	$data['sostav'] = array();
}

файл \admin\model\catalog\product.php

 

в запросе, в районе 12 строки

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']) . "'");
}

добавляем

sostav = '" . $this->db->escape($value['sostav']) . "',

получится такой запрос:

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']) . "', sostav = '" . $this->db->escape($value['sostav']) . "', 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']) . "'");
}

далее ниже, в районе 146 строки, в запросе

foreach ($data['product_description'] as $language_id => $value) {

добавляем аналогичную как выше запись, получаем:

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']) . "', sostav = '" . $this->db->escape($value['sostav']) . "', 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']) . "'");
}

и ниже в районе 435 строки, после

'description'      => $result['description'],

вставляем

'sostav'         =>    $result['sostav'],

 

Теперь выведем вкладку на сайте,

 

файл \catalog\view\theme\*\template\product\product.twig

 

после

<li class="active"><a href="#tab-description" data-toggle="tab">{{ tab_description }}</a></li>

вставляем

{% if sostav is defined and sostav %}
	<li><a href="#tab-newtabcontent" data-toggle="tab">Состав</a></li>
{% endif %}

и ниже, после

<div class="tab-pane active" id="tab-description">{{ description }}</div>

вставляем

{% if sostav is defined and sostav %}
	<div class="tab-pane" id="tab-newtabcontent">{{ sostav }}</div>
{% endif %}

Далее, файл \catalog\controller\product\product.php

 

после

$data['points'] = $product_info['points'];

вставляем

$data['sostav'] = html_entity_decode($product_info['sostav'], ENT_QUOTES, 'UTF-8');

Файл \catalog\model\catalog\product.php

 

после

if ($query->num_rows) {

вставляем

$newtabcontent_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_description WHERE product_id = '" . (int)$product_id . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
if($newtabcontent_query->num_rows)  {
	$sostav = $newtabcontent_query->row['sostav'];
} else {
	$sostav = "";
}

и ниже после

'product_id'       => $query->row['product_id'],

вставляем

'sostav'       => $sostav,

 

Обновляем модификаторы. В итоге в админке у нас новое поле во вкладке ОСНОВНОЕ

 

 

И на сайте появляется новая вкладка:

 

14 КОММЕНТАРИИ

  1. Полезная статья, только вот по данной инструкции выдает ошибки

    Uncaught exception ‘Twig_Error_Syntax’ with message ‘Unexpected token «name» of value «sostav» («end of statement block» expected) in «Toolsjet/template/product/product.twig» at line 276.’
    in …/system/library/template/Twig/TokenStream.php:87 Stack trace: #0 …/system/library/template/Twig/TokenParser/If.php(33): Twig_TokenStream->expect(3) #1 …/system/library/template/Twig/Parser.php(187): Twig_TokenParser_If->parse(Object(Twig_Token)) #2 …/system/library/template/Twig/Parser.php(100): Twig_Parser->subparse(NULL, false) #3 …/system/library/template/Twig/Environment.php(619): Twig_Parser->parse(Object(Twig_TokenStream)) #4 …/shop/system/library/template/Twig/Environment.php(671): Twig_Environment->parse(Object(Twig_TokenStream)) #5 …/system/library/template/Twig/Envi in …/system/library/template/Twig/TokenStream.php on line 87

  2. Ошибку Uncaught exception ‘Twig_Error_Syntax’ with message ‘Unexpected token «name» of value «sostav» …. УСТРАНИЛ.
    Теперь вот какая беда — в админке выводит два текстовых поля, как и предполагается. Если ввести текст в поле «Состав» то после сохранения этот тескт выводится в поле «Описание», но а поле «Состав» — пусто
    Вкладки «Состав» в карточке товара нет

    • Внимательно все перепроверьте, наверное не везде поменяли название старого поля на новое

  3. Подтверждаю..
    Перепроверил всё три раза.. Сделал даже с вашим именем Состав..
    Сыпет ошибками. Пробовал и на дефолтном шаблоне..

    • Здравствуйте, пришлите текст ошибок здесь — мы еще раз перепроверим инструкцию специально для вас

    • Добрый день, лучше делайте запрос как на скрине (вставили новый скрин под кодом запроса в статье). Туда вставляете и нажимаете «Вперед». После запроса можете зайти в таблицу oc_product_description и проверить появилось ли новое поле. Если поле есть — значит все сделали правильно.

  4. Спасибо! Все получилось! Единственная проблема — в админке два поля ОПИСАНИЕ, понятно, что нижняя часть это Состав, но где поменять, не нашел.

  5. Зделал как показано. В админке при входе в редактирования товара — ошибка 500. Как поправить.
    Версия опенкарта Version 3.0.3.7 (rs.1)

    • Возможно вы просто копировали с сайта код, не проверяли, проверьте что бы все кавычки были верными и т.д. На сайте был изменен вывод кода, попробуйте заново проделать по инструкции, должно работать

  6. Классный материал!
    После устранения всех ошибок, осталось только 500 в карточке товара, думала, вот оно, счастье, совсем близко, но после очередных изменений и обновления модификатора, перестала быть доступна админка в полном объёме, могу только посмотреть на пустую панель состояния. Вернула все файлы, как были — эффекта 0.
    Прям от души не спасибо, 4 часа в помойку

    • Вы этот код тестировали в OC 3.x ? Если нет, то он не будет работать в других версиях OpenCart. Если у вас OC 3.x — проделайте все внимательно и все будет работать

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here