Как добавить собственное поле в карточку товара 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 (рекомендуемый)

  1. Перейдите в раздел "Модификаторы" (Extensions > Extensions > Modifications) в админ-панели OpenCart.
  2. Нажмите кнопку "Обновить" (Refresh) в правом верхнем углу.
  3. Нажмите кнопку "Создать" (Create) и вставьте содержимое файла zavod.ocmod.xml в соответствующее поле.
  4. Сохраните модификацию.
  5. Перейдите в раздел "Настройки" (Extensions > Extensions > Extensions), выберите "Модификаторы" (Modifications) и нажмите "Обновить" (Refresh) еще раз.

Способ 2: Загрузка файла модификации напрямую

  1. Поместите ваш файл zavod.ocmod.xml в папку system/.
  2. После этого следуйте шагам 1, 2 и 4 из "Способа 1" (перейдите в Модификаторы, нажмите "Обновить", затем "Создать" (если вы уже не создали ее вручную) и снова "Обновить"). OpenCart автоматически обнаружит файл в папке system/.

Шаг 3: Добавление поля в админке

Теперь, когда модификация установлена, вы можете добавлять значение поля "Завод" к вашим товарам:

  1. Перейдите в раздел "Каталог" > "Товары" (Catalog > Products).
  2. Нажмите "Добавить" (Add) или выберите существующий товар для редактирования.
  3. На вкладке "Данные" (Data) вы увидите новое поле "Завод". Введите нужное значение (например, "Завод №1", "Китай", "Германия" и т.д.).
  4. Сохраните товар.

Шаг 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' при сохранении/редактировании товара.
  • 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:
    • Выводит поле "Завод" на странице товара, если оно заполнено.
Важное примечание: Перед внесением любых изменений всегда делайте резервные копии файлов вашего сайта и базы данных. Также убедитесь, что у вас установлен доступ к файлам вашего сервера (например, через FTP или SFTP).
Покупка готового скрипта joomla 3

или просто напишите в телеграмм https://t.me/webalan