праогшгншн
get('/', 'Home::index');
$routes->get('/search', 'Home::search');
// API routes для категорий
$routes->group('api', ['namespace' => 'App\Controllers\Api'], function($routes) {
$routes->get('categories/(:num)/children', 'CategoryController::getChildren/$1');
$routes->get('categories/current/(:num)/children', 'CategoryController::getCurrentCategoryChildren/$1');
$routes->get('categories/(:num)/context', 'CategoryController::getCategoryContext/$1');
$routes->get('categories/search', 'CategoryController::search');
$routes->get('categories/(:num)/info', 'CategoryController::getCategoryInfo/$1');
$routes->get('categories/(:num)/breadcrumbs', 'CategoryController::getBreadcrumbs/$1');
$routes->get('categories/popular', 'CategoryController::getPopular');
$routes->get('categories/navigation/(:num)', 'CategoryController::getNavigationTree/$1');
$routes->get('categories/navigation', 'CategoryController::getNavigationTree');
$routes->get('categories/clear-cache/(:num)', 'CategoryController::clearCache/$1');
$routes->get('categories/clear-cache', 'CategoryController::clearCache');
// API для SEO фильтров (добавлено из второго маршрута)
$routes->get('seo-filters/build-url', 'SeoFilterController::buildUrl');
$routes->get('seo-filters/parse-url', 'SeoFilterController::parseUrl');
$routes->get('seo-filters/add-filter', 'SeoFilterController::addFilter');
$routes->get('seo-filters/remove-filter', 'SeoFilterController::removeFilter');
});
// API для характеристик (публичный доступ)
$routes->get('api/attributes/(:num)', 'Dashboard::apiGetAttributes/$1');
$routes->get('dashboard/api/get-categories/(:num)', 'Dashboard::apiGetCategories/$1');
$routes->get('dashboard/api/get-categories', 'Dashboard::apiGetCategories');
$routes->get('dashboard/api/get-category-path/(:num)', 'Dashboard::apiGetCategoryPath/$1');
// Блог (публичная часть) - перенесено в Home
$routes->group('blog', static function ($routes) {
$routes->get('/', 'Home::blog');
$routes->get('category/(:any)', 'Home::blogCategory/$1');
$routes->get('post/(:any)', 'Home::blogPost/$1');
$routes->get('archive', 'Home::blogArchive');
});
// Статические страницы
$routes->group('pages', static function ($routes) {
$routes->get('/', 'Page::index');
$routes->get('(:any)', 'Page::view/$1');
});
// Публичные страницы (быстрый доступ)
$routes->get('/rules', 'Pages::rules');
$routes->get('/about', 'Pages::about');
$routes->get('/contact', 'Pages::contact');
$routes->post('/contact/send', 'Pages::sendContact');
// Публичные объявления - ВАЖНО: эти маршруты должны быть ВЫШЕ SEO фильтров
$routes->get('/ads', 'Home::ads');
$routes->get('/ads/view/(:segment)', 'Home::view/$1');
// ============================================
// SEO ФИЛЬТРЫ ДЛЯ КАТЕГОРИЙ (ОБНОВЛЕНО)
// ============================================
// Редирект с GET параметров на SEO URL (исправлено название)
$routes->get('category/filter', 'Home::redirectToSeoFilter');
// Альтернативный маршрут для совместимости (из второго файла)
$routes->get('redirect-to-seo', 'Home::redirectToSeoFilter');
// SEO фильтры для категорий (гибкая система) - взяты из второго маршрута
// Важно: эти маршруты должны идти ПЕРЕД универсальным маршрутом
// 1 уровень: /category/filter/attribute1/value1
$routes->get('(:segment)/filter/(:any)/(:any)', 'Home::viewCategory/$1');
// 2 уровня: /category/filter/attribute1/value1/attribute2/value2
$routes->get('(:segment)/filter/(:any)/(:any)/(:any)/(:any)', 'Home::viewCategory/$1');
// 3 уровня: /category/filter/attribute1/value1/attribute2/value2/attribute3/value3
$routes->get('(:segment)/filter/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)', 'Home::viewCategory/$1');
// 4 уровня: /category/filter/attribute1/value1/attribute2/value2/attribute3/value3/attribute4/value4
$routes->get('(:segment)/filter/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)', 'Home::viewCategory/$1');
// 5 уровней: /category/filter/attribute1/value1/.../attribute5/value5
$routes->get('(:segment)/filter/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)', 'Home::viewCategory/$1');
// 6 уровней: /category/filter/attribute1/value1/.../attribute6/value6
$routes->get('(:segment)/filter/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)', 'Home::viewCategory/$1');
// 7 уровней: /category/filter/attribute1/value1/.../attribute7/value7
$routes->get('(:segment)/filter/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)', 'Home::viewCategory/$1');
// 8 уровней: /category/filter/attribute1/value1/.../attribute8/value8
$routes->get('(:segment)/filter/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)', 'Home::viewCategory/$1');
// 9 уровней: /category/filter/attribute1/value1/.../attribute9/value9
$routes->get('(:segment)/filter/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)', 'Home::viewCategory/$1');
// 10 уровней: /category/filter/attribute1/value1/.../attribute10/value10
$routes->get('(:segment)/filter/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)/(:any)', 'Home::viewCategory/$1');
// Аутентификация (публичная часть)
$routes->group('auth', static function ($routes) {
$routes->get('register', 'Auth::register');
$routes->post('register', 'Auth::processRegister');
$routes->get('login', 'Auth::login');
$routes->post('login', 'Auth::processLogin');
$routes->get('logout', 'Auth::logout', ['filter' => 'auth']);
});
// ============================================
// ГРУППЫ ЗАЩИЩЕННЫХ МАРШРУТОВ (с фильтрами)
// ============================================
// Личный кабинет пользователя (требует авторизации)
$routes->group('dashboard', ['filter' => 'auth'], static function ($routes) {
$routes->get('/', 'Dashboard::index');
// Управление профилем
$routes->get('profile', 'Dashboard::profile');
$routes->post('profile/update', 'Dashboard::updateProfile');
// Импорт объявлений
$routes->get('ads/import', 'Import::importAds');
$routes->post('ads/import/process', 'Import::processImport');
$routes->get('ads/import/results', 'Import::importResults');
$routes->get('ads/import/template', 'Import::downloadTemplate');
$routes->get('ads/import/template/extended', 'Import::downloadExtendedTemplate');
$routes->get('ads/import/drafts', 'Import::importDrafts');
// Управление объявлениями - ИСПРАВЛЕННЫЕ МАРШРУТЫ
$routes->group('ads', static function ($routes) {
$routes->get('/', 'Dashboard::ads');
$routes->get('(:num)', 'Dashboard::ads/$1');
// Создание объявления в 4 шага
$routes->get('create/step1', 'Dashboard::createStep1');
$routes->post('create/step1/post', 'Dashboard::createStep1Post');
// Шаг 2: Фотографии
$routes->get('create/step2/(:num)', 'Dashboard::createStep2Photos/$1');
$routes->post('create/step2/(:num)/photos', 'Dashboard::createStep2PhotosPost/$1');
// AJAX для управления фото на шаге 2
$routes->post('create/step2/(:num)/delete-image/(:num)', 'Dashboard::deleteImageStep2/$1/$2');
$routes->post('create/step2/(:num)/set-main/(:num)', 'Dashboard::setMainImage/$1/$2');
// Шаг 3: Характеристики и контакты (старый шаг 2) - ИСПРАВЛЕНО
$routes->get('create/step3/(:num)', 'Dashboard::createStep3/$1');
$routes->post('create/step3/post/(:num)', 'Dashboard::createStep3Post/$1'); // ИЗМЕНЕНО: добавлен /post
// Шаг 4: Период размещения (старый шаг 3) - ИСПРАВЛЕНО
$routes->get('create/step4/(:num)', 'Dashboard::createStep4/$1');
$routes->post('create/step4/post/(:num)', 'Dashboard::createStep4Post/$1'); // ИЗМЕНЕНО: добавлен /post
// Редактирование объявления в 4 шага - ИСПРАВЛЕННЫЕ МАРШРУТЫ
// Шаг 1
$routes->get('edit/step1/(:num)', 'Dashboard::editStep1/$1');
$routes->post('edit/step1-post/(:num)', 'Dashboard::editStep1Post/$1');
// Шаг 2
$routes->get('edit/step2/(:num)', 'Dashboard::editStep2/$1');
$routes->post('edit/step2-post/(:num)', 'Dashboard::editStep2Post/$1');
// Шаг 3
$routes->get('edit/step3/(:num)', 'Dashboard::editStep3/$1');
$routes->post('edit/step3-post/(:num)', 'Dashboard::editStep3Post/$1');
// Шаг 4
$routes->get('edit/step4/(:num)', 'Dashboard::editStep4/$1');
$routes->post('edit/step4-post/(:num)', 'Dashboard::editStep4Post/$1');
// Другие действия с объявлениями
$routes->get('delete/(:num)', 'Dashboard::deleteAd/$1'); // GET - показывает форму подтверждения
$routes->post('delete/(:num)', 'Dashboard::deleteAd/$1'); // POST - обрабатывает удаление
$routes->delete('delete/(:num)', 'Dashboard::deleteAd/$1'); // DELETE - для AJAX
$routes->post('delete-image/(:num)/(:num)', 'Dashboard::deleteImage/$1/$2');
$routes->match(['get', 'post'], 'change-status/(:num)', 'Dashboard::changeAdStatus/$1');
});
// Управление сообщениями
$routes->group('messages', static function ($routes) {
$routes->get('/', 'Dashboard::messages');
$routes->get('(:num)', 'Dashboard::messages/$1'); // Пагинация через сегмент URL
$routes->post('send', 'Dashboard::sendMessage');
$routes->get('conversation/(:num)', 'Dashboard::viewConversation/$1');
$routes->post('delete/(:num)', 'Dashboard::deleteMessage/$1');
$routes->get('unread-count', 'Dashboard::getUnreadCount');
});
});
// Админка (требует прав администратора)
$routes->group('admin', ['filter' => 'admin'], static function ($routes) {
$routes->get('/', 'Admin::index');
$routes->get('settings', 'AdminSettings::index');
$routes->post('settings/save', 'AdminSettings::save');
// Управление объявлениями в админке
$routes->group('ads', static function ($routes) {
$routes->get('/', 'AdminAds::index');
$routes->get('edit/(:num)', 'AdminAds::edit/$1');
$routes->post('update/(:num)', 'AdminAds::update/$1');
$routes->get('approve/(:num)', 'AdminAds::approve/$1');
$routes->get('reject/(:num)', 'AdminAds::reject/$1');
$routes->get('delete/(:num)', 'AdminAds::delete/$1');
$routes->post('delete-image/(:num)/(:num)', 'AdminAds::deleteImage/$1/$2');
// Управление характеристиками (добавленные маршруты)
$routes->get('attributes', 'AdminAds::attributes');
$routes->get('attributes/create', 'AdminAds::createAttribute');
$routes->post('attributes/create-post', 'AdminAds::createAttributePost');
$routes->get('attributes/edit/(:num)', 'AdminAds::editAttribute/$1');
$routes->post('attributes/edit-post/(:num)', 'AdminAds::editAttributePost/$1');
$routes->get('attributes/delete/(:num)', 'AdminAds::deleteAttribute/$1');
$routes->get('attribute-values/(:num)', 'AdminAds::attributeValues/$1');
$routes->get('attribute-values/(:num)/create', 'AdminAds::createAttributeValue/$1');
$routes->post('attribute-values/(:num)/create-post', 'AdminAds::createAttributeValuePost/$1');
$routes->get('attribute-values/(:num)/edit/(:num)', 'AdminAds::editAttributeValue/$1/$2');
$routes->post('attribute-values/(:num)/edit-post/(:num)', 'AdminAds::editAttributeValuePost/$1/$2');
$routes->get('attribute-values/(:num)/delete/(:num)', 'AdminAds::deleteAttributeValue/$1/$2');
$routes->get('category-attributes', 'AdminAds::categoryAttributesList');
$routes->get('category-attributes-list', 'AdminAds::categoryAttributesList');
$routes->get('category-attributes/(:num)', 'AdminAds::categoryAttributes/$1');
$routes->post('category-attributes-post/(:num)', 'AdminAds::categoryAttributesPost/$1');
$routes->post('ads/category-attributes-post/(:num)', 'AdminAds::categoryAttributesPost/$1');
$routes->post('ads/quick-assign-attributes/(:num)', 'AdminAds::quickAssignAttributes/$1');
});
// Управление пользователями в админке
$routes->group('users', static function ($routes) {
$routes->get('/', 'Admin::users');
$routes->get('edit/(:num)', 'AdminUser::edit/$1');
$routes->post('update/(:num)', 'AdminUser::update/$1');
$routes->get('delete/(:num)', 'AdminUser::delete/$1');
$routes->match(['get', 'post'], 'send-message/(:num)', 'AdminUser::sendMessage/$1');
$routes->get('ban/(:num)', 'Admin::banUser/$1');
$routes->get('unban/(:num)', 'Admin::unbanUser/$1');
});
// Управление категориями в админке
$routes->group('categories', static function ($routes) {
$routes->get('/', 'AdminCategories::index');
$routes->get('create', 'AdminCategories::create');
$routes->post('store', 'AdminCategories::store');
$routes->get('edit/(:num)', 'AdminCategories::edit/$1');
$routes->post('update/(:num)', 'AdminCategories::update/$1');
$routes->post('delete/(:num)', 'AdminCategories::delete/$1');
$routes->get('search-ajax', 'AdminCategories::searchAjax');
$routes->get('export', 'AdminCategories::export');
});
// Управление страницами в админке
$routes->group('pages', static function ($routes) {
$routes->get('/', 'AdminPages::index');
$routes->get('create', 'AdminPages::create');
$routes->post('store', 'AdminPages::store');
$routes->get('edit/(:num)', 'AdminPages::edit/$1');
$routes->post('update/(:num)', 'AdminPages::update/$1');
$routes->post('delete/(:num)', 'AdminPages::delete/$1');
});
// Управление блогом в админке
$routes->group('blog', static function ($routes) {
// Категории блога
$routes->group('categories', static function ($routes) {
$routes->get('/', 'AdminBlog::index_categories');
$routes->get('create', 'AdminBlog::create_category');
$routes->post('store', 'AdminBlog::store_category');
$routes->get('edit/(:num)', 'AdminBlog::edit_category/$1');
$routes->put('update/(:num)', 'AdminBlog::update_category/$1');
$routes->delete('delete/(:num)', 'AdminBlog::delete_category/$1');
});
// Посты блога
$routes->group('posts', static function ($routes) {
$routes->get('/', 'AdminBlog::index_posts');
$routes->get('create', 'AdminBlog::create_post');
$routes->post('store', 'AdminBlog::store_post');
$routes->get('edit/(:num)', 'AdminBlog::edit_post/$1');
$routes->put('update/(:num)', 'AdminBlog::update_post/$1');
$routes->delete('delete/(:num)', 'AdminBlog::delete_post/$1');
});
});
// ============================================
// ДОБАВЛЕННЫЕ АДМИН-МАРШРУТЫ ДЛЯ МИГРАЦИИ ИЗОБРАЖЕНИЙ
// ============================================
// Миграция изображений на 4-уровневую структуру
$routes->group('images', static function ($routes) {
$routes->match(['get', 'post'], 'migrate', 'Dashboard::migrateImages');
$routes->get('stats', 'Dashboard::imageStats');
$routes->match(['get', 'post'], 'cleanup-directories', 'Dashboard::cleanupDirectories');
});
// Для удобства также можно добавить прямой доступ
$routes->match(['get', 'post'], 'migrate-images', 'Dashboard::migrateImages');
$routes->get('image-stats', 'Dashboard::imageStats');
$routes->match(['get', 'post'], 'cleanup-directories', 'Dashboard::cleanupDirectories');
});
// ============================================
// СПЕЦИАЛЬНЫЕ МАРШРУТЫ
// ============================================
// ============================================
// УНИВЕРСАЛЬНЫЕ МАРШРУТЫ
// ============================================
// Создание объявлений (прямой доступ - для совместимости)
$routes->get('/ads/create', 'Dashboard::create', ['filter' => 'auth']);
$routes->post('/ads/store', 'Dashboard::store', ['filter' => 'auth']);
// ============================================
// ОБРАБОТКА ОШИБОК
// ============================================
$routes->set404Override(function() {
return view('errors/html/error_404');
});
// ============================================
// УНИВЕРСАЛЬНЫЙ МАРШРУТ (САМЫЙ ПОСЛЕДНИЙ!)
// ============================================
// Универсальный маршрут для slug (объявления, категории)
// ДОЛЖЕН БЫТЬ ПОСЛЕДНИМ В ФАЙЛЕ!
// ИСПРАВЛЕНО: убрана проблема с просмотром объявлений
$routes->get('([a-zA-Z0-9_-]+)', 'Home::viewBySlug/$1');