@AndreyIvanov, Вы ещё с нами? Отчитываюсь о проделанной работе.
Удалось получить дополнительное поле для продукта, заполняемое из админки, с поддержкой мультиязычности и html разметки.
Выводится в дополнительном табе (только в случае, если это доп поле вообще заполнено).
Вы хотели "типа стринг", поэтому я его обозвал addi_string.
Но при этом, важная деталь!
Когда я пытаюсь читать большие блоки чужого кода, то часто возникает проблема, что разные сущности имеют одинаковые названия.
И не всегда понятно, где суть одно и тоже, а где разные сущности с одинаковым названием.
У меня новая абстракция называется addi_string, а префиксы и постфиксы разделяют её проявления в различных блоках и частях кода.
1) addi_string_db - название столбца в базе данных.
2) input-addi-string - id textarea в форме редактирования. Точнее, это часть id - весь id имеет ещё дополнительный языковый постфикс.
3) addi_string_form - значение атрибута name той же textarea. Точнее, это только часть name - есть ещё дополнительный языковый префикс.
4) addi_string_admin - значение addi_string, полученное из БД для вывода в админке при редактировании товара.
5) addi_string_info - ключ в массиве $product_info со значением соответствующим addi_string_db.
6) addi_string_product - ключ в массиве $data, со значением, соответствующим значению addi_string_info.
7) $addi_string_product - переменная PHP, соответствующая значению addi_string_product и используемая непосредственно на странице продукта.
Ну вот, не много, не мало, а семь разных сущностей для одной абстракции.
В принципе можно было каждый раз использовать одно слово addi_string, но мне кажется, что так, как сейчас будет проще разобраться, что откуда берётся.
Итак.
Пункт А.
Первое, что надо сделать, это создать столбец в базе данных.
На мой взгляд лучше всего подходит таблица product_description, - там как раз вся вкладка General. Вроде как логично.
Я создавал вручную инструментами phpMyAdmin, чего и Вам желаю. Так что кода здесь не будет.
Я назвал этот столбец addi_string_db, где постфикс _db говорит о том, что сущность относится к базе данных и больше ни к чему.
Пункт Б.
Создаём форму ввода в админке.
Файл называется product_form.tpl и находится по адресу /admin/view/template/catalog/product_form.tpl
Код вставляется в
<form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" id="form-product" class="form-horizontal">
...
<div class="tab-content">
<div class="tab-pane active" id="tab-general">
...
<div class="tab-content">
...
Закрывающие теги здесь не проставлены.
Вот внутри этого последнего <div class="tab-content"> находятся все инпуты и текстареа вкладки General.
Я вставил свой код после инпута Product Name
Вот сам код:
<!-- addi_string start -->
<div class="form-group">
<label class="col-sm-2 control-label" for="input-addi-string<?php echo $language['language_id']; ?>">***</label>
<div class="col-sm-10">
<textarea name="product_description[<?php echo $language['language_id']; ?>][addi_string_form]" rows="5" placeholder="***" id="input-addi-string<?php echo $language['language_id']; ?>" class="form-control">
<?php echo isset($product_description[$language['language_id']]) ? $product_description[$language['language_id']]['addi_string_admin'] : ''; ?>
</textarea>
</div>
</div>
<!-- addi_string end -->
Комментарии к коду:
а) id имеет не совсем привычный вид id="input-addi-string<?php echo $language['language_id']; ?>"
Часть input-addi-string мы задаём любую, отражающую смысл значения. Потом при помощи <?php echo $language['language_id']; ?> добавляем к ней идетнификатор языка.
Для английского на дефолте инспектор браузера покажет id="input-addi-string1", где 1 - это англ яз
Таким образом, для разных языков будет разный id.
б) Атрибут name тоже не совсем обычный:
name="product_description[<?php echo $language['language_id']; ?>][addi_string_form]"
Здесь:
часть product_description, - это название массива в который записываются значения всех атрибутов name инпутов и текстарея вкладки General.
К тому же для всех используемых языков. (я в этом месте долго фтыкал, блин)
часть [<?php echo $language['language_id']; ?>] - это доступ к массиву текущего используемого языка.
часть [addi_string_form] - это название именно этого поля формы (этой текстареа)
Для английского на дефолте инспектор браузера покажет name="product_description[1][addi_string_form]", где 1 - это англ яз
в) Для значения placeholder и внуть тега label я поставил звёздочки.
Вообще, там должны быть языковые переменные, но я пытался упростить и сократить код.
В принципе, в качестве временной меры можно написать любой уместный текст прямо вместо этих звёздочек.
Либо заморочится с чзыковыми файлами.
г) Внутри тега textarea выводится значение переменной $product_description[$language['language_id']]['addi_string_admin'],
если оно установленно.
Здесь $product_description, - это массив из массивов языков.
Каждый массив языка, это тоже массив и он имеет ключ 'addi_string_admin' (объяснение того, откуда это берётся будет позже).
д) И на закуску:
В самом низу этого файла, после всех закрывающих дивов есть яваскрипт:
<script type="text/javascript"><!--
<?php foreach ($languages as $language) { ?>
$('#input-description<?php echo $language['language_id']; ?>').summernote({height: 300});
<?php } ?>
//--></script>
Так вот, в тупо сделал вот так:
<script type="text/javascript"><!--
<?php foreach ($languages as $language) { ?>
$('#input-description<?php echo $language['language_id']; ?>').summernote({height: 300});
$('#input-addi-string<?php echo $language['language_id']; ?>').summernote({height: 300});
<?php } ?>
//--></script>
И текстареа стала с поддержкой визуального редактора кода.
По формам всё.
Пункт В.
Делаем запись в базу данных.
Файл называется product.php и находится по адресу: admin/model/catalog/product.php
Необходимо добавить две записи:
1) В функцию addProduct (функция добавления нового продукта). Это в самом начале файла.
Но добавлять надо не в начало функции, а в запрос где есть INSERT INTO " . DB_PREFIX . "product_description SET
т.е. запрос, который работает с таблицей product_description.
Надо понимать, авторы движка считают этот запрос нередактируемым тем варварским способом, который мы применяем,
поэтому запрос написан в одну строчку. Редактировать неудобно.
Вставить надо вот это:
addi_string_db = '" . $this->db->escape($value['addi_string_form']) . "',
Вставить надо после любой запятой и перед название следующего столбца.
В этом месте я тоже долго мучился, потому что пытался красиво отформатировать текст запроса,
но имел проблемы с заголовками для браузера. Так что, в этом месте поаккуратней с пробелами.
Здесь addi_string_db - это как раз название столбца в базе данных,
а addi_string_form - это значение атрибута name в форме ввода в админке.
Причём, не всё значение этого атрибута, а только то, что в последних квадратных скобках.
Остальные части атрибута name разобраны циклом foreach, перебирающего массив product_description
Надо понимать, будет столько запросов, сколько используется языков.
2) В функцию editProduct (функция редактирования существующего продукта).
В принципе, всё аналогично. Ищите аналогичный запрос INSERT INTO " . DB_PREFIX . "product_description SET
но внутри функции editProduct
Манипуляции с запросом те же самые.
С записью в таблицу всё.
Можно открыть phpMyAdmin и проверить наличие записей в столбце addi_string_db таблицы product_description.
Хотя, конечно, с первого раза вряд-ли получиться.
КОНЕЦ ПЕРВОЙ СЕРИИ.
Вывод на экран в админке и карточке товара в следующей серии.
ПС код лучше не копипастить тупо и бездумно (могут быть опечатки). Но у меня всё работает, включая содержание второй серии.