В данной статье рассмотрим как добавить новые вкладки в карточке товара с редактированием их из админки. Приступим, добавим поле в админку, затем на сам сайт.
Для начала добавим новое поле а БД, откроем Базу Данных в phpmyadmin и сделаем запрос
1 |
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
после
1 2 3 4 5 6 |
<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> |
вставляем
1 2 3 4 5 6 |
<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
перед
1 |
if (isset($this->request->post['model'])) { |
вставляем
1 2 3 4 5 6 7 |
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 строки
1 2 3 |
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']) . "'"); } |
добавляем
1 |
sostav = '" . $this->db->escape($value['sostav']) . "', |
получится такой запрос:
1 2 3 |
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 строки, в запросе
1 |
foreach ($data['product_description'] as $language_id => $value) { |
добавляем аналогичную как выше запись, получаем:
1 2 3 |
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 строки, после
1 |
'description' => $result['description'], |
вставляем
1 |
'sostav' => $result['sostav'], |
Теперь выведем вкладку на сайте,
файл \catalog\view\theme\*\template\product\product.twig
после
1 |
<li class="active"><a href="#tab-description" data-toggle="tab">{{ tab_description }}</a></li> |
вставляем
1 2 3 |
{% if sostav is defined and sostav %} <li><a href="#tab-newtabcontent" data-toggle="tab">Состав</a></li> {% endif %} |
и ниже, после
1 |
<div class="tab-pane active" id="tab-description">{{ description }}</div> |
вставляем
1 2 3 |
{% if sostav is defined and sostav %} <div class="tab-pane" id="tab-newtabcontent">{{ sostav }}</div> {% endif %} |
Далее, файл \catalog\controller\product\product.php
после
1 |
$data['points'] = $product_info['points']; |
вставляем
1 |
$data['sostav'] = html_entity_decode($product_info['sostav'], ENT_QUOTES, 'UTF-8'); |
Файл \catalog\model\catalog\product.php
после
1 |
if ($query->num_rows) { |
вставляем
1 2 3 4 5 6 |
$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 = ""; } |
и ниже после
1 |
'product_id' => $query->row['product_id'], |
вставляем
1 |
'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» …. УСТРАНИЛ.
Теперь вот какая беда — в админке выводит два текстовых поля, как и предполагается. Если ввести текст в поле «Состав» то после сохранения этот тескт выводится в поле «Описание», но а поле «Состав» — пусто
Вкладки «Состав» в карточке товара нет
Внимательно все перепроверьте, наверное не везде поменяли название старого поля на новое