{% extends 'admin/base.html.twig' %}{% block title %}Справочники{% endblock %}{% block heading %}Источники и категории{% endblock %}{% block content %} <div class="row"> <div class="col-xl-5"> <div class="card"> <div class="card-body"> <p class="text-muted mb-1">Новый поставщик</p> <h5 class="mb-3">Источник каталога</h5> <form method="post" action="{{ path('admin_source_save') }}"> <div class="row g-3"> <div class="col-md-6"> <label class="form-label">Code</label> <input class="form-control" name="code" value="{{ empty_source.code }}" placeholder="galaxylink" /> </div> <div class="col-md-6"> <label class="form-label">Provider</label> <input class="form-control" name="provider" value="{{ empty_source.provider }}" required /> </div> <div class="col-12"> <label class="form-label">Название</label> <input class="form-control" name="name" value="{{ empty_source.name }}" required placeholder="GalaxyLink" /> </div> <div class="col-12"> <label class="form-label">Settings JSON</label> <textarea class="form-control admin-codearea" name="settings_json" rows="4">{{ empty_source.settings_json }}</textarea> </div> <div class="col-12 d-flex justify-content-between align-items-center"> <div class="form-check form-switch"> <input class="form-check-input" name="enabled" type="checkbox" value="1" id="sourceEnabled" checked /> <label class="form-check-label" for="sourceEnabled">Источник включен</label> </div> <button class="btn btn-primary" type="submit">Создать источник</button> </div> </div> </form> </div> </div> </div> <div class="col-xl-7"> <div class="card"> <div class="card-body"> <p class="text-muted mb-1">Новая группа</p> <h5 class="mb-3">Категория</h5> <form method="post" action="{{ path('admin_category_save') }}"> <div class="row g-3"> <div class="col-md-6"> <label class="form-label">Источник</label> <select class="form-select" name="source_id"> <option value="">Без источника</option> {% for source in sources %} <option value="{{ source.id }}">{{ source.name }}</option> {% endfor %} </select> </div> <div class="col-md-3"> <label class="form-label">Type</label> <input class="form-control" name="type_code" value="{{ empty_category.type_code }}" /> </div> <div class="col-md-3"> <label class="form-label">External code</label> <input class="form-control" name="external_code" value="{{ empty_category.external_code }}" placeholder="STEAM_GIFTS" /> </div> <div class="col-md-6"> <label class="form-label">Название</label> <input class="form-control" name="name" value="{{ empty_category.name }}" required placeholder="Steam Gifts" /> </div> <div class="col-md-6"> <label class="form-label">Slug</label> <input class="form-control" name="slug" value="{{ empty_category.slug }}" placeholder="создастся автоматически" /> </div> <div class="col-12"> <label class="form-label">Картинка</label> <input class="form-control" name="image_url" value="{{ empty_category.image_url }}" placeholder="https://..." /> </div> <div class="col-12"> <label class="form-label">Описание HTML</label> <textarea class="form-control admin-codearea" name="description_html" rows="3">{{ empty_category.description_html }}</textarea> </div> <div class="col-12 d-flex justify-content-between align-items-center"> <div class="form-check form-switch"> <input class="form-check-input" name="is_active" type="checkbox" value="1" id="categoryActive" checked /> <label class="form-check-label" for="categoryActive">Показывать категорию</label> </div> <button class="btn btn-primary" type="submit">Создать категорию</button> </div> </div> </form> </div> </div> </div> </div> <div class="row"> <div class="col-12"> <div class="card"> <div class="card-body"> <div class="d-flex justify-content-between align-items-center mb-3"> <div> <p class="text-muted mb-1">{{ sources|length }} записей</p> <h5 class="mb-0">Источники</h5> </div> </div> <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead> <tr> <th>ID</th> <th>Источник</th> <th>Provider</th> <th>Товары</th> <th>Синхронизация</th> <th>Статус</th> <th class="text-end">Действие</th> </tr> </thead> <tbody> {% for source in sources %} <tr> <td>{{ source.id }}</td> <td> <h6 class="mb-0">{{ source.name }}</h6> <small class="text-muted">{{ source.code }}</small> </td> <td>{{ source.provider }}</td> <td>{{ source.products_count }}</td> <td><small class="text-muted">{{ source.last_synced_at ?: 'нет' }}</small></td> <td><span class="badge {{ source.enabled ? 'bg-success-subtle text-success' : 'bg-danger-subtle text-danger' }}">{{ source.enabled ? 'включен' : 'выключен' }}</span></td> <td class="text-end"> <form class="d-inline-flex" method="post" action="{{ path('admin_source_toggle', {'id': source.id}) }}"> <button class="btn btn-sm btn-light me-1" type="submit">{{ source.enabled ? 'Отключить' : 'Включить' }}</button> </form> <details class="admin-inline-editor text-start"> <summary class="btn btn-sm bg-primary-subtle text-primary">Править</summary> <form class="admin-inline-editor-panel" method="post" action="{{ path('admin_source_save') }}"> <input type="hidden" name="id" value="{{ source.id }}" /> <div class="row g-2"> <div class="col-md-6"><label class="form-label">Code</label><input class="form-control" name="code" value="{{ source.code }}" required /></div> <div class="col-md-6"><label class="form-label">Provider</label><input class="form-control" name="provider" value="{{ source.provider }}" required /></div> <div class="col-12"><label class="form-label">Название</label><input class="form-control" name="name" value="{{ source.name }}" required /></div> <div class="col-12"><label class="form-label">Settings JSON</label><textarea class="form-control admin-codearea" name="settings_json" rows="5">{{ source.settings_json ?: '[]' }}</textarea></div> <div class="col-12 d-flex justify-content-between align-items-center"> <div class="form-check form-switch"><input class="form-check-input" name="enabled" type="checkbox" value="1" {{ source.enabled ? 'checked' : '' }} /><label class="form-check-label">Источник включен</label></div> <button class="btn btn-primary" type="submit">Сохранить</button> </div> </div> </form> </details> </td> </tr> {% else %} <tr><td colspan="7" class="text-center text-muted py-4">Источников пока нет.</td></tr> {% endfor %} </tbody> </table> </div> </div> </div> </div> </div> <div class="row"> <div class="col-12"> <div class="card"> <div class="card-body"> <div class="d-flex justify-content-between align-items-center mb-3"> <div> <p class="text-muted mb-1">{{ categories|length }} записей</p> <h5 class="mb-0">Категории</h5> </div> </div> <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead> <tr> <th>ID</th> <th>Категория</th> <th>Источник</th> <th>Код</th> <th>Товары</th> <th>Статус</th> <th class="text-end">Действие</th> </tr> </thead> <tbody> {% for category in categories %} <tr> <td>{{ category.id }}</td> <td> <h6 class="mb-0">{{ category.name }}</h6> <small class="text-muted">{{ category.slug }}</small> </td> <td>{{ category.source_name ?: 'manual' }}</td> <td><small>{{ category.type_code }} / {{ category.external_code }}</small></td> <td>{{ category.products_count }}</td> <td><span class="badge {{ category.is_active ? 'bg-success-subtle text-success' : 'bg-danger-subtle text-danger' }}">{{ category.is_active ? 'активна' : 'скрыта' }}</span></td> <td class="text-end"> <form class="d-inline-flex" method="post" action="{{ path('admin_category_toggle', {'id': category.id}) }}"> <button class="btn btn-sm btn-light me-1" type="submit">{{ category.is_active ? 'Скрыть' : 'Включить' }}</button> </form> <details class="admin-inline-editor text-start"> <summary class="btn btn-sm bg-primary-subtle text-primary">Править</summary> <form class="admin-inline-editor-panel" method="post" action="{{ path('admin_category_save') }}"> <input type="hidden" name="id" value="{{ category.id }}" /> <div class="row g-2"> <div class="col-md-6"> <label class="form-label">Источник</label> <select class="form-select" name="source_id"> <option value="">Без источника</option> {% for source in sources %} <option value="{{ source.id }}" {{ category.source_id == source.id ? 'selected' : '' }}>{{ source.name }}</option> {% endfor %} </select> </div> <div class="col-md-3"><label class="form-label">Type</label><input class="form-control" name="type_code" value="{{ category.type_code }}" /></div> <div class="col-md-3"><label class="form-label">External code</label><input class="form-control" name="external_code" value="{{ category.external_code }}" /></div> <div class="col-md-6"><label class="form-label">Название</label><input class="form-control" name="name" value="{{ category.name }}" required /></div> <div class="col-md-6"><label class="form-label">Slug</label><input class="form-control" name="slug" value="{{ category.slug }}" /></div> <div class="col-12"><label class="form-label">Картинка</label><input class="form-control" name="image_url" value="{{ category.image_url }}" /></div> <div class="col-12"><label class="form-label">Описание HTML</label><textarea class="form-control admin-codearea" name="description_html" rows="4">{{ category.description_html }}</textarea></div> <div class="col-12 d-flex justify-content-between align-items-center"> <div class="form-check form-switch"><input class="form-check-input" name="is_active" type="checkbox" value="1" {{ category.is_active ? 'checked' : '' }} /><label class="form-check-label">Показывать категорию</label></div> <button class="btn btn-primary" type="submit">Сохранить</button> </div> </div> </form> </details> </td> </tr> {% else %} <tr><td colspan="7" class="text-center text-muted py-4">Категорий пока нет.</td></tr> {% endfor %} </tbody> </table> </div> </div> </div> </div> </div>{% endblock %}