This commit is contained in:
f4ilji
2024-10-04 12:48:19 +05:00
parent 21a6e9073b
commit cebc584a14
303 changed files with 8224 additions and 2563 deletions
@@ -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());
}
+33 -7
View File
@@ -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'));
}
}
+1 -1
View File
@@ -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 = [
+62 -5
View File
@@ -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
];
}
}