Главная/Статьи/OpenCart: отображение ID категорий в админке

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

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

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

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

Задача

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

Решение

Модифицируем шаблон списка категорий, добавив колонку 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.

Результат

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

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

Итоги

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

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

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

💡 Совет

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

🚀

Хотите такое же решение?

Настрою окружение под ваш проект, учту специфику инфраструктуры и обучу команду.

Обсудить проект →
Бесплатная консультация · Ответ в течение дня

Комментарии

Система комментариев скоро будет подключена. А пока вы можете написать мне в Telegram или на email.