ВТОРАЯ СЕРИЯ
Вывод содержимого таблицы на экран.
Часть 1.
Вывод в админке.
В той самой форме, где происходит запись, надо вывести текущее значение для случая редактирования существующего продукта.
Запрос текущего значения делается в том же самом файле, что и добавление. admin/model/catalog/product.php
Функция getProductDescriptions
Внути этой функции есть цикл foreach (он там один)
Внутри цикла формируется массив $product_description_data
Этот процесс отформатирован для наглядности, так что проблем быть не должно.
Надо вставить строчку кода:
'addi_string_admin'=> $result['addi_string_db'],
где addi_string_admin - это ключ в этом массиве, а его значение будет соответствовать содержимому столбца addi_string_db.
Итак, в модели формируется массив $product_description_data.
Он содержит в себе всю таблицу product_description для продукта с заданным $product_id.
Затем в файле контроллера admin/controller/catalog/product.php этот массив присваевается ключу product_description массива $data
if (isset($this->request->post['product_description'])) {
$data['product_description'] = $this->request->post['product_description'];
} elseif (isset($this->request->get['product_id'])) {
$data['product_description'] = $this->model_catalog_product->getProductDescriptions($this->request->get['product_id']);
} else {
$data['product_description'] = array();
}
вот этот elseif посередине, это как раз оно.
Впрочем, менять ничего не надо и без всякого нашего участия значение ассоциативного массива $data, соответствующее ключу product_description будет доступно в файле product_form.tpl в виде переменной $product_description.
Но сама переменная $product_description, это в свою очередь тоже массив, причём не просто массив, а массив из массивов.
Поэтому для вывода на экран значения нашего дополнительного поля используется нотация с квадратными скобками:
$product_description[$language['language_id']]['addi_string_admin']
где $language - это массив языков, доступ к каждому языку получаем указывая его language_id и каждый этот элемент каждого языка, он тоже в свою очередь массив.
Ну, а addi_string_admin, это как раз один из элементов этого массива, наряду с 'name', 'meta_title', 'meta_keyword' и другими.
Этот массив был изначально сформирован в функции getProductDescriptions файла admin/model/catalog/product.php и там он назывался $product_description_data
В админке всё.
При редактировании товара, имеющего установленное значение addi_string_db это значение должно отражаться.
Часть 2.
Вывод в карточке товара фронта.
Получаем значение из базы данных в файле catalog/model/catalog/product.php
Функция getProduct($product_id)
Нас интересует процесс формирования возвращаемого массива return array(
и потом там с новой строчки идут пары ключ=>значение.
Добавляем свою пару
'addi_string_info' => $query->row['addi_string_db'],
В модели всё
...
Идём в контроллер catalog/controller/product/product.php
Здесь формируется массив $data
Надо добавить в него дополнительную пару ключ=>значение.
Мне предсавляется, что уместней и логичней сделать это рядом с формированием значения для description
Это формирование description выглядит вот так:
$data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');
Я так понимаю, что такой вид обусловлен необходимостью выводить на экран html теги.
Делаем по аналогии и где-то рядом добавляем строчку:
$data['addi_string_product'] = html_entity_decode($product_info['addi_string_info'], ENT_QUOTES, 'UTF-8');
Таким образом, добавили к ассоциативному массиву $data новую пару ключ=>значение.
Ключём будет addi_string_product,
а его значением будет то, что записано в массиве $product_info под ключём addi_string_info
Но перед записью эти данные будут обработаны функцией html_entity_decode() - браузеру попадает не совсем то, что записано в базе.
В контроллере всё.
...
Собственно говоря, на этом этапе данные уже доступны на странице продукта в виде автоматически созданной переменной $addi_string_product
Её можно выводить где душе угодно.
Например, можно сделать какой-нибудь шот-дескрипшн справа.
Учитывая, что полученная переменная поддерживает html разметку и визуальный редактор кода, выведем её в дополнительном табе.
Файл называется catalog/view/theme/default/template/product/product.php
Понадобиться две вставки кода
1) Названия табов организованы при помощи списка <ul class="nav nav-tabs">, вот его и надо найти.
Перед его закрывающим тегом </ul> добавить:
<!-- $addi_string_product start -->
<?php if ($addi_string_product) { ?>
<li><a href="#tab-addi-string" data-toggle="tab">***</a></li>
<?php } ?>
<!-- $addi_string_product end -->
здесь if ($addi_string_product) - проверка на существование переменной
*** - заглушка для языкового файла. Это название таба. Его можно прописать прямо здесь, но тогда оно будет одно и тоже для всех языков.
Если переменная $addi_string_product существует, то внутри списка <ul class="nav nav-tabs">, добавляется новый пункт <li><a href="#tab-addi-string" data-toggle="tab">***</a></li>, содержащий в себе ссылку на элемент с id=tab-addi-string
2) Далее, сразу за закрывающим тегом </ul> находим <div class="tab-content">
внутри этого дива имеется ещё три
<div class="tab-pane active" id="tab-description"> - описание <div class="tab-pane" id="tab-specification"> - атрибуты <div class="tab-pane" id="tab-review"> - отзывы
надо вствить код
<!-- $addi_string_product start -->
<?php if ($addi_string_product) { ?>
<div class="tab-pane" id="tab-addi-string">
<?php echo $addi_string_product; ?>
</div>
<?php } ?>
<!-- $addi_string_product end -->
Это и будет тот самый элемент с id=tab-addi-string, на который ведёт ссылка <a href="#tab-addi-string" data-toggle="tab">***</a>
Проще всего вставить его сразу за описанием, т.е. сразу после этого:
<div class="tab-pane active" id="tab-description">
<?php echo $description; ?>
</div>
Очерёдность расположения здесь не имеет значения.
Вот и всё.
КОНЕЦ
П.С. У меня где-то была ссылка на модуль, создающий дополнительные табы.
Похоже, что она мне больше не нужна.
П.П.С. Ах, да!
Версия 2.1.0.2
нативный opencart.