Мелкая доработка, которая экономит время каждый рабочий день: ID категории нужен постоянно — для настройки модулей, для SEO-правил, для отладки, — а в стандартном списке категорий OpenCart его нет. Приходится открывать категорию и вылавливать идентификатор из адресной строки.
Зачем нужен ID категории в списке
При подготовке файлов импорта товаров нужно знать ID категорий. По умолчанию в списке категорий OpenCart/ocStore идентификаторы не отображаются.
Как добавить колонку ID в список категорий
Модифицируем шаблон списка категорий, добавив колонку ID.
Шаг 1: Добавление заголовка столбца
Откройте файл /admin/view/template/catalog/category_list.tpl (или category_list.twig в новых версиях).
Найдите строку с заголовками таблицы и добавьте колонку ID:
<!-- Найти -->
<td class="text-left"><?php echo $column_name; ?></td>
<!-- Добавить ПЕРЕД этой строкой -->
<td class="text-center" style="width: 60px;">ID</td>Шаг 2: Вывод значений ID
Найдите цикл вывода категорий и добавьте вывод ID:
<!-- Найти -->
<td class="text-left"><?php echo $category['name']; ?></td>
<!-- Добавить ПЕРЕД этой строкой -->
<td class="text-center"><?php echo $category['category_id']; ?></td>Полный пример для OpenCart 3.x
<!-- /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 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 регулярно нужен вам в одном списке, он понадобится и в остальных, поэтому сделать все сразу дешевле, чем возвращаться к задаче каждый раз.