Changes
This commit is contained in:
@@ -105,8 +105,7 @@ class ClientEventController extends Controller
|
||||
->orderBy('event_date_start')
|
||||
->get();
|
||||
|
||||
// Извлекаем уникальные даты из событий
|
||||
return $events->map(function ($event) {
|
||||
$mappingDates = $events->map(function ($event) {
|
||||
$date = new DateTime($event->event_date_start);
|
||||
return [
|
||||
'day' => $date->format('j'),
|
||||
@@ -119,10 +118,15 @@ class ClientEventController extends Controller
|
||||
})
|
||||
->map(function ($group, $month) {
|
||||
return [
|
||||
'month' => $this->getMonthNameRussian((int)$month),
|
||||
'events' => $group->toArray()
|
||||
"month" => $this->getMonthNameRussian((int)$month),
|
||||
"events" => $group->toArray()
|
||||
];
|
||||
});
|
||||
})
|
||||
->sortKeys() // Сортируем ключи по возрастанию
|
||||
->values(); // Получаем массив без ключей
|
||||
|
||||
// Извлекаем уникальные даты из событий
|
||||
return $mappingDates;
|
||||
}
|
||||
|
||||
private function getFilters(): array
|
||||
|
||||
@@ -52,7 +52,8 @@ class ClientPostController extends Controller
|
||||
$slugsArray = explode(',', $slugs);
|
||||
return $query->withAnyTags($slugsArray);
|
||||
})
|
||||
->orderBy('id', request()->input('sort', 'desc'))
|
||||
->orderBy('publish_at', request()->input('sort', 'desc'))
|
||||
|
||||
->paginate(6)
|
||||
->withQueryString());
|
||||
|
||||
@@ -100,7 +101,8 @@ class ClientPostController extends Controller
|
||||
|
||||
return Inertia::render('Client/Posts/Index', compact('filters', 'posts', 'categories', 'tags'));
|
||||
}
|
||||
public function show($slug)
|
||||
|
||||
public function show(Request $request, $slug)
|
||||
{
|
||||
$post = new PostResource(Post::where('slug', $slug)->firstOrFail());
|
||||
return Inertia::render('Client/Posts/Show', compact('post'));
|
||||
|
||||
@@ -19,16 +19,13 @@ class ClientScheduleController extends Controller
|
||||
if (request()->filled('search')) {
|
||||
$educationalGroups = ClientEducationalGroupResource::collection(EducationalGroup::query()
|
||||
->has('schedules')
|
||||
->whereHas('schedules', function ($q) {
|
||||
$q->when(request()->input('search'), function ($query, $search) {
|
||||
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
|
||||
});
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
|
||||
})
|
||||
->with('schedules')
|
||||
->orderBy('title')
|
||||
->get());
|
||||
}
|
||||
|
||||
$searchRequest = request()->input('search');
|
||||
|
||||
return Inertia::render('Client/Schedules/Index', compact('educationalGroups', 'searchRequest'));
|
||||
|
||||
@@ -20,7 +20,7 @@ class ClientWidgetPostController extends Controller
|
||||
$query->where('category_id', $category_id);
|
||||
})
|
||||
->with('category')
|
||||
->orderBy('created_at', 'desc')
|
||||
->orderBy('publish_at', 'desc')
|
||||
->take(request()->input('count', 5))
|
||||
->get());
|
||||
}
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\EducationalProgramStatus;
|
||||
use App\Enums\LevelEducational;
|
||||
use App\Enums\PostStatus;
|
||||
use App\Http\Resources\AdditionalEducationResource;
|
||||
use App\Http\Resources\ClientMainSliderResource;
|
||||
use App\Http\Resources\ClientNavigationResource;
|
||||
@@ -12,6 +15,8 @@ use App\Http\Resources\PostThumbnailResource;
|
||||
use App\Models\AdditionalEducation;
|
||||
use App\Models\AdditionalEducationCategory;
|
||||
use App\Models\AdmissionCampaign;
|
||||
use App\Models\DirectionStudy;
|
||||
use App\Models\EducationalProgram;
|
||||
use App\Models\Event;
|
||||
use App\Models\MainSection;
|
||||
use App\Models\MainSlider;
|
||||
@@ -19,6 +24,7 @@ use App\Models\Post;
|
||||
use App\Services\Filament\Icon\ArrayToCollectionService;
|
||||
use DateTime;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Inertia\Inertia;
|
||||
|
||||
@@ -27,23 +33,43 @@ class MainController extends Controller
|
||||
|
||||
public function index()
|
||||
{
|
||||
$additional_educations = [
|
||||
'educations_count' => AdditionalEducation::where('is_active', true)->count(),
|
||||
'categories_count' => AdditionalEducationCategory::where('is_active', true)->count()
|
||||
$info = AdmissionCampaign::get()->first()->info ?? [];
|
||||
|
||||
$admissionCampaign = collect($info)->reduce(function ($carry, $a) {
|
||||
$lvl = LevelEducational::from((int)$a['edu_name'])->name;
|
||||
$carry[$lvl] = [
|
||||
'total_programs' => $a['total_programs'],
|
||||
'places' => [
|
||||
'och_count' => $a['och_count'],
|
||||
'zaoch_count' => $a['zaoch_count'],
|
||||
'budget_places' => $a['budget_places'],
|
||||
'non_budget_places' => $a['non_budget_places']
|
||||
],
|
||||
];
|
||||
return $carry;
|
||||
}, []);
|
||||
|
||||
$educations = [
|
||||
'admission_campaign' => $admissionCampaign,
|
||||
'additional_education' => [
|
||||
'educations_count' => AdditionalEducation::where('is_active', true)->count(),
|
||||
'categories_count' => AdditionalEducationCategory::where('is_active', true)->count()
|
||||
],
|
||||
|
||||
];
|
||||
$today = new DateTime();
|
||||
$event_date_start = $today->format('Y-m-d');
|
||||
$sliders = ClientMainSliderResource::collection(MainSlider::query()->where('is_active', true)->orderBy('sort', 'asc')->get());
|
||||
$posts = PostThumbnailResource::collection(Post::query()
|
||||
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'created_at')
|
||||
->select('title', 'slug', 'authors', 'preview_text', 'category_id', 'preview', 'search_data', 'created_at')
|
||||
->with('category')
|
||||
->where('status', '=', 'published')
|
||||
->orderBy('id', 'desc')->limit(3)
|
||||
->where('status', '=', PostStatus::PUBLISHED)
|
||||
->orderBy('publish_at', 'desc')->limit(3)
|
||||
->get());
|
||||
$events = EventThumbnailResource::collection(Event::query()
|
||||
->select('title', 'slug', 'event_date_start', 'address', 'is_online', 'category_id')
|
||||
->where('event_date_start', '>=', $event_date_start)
|
||||
->orderBy('event_date_start', 'asc')->limit(3)->get());
|
||||
return Inertia::render('Main', compact('posts', 'events', 'sliders', 'additional_educations'));
|
||||
return Inertia::render('Main', compact('posts', 'events', 'sliders', 'educations'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ class PostController extends Controller
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->where('title', 'like', "%{$search}%");
|
||||
})
|
||||
->orderBy('id', 'desc')
|
||||
->orderBy('publish_at', 'desc')
|
||||
->paginate(request()->input('perPage', 9))
|
||||
->withQueryString());
|
||||
$filters = [
|
||||
|
||||
@@ -16,8 +16,9 @@ use App\Models\EducationalProgram;
|
||||
use App\Models\Event;
|
||||
use App\Models\Page;
|
||||
use App\Models\Post;
|
||||
use Filament\Notifications\Collection;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\Date;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
use Illuminate\Support\Str;
|
||||
@@ -33,9 +34,11 @@ class SearchController extends Controller
|
||||
'searchRes' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
$results = Search::new()
|
||||
->add(Post::where('status', '=', 'published'), ['title', 'search_data'])
|
||||
->add(Page::where('searchable', '=', true), ['title', 'search_data'])
|
||||
->add(Page::with('section')->where('searchable', '=', true), ['title', 'search_data'])
|
||||
->add(Event::where('event_date_start', '>', Date::now()), 'title')
|
||||
->add(AdditionalEducation::where('is_active', '=', true), 'title')
|
||||
->add(EducationalGroup::with('schedules'), 'title')
|
||||
@@ -46,6 +49,7 @@ class SearchController extends Controller
|
||||
->ignoreCase(true)
|
||||
->search($req);
|
||||
|
||||
// Преобразуем результаты в коллекцию и мапируем их
|
||||
$resources = collect($results)->map(function ($result) {
|
||||
if ($result instanceof Post) {
|
||||
return new PostSearchResource($result);
|
||||
@@ -67,13 +71,30 @@ class SearchController extends Controller
|
||||
}
|
||||
});
|
||||
|
||||
$limitedRes = $resources->take(10);
|
||||
$result_type = $this->getCategoriesSearchResult($resources);
|
||||
|
||||
|
||||
if ($request->query('category')) {
|
||||
$resources = $this->sortResourcesByCategory($resources, $request->query('category'));
|
||||
}
|
||||
|
||||
$paginate_data = $this->createPaginate($resources, $request, 10);
|
||||
|
||||
$sortedData = $this->sortByType($paginate_data['paginator'], $req);
|
||||
|
||||
return response()->json([
|
||||
'searchRes' => $this->sortByType($limitedRes, $req),
|
||||
'searchRes' => $sortedData,
|
||||
'result_type' => $result_type,
|
||||
'selectedCategory' => ($request->query('category') !== null) ? $request->query('category') : null,
|
||||
'paginate' => [
|
||||
'current_page' => $paginate_data['paginator']->currentPage(),
|
||||
'last_page' => $paginate_data['paginator']->lastPage(),
|
||||
'total' => $paginate_data['paginator']->total(),
|
||||
'next_page' => $paginate_data['next_page'],
|
||||
'prev_page' => $paginate_data['prev_page'],
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
private function sortByType(object $data, string $searchRequest): array
|
||||
{
|
||||
$sortedData = [];
|
||||
@@ -105,5 +126,41 @@ class SearchController extends Controller
|
||||
return $matches;
|
||||
}
|
||||
|
||||
private function sortResourcesByCategory(Collection $resources, string $category) : Collection
|
||||
{
|
||||
if ($category === "All") {
|
||||
$data = $resources;
|
||||
} else {
|
||||
$data = $resources->where('type', $category);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
private function getCategoriesSearchResult(Collection $resources)
|
||||
{
|
||||
return $resources->pluck('type')->unique()->values()->all();
|
||||
}
|
||||
|
||||
private function createPaginate($resources, $request, $perPage = 10) : array
|
||||
{
|
||||
$currentPage = LengthAwarePaginator::resolveCurrentPage();
|
||||
|
||||
// Отрезаем нужные элементы для текущей страницы
|
||||
$currentItems = $resources->slice(($currentPage - 1) * $perPage, $perPage)->all();
|
||||
|
||||
// Создаем экземпляр LengthAwarePaginator
|
||||
$paginator = new LengthAwarePaginator($currentItems, count($resources), $perPage, $currentPage, [
|
||||
'path' => $request->url(),
|
||||
'query' => $request->query,
|
||||
]);
|
||||
|
||||
$nextPage = $paginator->hasMorePages() ? $paginator->currentPage() + 1 : null;
|
||||
$prevPage = $paginator->onFirstPage() ? null : $paginator->currentPage() - 1;
|
||||
|
||||
return [
|
||||
'paginator' => $paginator,
|
||||
'next_page' => $nextPage,
|
||||
'prev_page' => $prevPage
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user