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');