OpenCart: отображение ID категорий в админке

Добавление столбца с ID в список категорий админ-панели OpenCart/ocStore для удобной работы с импортом.

Дмитрий Мещеряков
Дмитрий Мещеряков
📅 10 октября 2018 г.📖 5 мин чтения

Мелкая доработка, которая экономит время каждый рабочий день: ID категории нужен постоянно — для настройки модулей, для SEO-правил, для отладки, — а в стандартном списке категорий OpenCart его нет. Приходится открывать категорию и вылавливать идентификатор из адресной строки.

Зачем нужен ID категории в списке

При подготовке файлов импорта товаров нужно знать ID категорий. По умолчанию в списке категорий OpenCart/ocStore идентификаторы не отображаются.

Как добавить колонку ID в список категорий

Модифицируем шаблон списка категорий, добавив колонку ID.

Шаг 1: Добавление заголовка столбца

Откройте файл /admin/view/template/catalog/category_list.tpl (или category_list.twig в новых версиях).

Найдите строку с заголовками таблицы и добавьте колонку ID:

html
<!-- Найти -->
<td class="text-left"><?php echo $column_name; ?></td>

<!-- Добавить ПЕРЕД этой строкой -->
<td class="text-center" style="width: 60px;">ID</td>

Шаг 2: Вывод значений ID

Найдите цикл вывода категорий и добавьте вывод ID:

php
<!-- Найти -->
<td class="text-left"><?php echo $category['name']; ?></td>

<!-- Добавить ПЕРЕД этой строкой -->
<td class="text-center"><?php echo $category['category_id']; ?></td>

Полный пример для OpenCart 3.x

html
<!-- /admin/view/template/catalog/category_list.twig -->

<table class="table table-bordered table-hover">
    <thead>
        <tr>
            <td style="width: 1px;" class="text-center">
                <input type="checkbox" onclick="$('input[name*=\'selected\']').prop('checked', this.checked);" />
            </td>
            <td class="text-center" style="width: 60px;">ID</td>
            <td class="text-left">
                {% if sort == 'name' %}
                    <a href="{{ sort_name }}" class="{{ order|lower }}">{{ column_name }}</a>
                {% else %}
                    <a href="{{ sort_name }}">{{ column_name }}</a>
                {% endif %}
            </td>
            <td class="text-right">{{ column_sort_order }}</td>
            <td class="text-right">{{ column_action }}</td>
        </tr>
    </thead>
    <tbody>
        {% if categories %}
            {% for category in categories %}
                <tr>
                    <td class="text-center">
                        {% if category.category_id in selected %}
                            <input type="checkbox" name="selected[]" value="{{ category.category_id }}" checked="checked" />
                        {% else %}
                            <input type="checkbox" name="selected[]" value="{{ category.category_id }}" />
                        {% endif %}
                    </td>
                    <td class="text-center">
                        <code>{{ category.category_id }}</code>
                    </td>
                    <td class="text-left">{{ category.name }}</td>
                    <td class="text-right">{{ category.sort_order }}</td>
                    <td class="text-right">
                        <a href="{{ category.edit }}" class="btn btn-primary">
                            <i class="fa fa-pencil"></i>
                        </a>
                    </td>
                </tr>
            {% endfor %}
        {% else %}
            <tr>
                <td class="text-center" colspan="5">{{ text_no_results }}</td>
            </tr>
        {% endif %}
    </tbody>
</table>

Модификация через OCMOD (рекомендуется)

Для сохранения изменений при обновлении используйте OCMOD:

xml
<?xml version="1.0" encoding="UTF-8"?>
<modification>
    <name>Show Category ID in Admin</name>
    <code>show_category_id</code>
    <version>1.0</version>
    <author>Developer</author>
    <link>https://example.com</link>
    
    <file path="admin/view/template/catalog/category_list.twig">
        <!-- Добавляем заголовок -->
        <operation>
            <search><![CDATA[<td class="text-left">]]></search>
            <add position="before"><![CDATA[
                <td class="text-center" style="width: 60px;">ID</td>
            ]]></add>
        </operation>
        
        <!-- Добавляем значение -->
        <operation>
            <search><![CDATA[<td class="text-left">{{ category.name }}</td>]]></search>
            <add position="before"><![CDATA[
                <td class="text-center"><code>{{ category.category_id }}</code></td>
            ]]></add>
        </operation>
    </file>
</modification>

Сохраните как show_category_id.ocmod.xml и загрузите через Extensions → Installer.

Почему модификация OCMOD не применилась

OCMOD — это штатный механизм модификаций OpenCart: он не правит исходные файлы, а хранит правила поиска и замены в XML и собирает изменённые копии в директории system/storage/modification, подставляя их вместо оригиналов при обращении. Из этого устройства следуют все типовые проблемы.

Не обновлён кэш модификаций. Пока вы не нажали Refresh в разделе Extensions → Modifications, изменённые копии не пересобраны, и система продолжает отдавать оригинальные файлы. Это причина примерно половины обращений «установил, ничего не произошло».

