<?php
namespace App\Controller\Front\Channel;
use App\Entity\Channel\Channel;
use App\Form\Channel\Filter\ChannelTrainingFilter;
use App\Service\Scholar\TrainingTransformerService;
use Knp\Component\Pager\PaginatorInterface;
use App\Repository\Scholar\TrainingRepository;
use Spiriit\Bundle\FormFilterBundle\Filter\FilterBuilderUpdaterInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ShowTrainingListController extends AbstractController
{
public function __construct(
private TrainingRepository $trainingRepository,
private PaginatorInterface $paginator,
private FilterBuilderUpdaterInterface $builderUpdater,
private TrainingTransformerService $trainingTransformerService,
)
{
}
#[Route(path: '/channel/{id}/trainings', name: 'front_channel_trainings')]
public function __invoke(Request $request, Channel $channel): Response
{
$filtersForm = $this->createForm(ChannelTrainingFilter::class);
$searchInput = null;
if ($request->query->has($filtersForm->getName())) {
$filtersForm->submit($request->query->get($filtersForm->getName()));
$searchInput = $request->query->get($filtersForm->getName())['search'];
}
if (!empty($searchInput)) {
$trainingsQueryBuilder = $this->trainingRepository->getBySearchAndOwnerChannel($searchInput, $channel);
$countTrainings = $this->trainingRepository->countBySearchAndOwnerChannel($searchInput, $channel);
} else {
$trainingsQueryBuilder = $this->trainingRepository->getByOwnerChannelWithFilters($channel, null, null, true);
$countTrainings = $this->trainingRepository->countByOwnerChannel($channel);
}
$this->builderUpdater->addFilterConditions($filtersForm, $trainingsQueryBuilder);
// Pagination
$trainingsPagination = $this->paginator->paginate(
$trainingsQueryBuilder,
$request->query->getInt('page', 1),
16,
array('wrap-queries' => true),
);
$trainingsPaginationDTOs = $this->trainingTransformerService->toPaginationDTOs($trainingsPagination);
return $this->render('Front/Channel/showTrainingList.html.twig', [
'channel' => $channel,
'count_trainings' => $countTrainings,
'trainings' => $trainingsPaginationDTOs,
'filters' => $filtersForm->createView(),
'searchInput' => $searchInput,
'disable_header_search' => true,
]);
}
}