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

URL: https://dmeshcheryakov.ru/blog/opencart-category-id-admin/
Раздел: CMS
Теги: OpenCart, Админка, PHP
Опубликовано: 2018-10-10
Обновлено: 2026-09-07
Автор: Дмитрий Мещеряков (https://dmeshcheryakov.ru)

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

Мелкая доработка, которая экономит время каждый рабочий день: 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) существует именно для этого — и обход его ради экономии двадцати минут всегда оказывается плохой сделкой, потому что расплачиваться приходится тогда, когда никто не помнит про эту правку.