Тестовая статья
Описание статьи
# Задача: Добавление функциональности блога
## Цель
Создать структуру маршрутов и страниц для блога с разделами и статьями. Блог должен поддерживать:
- Главную страницу блога со списком разделов и всех статей в виде карточек-ссылок
- Страницы разделов блога со списком статей (с пагинацией)
- Страницы отдельных статей с блоком "Смотрите также"
- Правильное отображение вложенности в хлебных крошках
- Отображение даты публикации (если доступна)
## Приоритет: Средний
---
## Текущее состояние
### Существующие маршруты:
- `/product/[productId]` - страница товара по slug
- `/catalog` - главная страница каталога
- `/catalog/[razdelName]` - категории/подкатегории каталога
- `/services/[serviceName]` - услуги по slug
### Существующие API endpoints:
- `/api/blog-sections` - получение разделов блога
- `/api/blogs` - получение списка статей (с фильтрацией по `sectionSlug`)
- `/api/blogs/[slug]` - получение статьи по slug
---
## Изменение существующих маршрутов
### Проверка и обновление маршрута каталога
**Текущее состояние:**
- `/catalog` - главная страница каталога
- `/catalog/[razdelName]` - категории/подкатегории каталога (один параметр)
**Проблема:**
Текущая структура `/catalog/[razdelName]` поддерживает только один уровень вложенности. Если в каталоге есть категории и подкатегории, и нужно показывать полный путь в хлебных крошках (например: `/catalog/category/subcategory`), требуется изменить структуру маршрута.
**Решение:**
**Вариант 1: Optional Catch-all (рекомендуется)**
Использовать `[[...slug]]` для поддержки как главной страницы, так и вложенных категорий:
```
frontend/src/app/catalog/
├── page.tsx # Главная страница каталога (уже существует)
├── [[...slug]]/ # Вложенные категории/подкатегории
│ └── page.tsx # Переместить логику из [razdelName]/page.tsx
```
**Изменения:**
- Переименовать папку `[razdelName]` → `[[...slug]]`
- Обновить обработку параметров: `params.slug` будет массивом `string[] | undefined`
- Обновить логику получения категории по пути из массива slug
- Обновить хлебные крошки для отображения полного пути
**Пример обработки:**
```typescript
type Params = Promise<{ slug?: string[] }>;
export default async function CatalogPage({ params }: { params: Params }) {
const { slug } = await params;
// Если slug пустой или undefined - показать главную страницу каталога
if (!slug || slug.length === 0) {
// Логика главной страницы
}
// Если есть slug - обработать вложенность
// slug[0] - первая категория
// slug[1] - подкатегория (если есть)
// и т.д.
}
```
**Вариант 2: Catch-all (если главная страница не нужна в этой структуре)**
Использовать `[...slug]` если главная страница `/catalog` обрабатывается отдельно:
```
frontend/src/app/catalog/
├── page.tsx # Главная страница каталога
└── [...slug]/ # Вложенные категории/подкатегории