templates/admin/references.html.twig line 1

Open in your IDE?
  1. {% extends 'admin/base.html.twig' %}
  2. {% block title %}Справочники{% endblock %}
  3. {% block heading %}Источники и категории{% endblock %}
  4. {% block content %}
  5.   <div class="row">
  6.     <div class="col-xl-5">
  7.       <div class="card">
  8.         <div class="card-body">
  9.           <p class="text-muted mb-1">Новый поставщик</p>
  10.           <h5 class="mb-3">Источник каталога</h5>
  11.           <form method="post" action="{{ path('admin_source_save') }}">
  12.             <div class="row g-3">
  13.               <div class="col-md-6">
  14.                 <label class="form-label">Code</label>
  15.                 <input class="form-control" name="code" value="{{ empty_source.code }}" placeholder="galaxylink" />
  16.               </div>
  17.               <div class="col-md-6">
  18.                 <label class="form-label">Provider</label>
  19.                 <input class="form-control" name="provider" value="{{ empty_source.provider }}" required />
  20.               </div>
  21.               <div class="col-12">
  22.                 <label class="form-label">Название</label>
  23.                 <input class="form-control" name="name" value="{{ empty_source.name }}" required placeholder="GalaxyLink" />
  24.               </div>
  25.               <div class="col-12">
  26.                 <label class="form-label">Settings JSON</label>
  27.                 <textarea class="form-control admin-codearea" name="settings_json" rows="4">{{ empty_source.settings_json }}</textarea>
  28.               </div>
  29.               <div class="col-12 d-flex justify-content-between align-items-center">
  30.                 <div class="form-check form-switch">
  31.                   <input class="form-check-input" name="enabled" type="checkbox" value="1" id="sourceEnabled" checked />
  32.                   <label class="form-check-label" for="sourceEnabled">Источник включен</label>
  33.                 </div>
  34.                 <button class="btn btn-primary" type="submit">Создать источник</button>
  35.               </div>
  36.             </div>
  37.           </form>
  38.         </div>
  39.       </div>
  40.     </div>
  41.     <div class="col-xl-7">
  42.       <div class="card">
  43.         <div class="card-body">
  44.           <p class="text-muted mb-1">Новая группа</p>
  45.           <h5 class="mb-3">Категория</h5>
  46.           <form method="post" action="{{ path('admin_category_save') }}">
  47.             <div class="row g-3">
  48.               <div class="col-md-6">
  49.                 <label class="form-label">Источник</label>
  50.                 <select class="form-select" name="source_id">
  51.                   <option value="">Без источника</option>
  52.                   {% for source in sources %}
  53.                     <option value="{{ source.id }}">{{ source.name }}</option>
  54.                   {% endfor %}
  55.                 </select>
  56.               </div>
  57.               <div class="col-md-3">
  58.                 <label class="form-label">Type</label>
  59.                 <input class="form-control" name="type_code" value="{{ empty_category.type_code }}" />
  60.               </div>
  61.               <div class="col-md-3">
  62.                 <label class="form-label">External code</label>
  63.                 <input class="form-control" name="external_code" value="{{ empty_category.external_code }}" placeholder="STEAM_GIFTS" />
  64.               </div>
  65.               <div class="col-md-6">
  66.                 <label class="form-label">Название</label>
  67.                 <input class="form-control" name="name" value="{{ empty_category.name }}" required placeholder="Steam Gifts" />
  68.               </div>
  69.               <div class="col-md-6">
  70.                 <label class="form-label">Slug</label>
  71.                 <input class="form-control" name="slug" value="{{ empty_category.slug }}" placeholder="создастся автоматически" />
  72.               </div>
  73.               <div class="col-12">
  74.                 <label class="form-label">Картинка</label>
  75.                 <input class="form-control" name="image_url" value="{{ empty_category.image_url }}" placeholder="https://..." />
  76.               </div>
  77.               <div class="col-12">
  78.                 <label class="form-label">Описание HTML</label>
  79.                 <textarea class="form-control admin-codearea" name="description_html" rows="3">{{ empty_category.description_html }}</textarea>
  80.               </div>
  81.               <div class="col-12 d-flex justify-content-between align-items-center">
  82.                 <div class="form-check form-switch">
  83.                   <input class="form-check-input" name="is_active" type="checkbox" value="1" id="categoryActive" checked />
  84.                   <label class="form-check-label" for="categoryActive">Показывать категорию</label>
  85.                 </div>
  86.                 <button class="btn btn-primary" type="submit">Создать категорию</button>
  87.               </div>
  88.             </div>
  89.           </form>
  90.         </div>
  91.       </div>
  92.     </div>
  93.   </div>
  94.   <div class="row">
  95.     <div class="col-12">
  96.       <div class="card">
  97.         <div class="card-body">
  98.           <div class="d-flex justify-content-between align-items-center mb-3">
  99.             <div>
  100.               <p class="text-muted mb-1">{{ sources|length }} записей</p>
  101.               <h5 class="mb-0">Источники</h5>
  102.             </div>
  103.           </div>
  104.           <div class="table-responsive">
  105.             <table class="table table-hover align-middle mb-0">
  106.               <thead>
  107.                 <tr>
  108.                   <th>ID</th>
  109.                   <th>Источник</th>
  110.                   <th>Provider</th>
  111.                   <th>Товары</th>
  112.                   <th>Синхронизация</th>
  113.                   <th>Статус</th>
  114.                   <th class="text-end">Действие</th>
  115.                 </tr>
  116.               </thead>
  117.               <tbody>
  118.                 {% for source in sources %}
  119.                   <tr>
  120.                     <td>{{ source.id }}</td>
  121.                     <td>
  122.                       <h6 class="mb-0">{{ source.name }}</h6>
  123.                       <small class="text-muted">{{ source.code }}</small>
  124.                     </td>
  125.                     <td>{{ source.provider }}</td>
  126.                     <td>{{ source.products_count }}</td>
  127.                     <td><small class="text-muted">{{ source.last_synced_at ?: 'нет' }}</small></td>
  128.                     <td><span class="badge {{ source.enabled ? 'bg-success-subtle text-success' : 'bg-danger-subtle text-danger' }}">{{ source.enabled ? 'включен' : 'выключен' }}</span></td>
  129.                     <td class="text-end">
  130.                       <form class="d-inline-flex" method="post" action="{{ path('admin_source_toggle', {'id': source.id}) }}">
  131.                         <button class="btn btn-sm btn-light me-1" type="submit">{{ source.enabled ? 'Отключить' : 'Включить' }}</button>
  132.                       </form>
  133.                       <details class="admin-inline-editor text-start">
  134.                         <summary class="btn btn-sm bg-primary-subtle text-primary">Править</summary>
  135.                         <form class="admin-inline-editor-panel" method="post" action="{{ path('admin_source_save') }}">
  136.                           <input type="hidden" name="id" value="{{ source.id }}" />
  137.                           <div class="row g-2">
  138.                             <div class="col-md-6"><label class="form-label">Code</label><input class="form-control" name="code" value="{{ source.code }}" required /></div>
  139.                             <div class="col-md-6"><label class="form-label">Provider</label><input class="form-control" name="provider" value="{{ source.provider }}" required /></div>
  140.                             <div class="col-12"><label class="form-label">Название</label><input class="form-control" name="name" value="{{ source.name }}" required /></div>
  141.                             <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>
  142.                             <div class="col-12 d-flex justify-content-between align-items-center">
  143.                               <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>
  144.                               <button class="btn btn-primary" type="submit">Сохранить</button>
  145.                             </div>
  146.                           </div>
  147.                         </form>
  148.                       </details>
  149.                     </td>
  150.                   </tr>
  151.                 {% else %}
  152.                   <tr><td colspan="7" class="text-center text-muted py-4">Источников пока нет.</td></tr>
  153.                 {% endfor %}
  154.               </tbody>
  155.             </table>
  156.           </div>
  157.         </div>
  158.       </div>
  159.     </div>
  160.   </div>
  161.   <div class="row">
  162.     <div class="col-12">
  163.       <div class="card">
  164.         <div class="card-body">
  165.           <div class="d-flex justify-content-between align-items-center mb-3">
  166.             <div>
  167.               <p class="text-muted mb-1">{{ categories|length }} записей</p>
  168.               <h5 class="mb-0">Категории</h5>
  169.             </div>
  170.           </div>
  171.           <div class="table-responsive">
  172.             <table class="table table-hover align-middle mb-0">
  173.               <thead>
  174.                 <tr>
  175.                   <th>ID</th>
  176.                   <th>Категория</th>
  177.                   <th>Источник</th>
  178.                   <th>Код</th>
  179.                   <th>Товары</th>
  180.                   <th>Статус</th>
  181.                   <th class="text-end">Действие</th>
  182.                 </tr>
  183.               </thead>
  184.               <tbody>
  185.                 {% for category in categories %}
  186.                   <tr>
  187.                     <td>{{ category.id }}</td>
  188.                     <td>
  189.                       <h6 class="mb-0">{{ category.name }}</h6>
  190.                       <small class="text-muted">{{ category.slug }}</small>
  191.                     </td>
  192.                     <td>{{ category.source_name ?: 'manual' }}</td>
  193.                     <td><small>{{ category.type_code }} / {{ category.external_code }}</small></td>
  194.                     <td>{{ category.products_count }}</td>
  195.                     <td><span class="badge {{ category.is_active ? 'bg-success-subtle text-success' : 'bg-danger-subtle text-danger' }}">{{ category.is_active ? 'активна' : 'скрыта' }}</span></td>
  196.                     <td class="text-end">
  197.                       <form class="d-inline-flex" method="post" action="{{ path('admin_category_toggle', {'id': category.id}) }}">
  198.                         <button class="btn btn-sm btn-light me-1" type="submit">{{ category.is_active ? 'Скрыть' : 'Включить' }}</button>
  199.                       </form>
  200.                       <details class="admin-inline-editor text-start">
  201.                         <summary class="btn btn-sm bg-primary-subtle text-primary">Править</summary>
  202.                         <form class="admin-inline-editor-panel" method="post" action="{{ path('admin_category_save') }}">
  203.                           <input type="hidden" name="id" value="{{ category.id }}" />
  204.                           <div class="row g-2">
  205.                             <div class="col-md-6">
  206.                               <label class="form-label">Источник</label>
  207.                               <select class="form-select" name="source_id">
  208.                                 <option value="">Без источника</option>
  209.                                 {% for source in sources %}
  210.                                   <option value="{{ source.id }}" {{ category.source_id == source.id ? 'selected' : '' }}>{{ source.name }}</option>
  211.                                 {% endfor %}
  212.                               </select>
  213.                             </div>
  214.                             <div class="col-md-3"><label class="form-label">Type</label><input class="form-control" name="type_code" value="{{ category.type_code }}" /></div>
  215.                             <div class="col-md-3"><label class="form-label">External code</label><input class="form-control" name="external_code" value="{{ category.external_code }}" /></div>
  216.                             <div class="col-md-6"><label class="form-label">Название</label><input class="form-control" name="name" value="{{ category.name }}" required /></div>
  217.                             <div class="col-md-6"><label class="form-label">Slug</label><input class="form-control" name="slug" value="{{ category.slug }}" /></div>
  218.                             <div class="col-12"><label class="form-label">Картинка</label><input class="form-control" name="image_url" value="{{ category.image_url }}" /></div>
  219.                             <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>
  220.                             <div class="col-12 d-flex justify-content-between align-items-center">
  221.                               <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>
  222.                               <button class="btn btn-primary" type="submit">Сохранить</button>
  223.                             </div>
  224.                           </div>
  225.                         </form>
  226.                       </details>
  227.                     </td>
  228.                   </tr>
  229.                 {% else %}
  230.                   <tr><td colspan="7" class="text-center text-muted py-4">Категорий пока нет.</td></tr>
  231.                 {% endfor %}
  232.               </tbody>
  233.             </table>
  234.           </div>
  235.         </div>
  236.       </div>
  237.     </div>
  238.   </div>
  239. {% endblock %}