Как добавить собственное поле в карточку товара OpenCart 3 и вывести на витрине
- Показывать справа: 0
Мы разберем, как расширить функционал вашего интернет-магазина на OpenCart 3, добавив новое поле для товаров. В качестве примера будем использовать поле "Завод", но принцип применим для добавления любого другого свойства.
Важно: Для внесения изменений в файлы CMS рекомендуется использовать систему модификаций OpenCart (OCMOD), чтобы избежать проблем при обновлении движка. Мы будем использовать OCMOD для нашей задачи.
Шаг 1: Создание файла модификации (zavod.ocmod.xml)
Создайте новый файл с именем zavod.ocmod.xml и поместите в него следующий XML-код:
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Мod</name> <!-- Название модификатора -->
<code>zavod</code> <!-- Уникальный код модификатора -->
<version>1.0</version> <!-- Версия модификатора -->
<author>Webalan</author> <!-- Автор модификатора -->
<link>https://webalan.ru/</link> <!-- Сайт разработчика -->
<file path="admin/model/catalog/product.php"> <!-- Файл который будет модифицироваться -->
<operation>
<search > <!-- Поиск кода в файле -->
<![CDATA[model = '" . $this->db->escape($data['model']) . "',]]>
</search>
<add position="replace"> <!-- Добавление модификации (после найденного куска кода) -->
<![CDATA[model = '" . $this->db->escape($data['model']) . "',zavod = '" . $this->db->escape($data['zavod']) . "',]]>
</add>
</operation>
</file>
<file path="admin/controller/catalog/product.php"> <!-- Файл который будет модифицироваться -->
<operation>
<search> <!-- Поиск кода в файле -->
<![CDATA[$data['model'] = $this->request->post['model'];]]>
</search>
<add position="after"> <!-- Добавление модификации (после найденного куска кода) -->
<![CDATA[ $data['zavod'] = $this->request->post['zavod'];]]>
</add>
</operation>
</file>
<file path="admin/controller/catalog/product.php"> <!-- Файл который будет модифицироваться -->
<operation>
<search> <!-- Поиск кода в файле -->
<![CDATA[$data['model'] = $product_info['model'];]]>
</search>
<add position="after"> <!-- Добавление модификации (после найденного куска кода) -->
<![CDATA[ $data['zavod'] = $product_info['zavod'];]]>
</add>
</operation>
</file>
<file path="admin/model/catalog/product.php"> <!-- Файл который будет модифицироваться -->
<operation>
<search> <!-- Поиск кода в файле -->
<![CDATA[class ModelCatalogProduct extends Model {]]>
</search>
<add position="after"> <!-- Добавление модификации (после найденного куска кода) -->
<![CDATA[public function checkFieldModelChoice() {
$hasModelChoiceField = FALSE;
$result = $this->db->query( "DESCRIBE `".DB_PREFIX."product`;" );
foreach ($result->rows as $row) {
if ($row['Field'] == 'zavod') {
$hasModelChoiceField = TRUE;
break;
}
}
if (!$hasModelChoiceField) {
$sql = "ALTER TABLE `".DB_PREFIX."product` ADD `zavod` VARCHAR( 64 ) CHARACTER SET utf8 COLLATE utf8mb3_general_ci NOT NULL DEFAULT ''";
$this->db->query( $sql );
}
}]]>
</add>
</operation>
</file>
<file path="admin/model/catalog/product.php"> <!-- Файл который будет модифицироваться -->
<operation>
<search> <!-- Поиск кода в файле -->
<![CDATA[public function editProduct($product_id, $data) {]]>
</search>
<add position="after"> <!-- Добавление модификации (после найденного куска кода) -->
<![CDATA[$this->checkFieldModelChoice();]]>
</add>
</operation>
</file>
<file path="admin/model/catalog/product.php"> <!-- Файл который будет модифицироваться -->
<operation>
<search> <!-- Поиск кода в файле -->
<![CDATA[public function addProduct($data) {]]>
</search>
<add position="after"> <!-- Добавление модификации (после найденного куска кода) -->
<![CDATA[$this->checkFieldModelChoice();]]>
</add>
</operation>
</file>
<file path="admin/controller/catalog/product.php"> <!-- Файл который будет модифицироваться -->
<operation>
<search> <!-- Поиск кода в файле -->
<![CDATA[$data['model'] = '';]]>
</search>
<add position="after"> <!-- Добавление модификации (после найденного куска кода) -->
<![CDATA[$data['zavod'] = '';;]]>
</add>
</operation>
</file>
<file path="admin/controller/catalog/product.php"> <!-- Файл который будет модифицироваться -->
<operation>
<search> <!-- Поиск кода в файле -->
<![CDATA[$data['model'] = '';]]>
</search>
<add position="after"> <!-- Добавление модификации (после найденного куска кода) -->
<![CDATA[$data['zavod'] = '';;]]>
</add>
</operation>
</file>
<file path="admin/view/template/catalog/product_form.twig"> <!-- Файл который будет модифицироваться -->
<operation>
<search> <!-- Поиск кода в файле -->
<![CDATA[<div class="tab-pane" id="tab-data">]]>
</search>
<add position="after"> <!-- Добавление модификации (после найденного куска кода) -->
<![CDATA[
<div class="form-group required">
<label class="col-sm-2 control-label" for="input-zavod">Завод{{ entry_zavod }}</label>
<div class="col-sm-10">
<input type="text" name="zavod" value="{{ zavod }}" placeholder="{{ entry_zavod }}" id="input-zavod" class="form-control"/>
{% if error_zavod %}
<div class="text-danger">{{ error_zavod }}</div>
{% endif %}</div>
</div>
]]>
</add>
</operation>
</file>
<file path="catalog/controller/product/product.php">
<operation>
<search>
<![CDATA[$data['model'] = $product_info['model'];]]>
</search>
<add position="after">
<![CDATA[ $data['zavod'] = $product_info['zavod'];]]>
</add>
</operation>
</file>
<file path="catalog/model/catalog/product.php">
<operation>
<search>
<![CDATA['model' => $query->row['model'],]]>
</search>
<add position="after">
<![CDATA[ 'zavod' => $query->row['zavod'],]]>
</add>
</operation>
</file>
<file path="catalog/model/catalog/product.php">
<operation>
<search>
<![CDATA['p.model',]]>
</search>
<add position="after">
<![CDATA[ 'p.zavod',]]>
</add>
</operation>
</file>
<file path="catalog/model/catalog/product.php">
<operation>
<search>
<![CDATA[$sql .= " OR LCASE(p.model) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";]]>
</search>
<add position="after">
<![CDATA[ $sql .= " OR LCASE(p.zavod) = '" . $this->db->escape(utf8_strtolower($data['filter_name'])) . "'";]]>
</add>
</operation>
</file>
<file path="catalog/view/theme/default/template/product/product.twig">
<operation>
<search>
<![CDATA[<li>{{ text_model }} {{ model }}</li>]]>
</search>
<add position="after">
<![CDATA[
{% if zavod %}<li>Завод:{{ text_zavod }} {{ zavod }}</li>{% endif %}]]>
</add>
</operation>
</file>
</modification>
Шаг 2: Установка модификации в OpenCart
Существует два основных способа установки OCMOD:
Способ 1: Через админ-панель OpenCart (рекомендуемый)
- Перейдите в раздел "Модификаторы" (Extensions > Extensions > Modifications) в админ-панели OpenCart.
- Нажмите кнопку "Обновить" (Refresh) в правом верхнем углу.
- Нажмите кнопку "Создать" (Create) и вставьте содержимое файла
zavod.ocmod.xmlв соответствующее поле. - Сохраните модификацию.
- Перейдите в раздел "Настройки" (Extensions > Extensions > Extensions), выберите "Модификаторы" (Modifications) и нажмите "Обновить" (Refresh) еще раз.
Способ 2: Загрузка файла модификации напрямую
- Поместите ваш файл
zavod.ocmod.xmlв папкуsystem/. - После этого следуйте шагам 1, 2 и 4 из "Способа 1" (перейдите в Модификаторы, нажмите "Обновить", затем "Создать" (если вы уже не создали ее вручную) и снова "Обновить"). OpenCart автоматически обнаружит файл в папке
system/.
Шаг 3: Добавление поля в админке
Теперь, когда модификация установлена, вы можете добавлять значение поля "Завод" к вашим товарам:
- Перейдите в раздел "Каталог" > "Товары" (Catalog > Products).
- Нажмите "Добавить" (Add) или выберите существующий товар для редактирования.
- На вкладке "Данные" (Data) вы увидите новое поле "Завод". Введите нужное значение (например, "Завод №1", "Китай", "Германия" и т.д.).
- Сохраните товар.
Шаг 4: Проверка на витрине
После сохранения товара, перейдите на страницу товара на витрине вашего магазина. Если вы указали значение в поле "Завод", оно должно отображаться в списке характеристик товара.
Объяснение кода модификации:
<modification>: Корневой элемент XML-файла модификации.<name>,<code>,<version>,<author>,<link>: Метаинформация о вашей модификации.<file path="...">: Указывает, какой файл OpenCart будет модифицирован.<operation>: Определяет блок изменений.<search>: Код, который будет искаться в файле.<add position="...">: Код, который будет добавлен.position="replace": Заменяет найденный код.position="after": Вставляет код после найденного.
<![CDATA[...]]>: Секция для вставки кода, игнорируя специальные символы XML.
Ключевые моменты в коде:
admin/model/catalog/product.php:- Добавляет поле 'zavod' в таблицу
oc_product, если оно еще не существует, с помощью методаcheckFieldZavod(). - Включает запись и обновление поля 'zavod' при сохранении/редактировании товара.
- Добавляет поле 'zavod' в таблицу
admin/controller/catalog/product.php:- Передает значение поля 'zavod' из POST-запроса в данные контроллера при создании/редактировании товара.
- Загружает значение 'zavod' из информации о товаре при редактировании.
- Инициализирует пустое значение 'zavod' при создании нового товара.
admin/view/template/catalog/product_form.twig:- Добавляет HTML-форму для поля "Завод" на вкладке "Данные" в админке.
catalog/controller/product/product.php:- Передает значение 'zavod' из базы данных в шаблон товара на витрине.
catalog/model/catalog/product.php:- Включает выборку поля 'zavod' из базы данных при получении информации о товаре.
- Добавляет 'p.zavod' в SQL-запрос для получения списка товаров.
- Добавляет проверку по полю 'zavod' в фильтрации товаров по имени.
catalog/view/theme/default/template/product/product.twig:- Выводит поле "Завод" на странице товара, если оно заполнено.