1

Тема: Дополнительные теги в опенкарт

Необходимо в опенкарт сделать управление дополнительными тегами, определяющих какие-то общие свойства товара.
Зачем создавать отдельные дополнительные теги к уже существующим? Ну, хотя бы для того, чтобы данные теги можно было выводить в отдельном месте на странице товара, в отдельном, конкретном модуле. То есть, необходимо отделить управление основными тегами товара, обрабатываемых OC по умолчанию, от управления дополнительными.

Для начала в таблице "product_discription" создадим новое поле 'tag_seria'. Ничего уникального для этого поля не предвидится, поэтому просто клонируем в конец таблицы поле 'tag' .

Далее, модифицируем файл product.php в папке admin/model/catalog

Находим:

        $this->db->query("INSERT INTO " . DB_PREFIX . "product_description SET product_id = '" . (int)$product_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($value['name']) . "', description = '" . $this->db->escape($value['description']) . "', tag = '" . $this->db->escape($value['tag']) . "', meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "'");

Меняем на:

            $this->db->query("INSERT INTO " . DB_PREFIX . "product_description SET product_id = '" . (int)$product_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($value['name']) . "', description = '" . $this->db->escape($value['description']) . "', tag = '" . $this->db->escape($value['tag']) . "', meta_title = '" . $this->db->escape($value['meta_title']) . "', meta_description = '" . $this->db->escape($value['meta_description']) . "', meta_keyword = '" . $this->db->escape($value['meta_keyword']) . "', tag_seria = '" . $this->db->escape($value['tag_seria']) . "'");

Данный поиск с заменой необходимо сделать 2 раза.


Затем находим:

                'tag'              => $result['tag']

Меняе на:

                'tag'              => $result['tag'],
                'tag_seria'              => $result['tag_seria']

Поделиться

2

Re: Дополнительные теги в опенкарт

Далее открываем файл product.php в папке admin/controller/catalog

Находим:

        $data['entry_tag'] = $this->language->get('entry_tag');

Ниже добавляем:

        $data['entry_tag_seria'] = $this->language->get('entry_tag_seria');

Находим:

        $data['help_tag'] = $this->language->get('help_tag');

Ниже добавляем:

        $data['help_tag_seria'] = $this->language->get('help_tag_seria');

Открываем файл product.php в папке admin/language/russian/catalog

Ищем:

$_['entry_tag']               = 'Теги товара';

Ниже добавляем:

$_['entry_tag_seria']               = 'Тег Серия';

Ищем:

$_['help_tag']               = 'теги разделяются запятой';

Ниже добавляем:

$_['help_tag_seria']               = 'теги разделяются запятой';

Открываем файл product_form.tpl в папке admin/view/template/catalog

Ищем:

                  <div class="form-group">
                    <label class="col-sm-2 control-label" for="input-tag<?php echo $language['language_id']; ?>"><span data-toggle="tooltip" title="<?php echo $help_tag; ?>"><?php echo $entry_tag; ?></span></label>
                    <div class="col-sm-10">
                      <input type="text" name="product_description[<?php echo $language['language_id']; ?>][tag]" value="<?php echo isset($product_description[$language['language_id']]) ? $product_description[$language['language_id']]['tag'] : ''; ?>" placeholder="<?php echo $entry_tag; ?>" id="input-tag<?php echo $language['language_id']; ?>" class="form-control" />
                    </div>
                  </div>

Ниже добавляем:

                  <div class="form-group">
                    <label class="col-sm-2 control-label" for="input-tag-seria<?php echo $language['language_id']; ?>"><span data-toggle="tooltip" title="<?php echo $help_tag_seria; ?>"><?php echo $entry_tag_seria; ?></span></label>
                    <div class="col-sm-10">
                      <input type="text" name="product_description[<?php echo $language['language_id']; ?>][tag_seria]" value="<?php echo isset($product_description[$language['language_id']]) ? $product_description[$language['language_id']]['tag_seria'] : ''; ?>" placeholder="<?php echo $entry_tag_seria; ?>" id="input-tag-seria<?php echo $language['language_id']; ?>" class="form-control" />
                    </div>
                  </div>

Обновляем кэш модификаторов.
Получили возможность добавлять новые теги "Серия" (независимые от тегов, предусмотренных в опенкарт по умолчанию)

Поделиться

3

Re: Дополнительные теги в опенкарт

Непосредственно править файлы системы не рекомендуется (хотя это для некоторых случаев спорный вопрос). Поэтому файл модификации sv_additional_tag.ocmod.xml можно получить ниже:

Post's attachments

Attachment icon sv_additional_tag.ocmod.xml 4.11 kb, 336 downloads since 2015-10-12 

Поделиться

4

Re: Дополнительные теги в опенкарт

Теперь возникает вопрос: как вывести дополнительный тег в карточку товара (естественно, не обязательно именно туда - можно куда угодно...)?

Решить можно так: Вставляем следующий кусок кода в нужное место своего шаблона.

<!-- Серия  -->    
      <?php if ($tags_seria) { ?>
      <p><?php echo $text_tags_seria; ?>
        <?php for ($i = 0; $i < count($tags_seria); $i++) { ?>
        <?php if ($i < (count($tags_seria) - 1)) { ?>
        <a href="<?php echo $tags_seria[$i]['href']; ?>"><?php echo $tags_seria[$i]['tag_seria']; ?></a>,
        <?php } else { ?>
        <a href="<?php echo $tags_seria[$i]['href']; ?>"><?php echo $tags_seria[$i]['tag_seria']; ?></a>
        <?php } ?>
        <?php } ?>
      </p>
      <?php } ?>

Небольшое отступление - этот код мы тупо скопировали из соответствующего куска кода этого же шаблона с простой заменой всех вхождений строк "tags" и  "tag" на "tags_seria" и  "tag_seria" соответственно... Будем предельно внимательны: тупое копирование с заменой - это очень вредная и опасная привычка!!! Запомним, что изменения затронули   "text_tags", "tags" и  "tag"

Поделиться

5

Re: Дополнительные теги в опенкарт

Открываем файл product.php из  catalog/controller/product и там ищем:

$data['text_tags'] = $this->language->get('text_tags');

Дабавляем ниже:

    $data['text_tags_seria'] = $this->language->get('text_tags_seria');

Ищем:

            $data['tags'] = array();

            if ($product_info['tag']) {
                $tags = explode(',', $product_info['tag']);

                foreach ($tags as $tag) {
                    $data['tags'][] = array(
                        'tag'  => trim($tag),
                        'href' => $this->url->link('product/search', 'tag=' . trim($tag))
                    );
                }
            }

Ниже добавляем:

            $data['tags_seria'] = array();

            if ($product_info['tag_seria']) {
                $tags_seria = explode(',', $product_info['tag_seria']);

                foreach ($tags_seria as $tag_seria) {
                    $data['tags_seria'][] = array(
                        'tag_seria'  => trim($tag_seria),
                        'href' => $this->url->link('product/search', 'tag-seria=' . trim($tag_seria))
                    );
                }
            }

Ищем:

    if (isset($this->request->get['tag'])) {
                $url .= '&tag=' . $this->request->get['tag'];
            }

Ниже добавить:

            if (isset($this->request->get['tag_serias'])) {
                $url .= '&tag_serias=' . $this->request->get['tag_serias'];
            }    

Последний поиск с добавлением нужно выполнить 3 раза.

Поделиться

6

Re: Дополнительные теги в опенкарт

Открываем catalog/language/russian/product/product.php - ищем:

$_['text_tags']                               = '<i class="fa fa-tags"></i>';

Добавляем ниже:

$_['text_tags_seria']                               = '<i class="fa fa-tags_seria"></i>';

Поделиться

7

Re: Дополнительные теги в опенкарт

Продолжаем дальше:

Ищем - catalog/model/catalog/product.php:

'tag'              => $query->row['tag'],

Ниже:

                'tag_seria'              => $query->row['tag_seria'],    

... Теперь мы добились того, что наш новый тэг виден сисемой и отображается в карточке заказа.

Поделиться

8

Re: Дополнительные теги в опенкарт

Пробуем настроить поиск по новому тегу.

Опять смотрим последний файл...

        if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {

Эту строку выше надо найти 2 раза и в обоих случаях изменить на:

        if (!empty($data['filter_name']) || !empty($data['filter_tag']) || !empty($data['filter_tag_seria'])) {

Эту строку так же ищем в двух местах и два раза заменяем:

            if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {

меняем на эту:

            if (!empty($data['filter_name']) && (!empty($data['filter_tag']) || !empty($data['filter_tag_seria']))) {



Ищем:

            if (!empty($data['filter_tag'])) {
                $sql .= "pd.tag LIKE '%" . $this->db->escape($data['filter_tag']) . "%'";
            }

Ниже добавляем:

            if (!empty($data['filter_tag_seria'])) {
                $sql .= "pd.tag_seria LIKE '%" . $this->db->escape($data['filter_tag_seria']) . "%'";
            }    


Ищем:

            if (!empty($data['filter_tag'])) {
                $sql .= "pd.tag LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_tag'])) . "%'";
            }

Ниже добавляем:

            if (!empty($data['filter_tag_seria'])) {
                $sql .= "pd.tag_seria LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_tag_seria'])) . "%'";
            }

Поделиться

9

Re: Дополнительные теги в опенкарт

Продолжим дальше (но предыдущий пост пока оставим под вопросом).

Откроем catalog/controller/product/search.php

Ищем:

        if (isset($this->request->get['tag'])) {
            $tag = $this->request->get['tag'];
        } elseif (isset($this->request->get['search'])) {
            $tag = $this->request->get['search'];
        } else {
            $tag = '';
        }

Ниже добавляем:

        if (isset($this->request->get['tag_seria'])) {
            $tag_seria = $this->request->get['tag_seria'];
        } else {
            $tag_seria = '';
        }

Ищем:

        } elseif (isset($this->request->get['tag'])) {
            $this->document->setTitle($this->language->get('heading_title') .  ' - ' . $this->language->get('heading_tag') . $this->request->get['tag']);

Ниже добавляем:

        } elseif (isset($this->request->get['tag_seria'])) {
            $this->document->setTitle($this->language->get('heading_title') .  ' - ' . $this->language->get('heading_tag_seria') . $this->request->get['tag_seria']);




Ищем:

        if (isset($this->request->get['search']) || isset($this->request->get['tag'])) {
            $filter_data = array(
                'filter_name'         => $search,
                'filter_tag'          => $tag,

Меняем на:

        if (isset($this->request->get['search']) || isset($this->request->get['tag']) || isset($this->request->get['tag_seria'])) {
            $filter_data = array(
                'filter_name'         => $search,
                'filter_tag'          => $tag,
                'filter_tag_seria'          => $tag_seria,

Ищем следующий код  в четырех местах:

            if (isset($this->request->get['tag'])) {
                $url .= '&tag=' . urlencode(html_entity_decode($this->request->get['tag'], ENT_QUOTES, 'UTF-8'));
            }

Каждый раз после найденного добавляем:

            if (isset($this->request->get['tag_seria'])) {
                $url .= '&tag_seria=' . urlencode(html_entity_decode($this->request->get['tag_seria'], ENT_QUOTES, 'UTF-8'));
            }

Поделиться

10

Re: Дополнительные теги в опенкарт

Вроде ничего не упустил. Скорректированный под поиск ocmod.xml ниже. Как уже в самом начале отмечалось: дополнительное поле в БД надо добавить руками.

.......ocmod.xml

Платить 10 рублей за этот файл совершенно не обязательно. Все, что необходимо для реализации данной функции рассказано выше. Этот файл только для тех, кому "лень самому", "кому хочется быстро сделать и не вникать", ну и так далее.

PS: Реализовано для 2.0.1.1  Для более свежих версий не проверялось

Поделиться