[OCMOD] Дополнительное поле Описания в карточке товара OpenCart 3

Тема в разделе "Готовые модули и модификаторы. Бесплатно", создана пользователем Maksikus, 15 май 2023.

  1. Maksikus

    Maksikus Пользователь

    Сообщения:
    84
    Симпатии:
    8
    Коллеги, приветствую!

    Тут не нашёл.

    Делал для себя:
    - дополнительное поле описания в карточке товара для opencart 3.x:
    - а именно:
    - opencart 3.0.3.7
    , может кому-то пригодится.

    Код:
    <?xml version="1.0" encoding="utf-8"?>
    <modification>
      <name>[BEFE] Дополнительное поле Описания в карточке товара</name>
      <code>BEFE_Extra_Description_Product_v100</code>
      <version>1.0.0</version>
      <author>MAEmelyanov</author>
      <link>https://t.me/maemelyanov</link>
      
      <file path="admin/controller/catalog/product.php">
        <operation>
          <search><![CDATA[if (isset($this->request->post['product_description'])) {]]></search>
          <add position="after" offset="6"><![CDATA[
            if (isset($this->request->post['product_extra_description'])) {
                $data['product_extra_description'] = $this->request->post['product_extra_description'];
            } elseif (isset($this->request->get['product_id'])) {
                $data['product_extra_description'] = $this->model_catalog_product->getProductDescriptions($this->request->get['product_id']);
            } else {
                $data['product_extra_description'] = array();
            }
          ]]></add>
        </operation>
      </file>
    
      <file path="admin/model/catalog/product.php">
        <operation>
          <search index="0"><![CDATA[description = '" . $this->db->escape($value['description']) . "',]]></search>
          <add position="replace"><![CDATA[
            description = '" . $this->db->escape($value['description']) . "', extra_description = '" . $this->db->escape($value['extra_description']) . "',
          ]]></add>
        </operation>
        <operation>
           <search index="1"><![CDATA[description = '" . $this->db->escape($value['description']) . "',]]></search>
          <add position="replace"><![CDATA[
            description = '" . $this->db->escape($value['description']) . "', extra_description = '" . $this->db->escape($value['extra_description']) . "',
          ]]></add>
        </operation>
        <operation>
          <search><![CDATA[public function getProducts($data = array()) {]]></search>
          <add position="after"><![CDATA[
            $result_extra_description = $this->db->query("SHOW COLUMNS FROM " . DB_PREFIX . "product_description LIKE 'extra_description';");
            if ($result_extra_description->num_rows == 0) {
                $this->db->query("ALTER TABLE " . DB_PREFIX . "product_description ADD COLUMN extra_description TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER  `description` ;");             
            }
          ]]></add>
        </operation>
        <operation>
          <search><![CDATA['description'      => $result['description'],]]></search>
          <add position="after"><![CDATA[
            'extra_description'  => $result['extra_description'],
          ]]></add>
        </operation>
      </file>
     
      <file path="admin/view/template/catalog/product_form.twig">
        <operation>
          <search><![CDATA[<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>]]></search>
          <add position="after" offset="2"><![CDATA[
                        <div class="form-group">
                          <label class="col-sm-2 control-label" for="input-description{{ language.language_id }}">{{ entry_extra_description }}</label>
                          <div class="col-sm-10">
                            <textarea name="product_description[{{ language.language_id }}][extra_description]" placeholder="{{ entry_extra_description }}" id="input-extra_description{{ language.language_id }}" data-toggle="summernote" data-lang="{{ summernote }}" class="form-control">{{ product_extra_description[language.language_id] ? product_description[language.language_id].extra_description }}</textarea>
                          </div>
                        </div>
          ]]></add>
        </operation>
      </file>
     
      <file path="catalog/controller/product/product.php">
        <operation>
          <search><![CDATA[$data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');]]></search>
          <add position="after"><![CDATA[
                $data['extra_description'] = html_entity_decode($product_info['extra_description'], ENT_QUOTES, 'UTF-8');
          ]]></add>
        </operation>
        <operation>
          <search><![CDATA['description' => utf8_substr(trim(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'))), 0, $this->config->get('theme_' . $this->config->get('config_theme') . '_product_description_length')) . '..',]]></search>
          <add position="after"><![CDATA[
                        'extra_description' => utf8_substr(trim(strip_tags(html_entity_decode($result['extra_description'], ENT_QUOTES, 'UTF-8'))), 0, $this->config->get('theme_' . $this->config->get('config_theme') . '_product_description_length')) . '..',
          ]]></add>
        </operation>
      </file>
     
      <file path="catalog/model/catalog/product.php">
        <operation>
          <search><![CDATA['description'      => $query->row['description'],]]></search>
          <add position="after"><![CDATA[
                    'extra_description'      => $query->row['extra_description'],
          ]]></add>
        </operation>
      </file>
     
       <file path="catalog/view/theme/default/template/product/product.twig">
        <operation>
          <search><![CDATA[<div class="tab-pane active" id="tab-description">{{ description }}</div>]]></search>
          <add position="replace"><![CDATA[
                        <div class="tab-pane active" id="tab-description">{{ description }}
                        <br>
                        {{ extra_description }}</div>
          ]]></add>
        </operation>
      </file>
     
      <file path="admin/language/ru-ru/catalog/product.php">
        <operation>
          <search><![CDATA[$_['entry_description']]]></search>
          <add position="before"><![CDATA[
            $_['entry_extra_description'] = 'Дополнительное описание';
          ]]></add>
        </operation>
      </file>
      <file path="admin/language/en-gb/catalog/product.php">
        <operation>
          <search><![CDATA[$_['entry_description']]]></search>
          <add position="before"><![CDATA[
            $_['entry_extra_description'] = 'Additional description';
          ]]></add>
        </operation>
      </file>
     
    </modification>
     

    Вложения:

    Последнее редактирование: 27 май 2023
    Psyreagent и devimirochnik нравится это.
  2. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Полезная вещь, единственно, лучше использовать вместо

    catalog/view/theme/default/template/product

    Запись

    catalog/view/theme/*/template/product

    Тогда не только в дефолтном шаблоне будет применяться.
     
    lap81 нравится это.
  3. Psyreagent

    Psyreagent Новичок

    Сообщения:
    1
    Симпатии:
    1
    Спасибо огромное! Очень сильно пригодился!
     
    Maksikus нравится это.
  4. Maksikus

    Maksikus Пользователь

    Сообщения:
    84
    Симпатии:
    8
    Обнаружен конфликт расширений.
    Сделал изменение здесь:
    Код:
       <file path="catalog/view/theme/default/template/product/product.twig">
        <operation>
          <search><![CDATA[{{ description }}]]></search>
          <add position="replace"><![CDATA[
                        {{ extra_description }}
                        {{ description }}
          ]]></add>
        </operation>
      </file>
     

    Вложения:

  5. Stas-Clear

    Stas-Clear Новичок

    Сообщения:
    2
    Симпатии:
    0
    А ты в БД поле вручную создавал ? А как сделать это создание поля в момент инсталяции модификатора ? У меня не выходит.
     
  6. Tom

    Tom Специалист

    Сообщения:
    674
    Симпатии:
    204
    По идее в модификаторе была задумка сделать автодобавление поля в таблицу бд.
    В своё время делал и выкладывал на другом форуме схожий вариант. Их очень много в бесплатном доступе, на все виды хотелок.
    Суть этого решения, мне кажется совершенно непонятной.
    Имея поле для описания в товаре, добавляется ещё одно такое же, которое с переносом строки <br> выводится в описании уже в магазине.
    Сам я как то писал модификатор исходя из задачи поставленной заказчиком, когда собирал по просьбе магазинчик.
    И там смысл был иной совершенно :

    Если заполнено "Дополнительное описание"
    Выводим на всех страницах и в модулях
    Не заполнено
    Выводим основное.

    В карточке товара краткое описание было выведено выше вкладок.
    А этот вариант где может пригодится, не представляю.
    tomtom.png
     
    Последнее редактирование: 27 июл 2023
  7. Stas-Clear

    Stas-Clear Новичок

    Сообщения:
    2
    Симпатии:
    0
    С этим я понял. У меня задача чтобы дополнительное поле создавалось в БД именно при установке модификатора. Предложенные варианты в сети не срабатывают. Поле в БД создаваться не хочет, вот в этом загвоздка.
    Я делал по аналогии, не помогло

    <!-- Добавляем поле-->
    <file path="install/">
    <operation>
    <search><![CDATA[<code><![CDATA[]]></search>
    <add position="before"><![CDATA[
    $this->db->query("ALTER TABLE " . DB_PREFIX . "product ADD COLUMN newfield DECIMAL(15,3) NOT NULL AFTER height");
    ]]></add>
    </operation>
    </file>
     
  8. Tom

    Tom Специалист

    Сообщения:
    674
    Симпатии:
    204
    Не слышал о таком способе.
    Можно в контроллер добавить условие на проверку существования этого поля. И если его нет, добавить поле в таблицу.
    Что то типа

    Код:
    $query = $this->db->query("DESC " . DB_PREFIX . "product_description product_extra_description");
    if (!$query->num_rows) {
        $this->db->query("ALTER TABLE `" . DB_PREFIX . "product_description` ADD `product_extra_description` text COLLATE utf8_bin NOT NULL");
    }
     
  9. Maksikus

    Maksikus Пользователь

    Сообщения:
    84
    Симпатии:
    8
    Stas-Clear , приветствую!
    Не в ручную, вот код в ocmod, где создаётся столбец:
    Код:
      <file path="admin/model/catalog/product.php">
    ...
        <operation>
          <search><![CDATA[public function getProducts($data = array()) {]]></search>
          <add position="after"><![CDATA[
            $result_extra_description = $this->db->query("SHOW COLUMNS FROM " . DB_PREFIX . "product_description LIKE 'extra_description';");
            if ($result_extra_description->num_rows == 0) {
                $this->db->query("ALTER TABLE " . DB_PREFIX . "product_description ADD COLUMN extra_description TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' AFTER `description`;");               
            }
          ]]></add>
        </operation>
    ...
      </file>
    
     
    Последнее редактирование: 29 июл 2023
  10. Tom

    Tom Специалист

    Сообщения:
    674
    Симпатии:
    204
    Лучше сразу после index, в качестве примера написал выше что и как.
     
  11. Maksikus

    Maksikus Пользователь

    Сообщения:
    84
    Симпатии:
    8
    Tom , этот вариант я выложил как вариант:
    - создать дополнительное описание к товару, не более...
    - а применить можно в разных ситуациях...
    - как пример:
    - вывод доп.описания в карточку товара в категории...
    как-то так...
     
  12. Maksikus

    Maksikus Пользователь

    Сообщения:
    84
    Симпатии:
    8
    Понял.