Строка поиска не совпала. OCMOD ищет точное вхождение подстроки — с учётом пробелов, табуляций и переносов. Шаблон, скопированный из статьи под другую версию OpenCart, не найдётся, и модификация просто ничего не сделает: ошибки при этом не будет. Берите строку поиска из своего файла, а не из примера, и делайте её как можно короче — чем меньше фрагмент, тем выше шанс совпадения на соседних версиях.

Неверный путь к файлу. В OpenCart 2.x шаблоны имеют расширение .tpl, в 3.x — .twig. Модификация, написанная под одну версию, на другой не найдёт файл — и снова молча.

Конфликт с другой модификацией. Если тот же файл правят несколько расширений, они применяются последовательно, и вторая модификация ищет строку уже в изменённом файле. Порядок задаётся полем сортировки в списке модификаций.

Самый быстрый способ отладки: откройте собранную копию файла в system/storage/modification и посмотрите, что получилось на самом деле. Нет файла — не обновлён кэш или неверен путь. Файл есть, вставки нет — не совпала строка поиска. Вставка есть, а на странице пусто — ищите кэш шаблонов или другое расширение, перекрывающее вывод.

Результат

После изменений в списке категорий появится колонка ID:

☑IDНазвание категорииПорядокДействия
☐1Электроника1✏️
☐2Одежда2✏️
☐3└ Мужская1✏️
☐4└ Женская2✏️

Итоги

Правьте через OCMOD, а не файлы напрямую. Прямая правка выглядит быстрее ровно один раз — до ближайшего обновления, которое молча вернёт исходный файл. Причём заметите вы это не сразу: столбец просто исчезнет, а связать это с обновлением, случившимся неделю назад, будет сложно.

После установки модификации обновите кэш через Extensions → Modifications → Refresh — без этого изменения не применятся, и вы будете искать ошибку в коде, которого система ещё не видела.

Тот же приём работает для товаров, заказов и покупателей. Если ID регулярно нужен вам в одном списке, он понадобится и в остальных; сделать все сразу дешевле, чем возвращаться к задаче каждый раз.

💡 Совет

Общее правило для доработок админки на любой CMS: любое изменение, сделанное правкой файлов ядра, живёт до следующего обновления. Штатный механизм расширения (OCMOD в OpenCart, /local/ в Битриксе, плагины в WordPress) существует именно для этого — и обход его ради экономии двадцати минут всегда оказывается плохой сделкой, потому что расплачиваться приходится тогда, когда никто не помнит про эту правку.

Частые вопросы

Как показать ID категорий в админке OpenCart?

Добавить колонку в шаблон списка категорий: заголовок ID в шапку таблицы и вывод поля category_id в цикл вывода строк. Файл называется category_list — с расширением .tpl в OpenCart 2.x и .twig в 3.x, лежит в admin/view/template/catalog. Оформлять правку нужно как модификацию OCMOD, а не менять файл напрямую.

Что такое OCMOD и зачем он нужен?

OCMOD — это штатный механизм модификаций OpenCart: он не правит исходные файлы, а хранит правила поиска и замены в XML и собирает изменённые копии в директории system/storage/modification, подставляя их вместо оригиналов при обращении. Смысл в том, что обновление системы перезаписывает исходные файлы, а модификация остаётся и применяется заново.

Почему модификация OCMOD не применилась?

Четыре типовые причины. Не обновлён кэш модификаций — пока вы не нажали Refresh в разделе Extensions → Modifications, изменённые копии не пересобраны. Строка поиска не совпала: OCMOD ищет точное вхождение подстроки с учётом пробелов и переносов, а ошибки при несовпадении не будет. Неверный путь к файлу — расширение шаблонов различается между версиями 2.x и 3.x. И конфликт с другой модификацией, правящей тот же файл: они применяются последовательно, и вторая ищет строку уже в изменённом файле.

Почему нельзя просто поправить файл шаблона?

Потому что прямая правка выглядит быстрее ровно один раз — до ближайшего обновления, которое молча вернёт исходный файл. Причём заметите вы это не сразу: столбец просто исчезнет, а связать это с обновлением, случившимся неделю назад, будет сложно. Штатный механизм расширения существует именно для этого, и обход его ради экономии двадцати минут всегда оказывается плохой сделкой.

Как отладить модификацию, которая не работает?

Открыть собранную копию файла в директории system/storage/modification и посмотреть, что получилось на самом деле. Нет файла — не обновлён кэш или неверен путь. Файл есть, а вашей вставки нет — не совпала строка поиска. Вставка есть, а на странице ничего не изменилось — ищите кэш шаблонов или другое расширение, перекрывающее вывод.

Можно ли так же вывести ID товаров и заказов?

Да, приём одинаковый для всех списков админки: находите шаблон нужного списка, добавляете колонку в шапку и вывод идентификатора в цикл. Если ID регулярно нужен вам в одном списке, он понадобится и в остальных, поэтому сделать все сразу дешевле, чем возвращаться к задаче каждый раз.