В данной статье рассмотрим как добавить новые вкладки в карточке товара с редактированием их из админки. Приступим, добавим поле в админку, затем на сам сайт.
Для начала добавим новое поле а БД, откроем Базу Данных в 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,
Обновляем модификаторы. В итоге в админке у нас новое поле во вкладке ОСНОВНОЕ
И на сайте появляется новая вкладка:
Полезная статья, только вот по данной инструкции выдает ошибки
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
Ошибку Uncaught exception ‘Twig_Error_Syntax’ with message ‘Unexpected token «name» of value «sostav» …. УСТРАНИЛ.
Теперь вот какая беда — в админке выводит два текстовых поля, как и предполагается. Если ввести текст в поле «Состав» то после сохранения этот тескт выводится в поле «Описание», но а поле «Состав» — пусто
Вкладки «Состав» в карточке товара нет
Внимательно все перепроверьте, наверное не везде поменяли название старого поля на новое
Подтверждаю..
Перепроверил всё три раза.. Сделал даже с вашим именем Состав..
Сыпет ошибками. Пробовал и на дефолтном шаблоне..
Здравствуйте, пришлите текст ошибок здесь — мы еще раз перепроверим инструкцию специально для вас
Добрый!
Зашел phpMyAdmin и открыл вкладку Запрос по шаблону и вставил строку в окно SQL-запрос к базе данных. Это правильно? (по ссылке скрин). Подскажите пожалуйста!
https://disk.yandex.ru/i/fpfRueyaBEZhFA
Добрый день, лучше делайте запрос как на скрине (вставили новый скрин под кодом запроса в статье). Туда вставляете и нажимаете «Вперед». После запроса можете зайти в таблицу oc_product_description и проверить появилось ли новое поле. Если поле есть — значит все сделали правильно.
Благодарю!
Спасибо! Все получилось! Единственная проблема — в админке два поля ОПИСАНИЕ, понятно, что нижняя часть это Состав, но где поменять, не нашел.
Вот здесь скорее всего (href=»#tab-newtabcontent» data-toggle=»tab» rel=»nofollow ugc») Состав
Зделал как показано. В админке при входе в редактирования товара — ошибка 500. Как поправить.
Версия опенкарта Version 3.0.3.7 (rs.1)
Возможно вы просто копировали с сайта код, не проверяли, проверьте что бы все кавычки были верными и т.д. На сайте был изменен вывод кода, попробуйте заново проделать по инструкции, должно работать
Классный материал!
После устранения всех ошибок, осталось только 500 в карточке товара, думала, вот оно, счастье, совсем близко, но после очередных изменений и обновления модификатора, перестала быть доступна админка в полном объёме, могу только посмотреть на пустую панель состояния. Вернула все файлы, как были — эффекта 0.
Прям от души не спасибо, 4 часа в помойку
Вы этот код тестировали в OC 3.x ? Если нет, то он не будет работать в других версиях OpenCart. Если у вас OC 3.x — проделайте все внимательно и все будет работать