# DataTable Components Переиспользуемые компоненты для отображения интерактивных таблиц с AJAX-загрузкой, сортировкой и поиском. ## Структура компонентов ``` public/ ├── js/ │ └── modules/ │ └── DataTable.js # JS-модуль для инициализации таблиц └── css/ └── components/ └── data-table.css # Стили для интерактивных таблиц app/Views/components/table/ ├── table.twig # Основной компонент таблицы ├── table_header.twig # Переиспользуемый заголовок └── pagination.twig # Компонент пагинации ``` ## Быстрый старт ### 1. Подключение стилей и скриптов В вашем шаблоне добавьте: ```twig {% block stylesheets %} {{ parent() }} {% endblock %} {% block scripts %} {{ parent() }} {% endblock %} ``` ### 2. Использование компонента таблицы ```twig {{ include('@components/table/table.twig', { id: 'products-table', url: '/products/table', perPage: 25, sort: sort|default(''), order: order|default('asc'), filters: filters|default({}), columns: [ { name: 'name', label: 'Название', width: '35%' }, { name: 'sku', label: 'Артикул', width: '15%' }, { name: 'price', label: 'Цена', width: '15%' }, { name: 'stock', label: 'Остаток', width: '15%' } ], actions: { label: 'Действия', width: '20%' }, emptyMessage: 'Товары не найдены' }) }} ``` ## Конфигурация столбцов Каждый столбец поддерживает следующие параметры: | Параметр | Тип | Описание | |----------|-----|----------| | `name` | string | Идентификатор столбца (используется для сортировки и фильтрации) | | `label` | string | Отображаемое название столбца | | `width` | string | Ширина столбца (например, '35%', '200px') | | `placeholder` | string | Текст-подсказка в поле поиска | | `searchTitle` | string | Title для иконки поиска | | `align` | string | CSS-класс выравнивания | ## Конфигурация пагинации Компонент автоматически получает данные из объекта `pager`: ```php // В контроллере $pagination = [ 'currentPage' => $pager->getCurrentPage(), 'totalPages' => $pager->getPageCount(), 'totalRecords' => $pager->getTotal(), 'perPage' => $perPage, 'from' => (($pager->getCurrentPage() - 1) * $perPage + 1), 'to' => min($pager->getCurrentPage() * $perPage, $pager->getTotal()) ]; ``` ## Пример контроллера ```php public function table() { $page = (int) ($this->request->getGet('page') ?? 1); $perPage = (int) ($this->request->getGet('perPage') ?? 10); $sort = $this->request->getGet('sort') ?? ''; $order = $this->request->getGet('order') ?? 'asc'; // Фильтры $filters = [ 'name' => $this->request->getGet('filters[name]') ?? '', ]; // Построение запроса $builder = $this->model->builder(); // Применяем фильтры if (!empty($filters['name'])) { $builder->like('name', $filters['name']); } // Сортировка if (!empty($sort)) { $builder->orderBy($sort, $order); } // Пагинация $items = $builder->paginate($perPage, 'default', $page); $data = [ 'items' => $items, 'pager' => $this->model->pager, 'perPage' => $perPage, 'sort' => $sort, 'order' => $order, 'filters' => $filters, ]; return $this->renderTwig('path/to/your/_table', $data); } ``` ## AJAX-ответ Для AJAX-запросов контроллер должен возвращать только `tbody` и `tfoot`: ```twig {# _table.twig для модуля #} {% set isAjax = app.request.headers.get('X-Requested-With') == 'XMLHttpRequest' %} {% if isAjax %} {# AJAX: только tbody #}
{% for item in items %}