events/Classes/Controller/DateController.php
Daniel Siepmann bae680025e
Flush corresponding page caches on import (#25)
The pages now receive proper cache tags.
The import now properly clears those cache tags.
That way all corresponding pages will show updated content after import
finished.

We need one test that executes frontend requests and import command.
The separation is therefore removed and tests are streamlined to have a
single parent providing all necessary information and setup.
2023-06-19 10:13:26 +02:00

184 lines
5.7 KiB
PHP

<?php
namespace Wrm\Events\Controller;
use TYPO3\CMS\Core\EventDispatcher\EventDispatcher;
use TYPO3\CMS\Extbase\Annotation as Extbase;
use TYPO3\CMS\Extbase\Service\ExtensionService;
use Wrm\Events\Domain\Model\Date;
use Wrm\Events\Domain\Model\Dto\DateDemandFactory;
use Wrm\Events\Domain\Repository\CategoryRepository;
use Wrm\Events\Domain\Repository\DateRepository;
use Wrm\Events\Domain\Repository\RegionRepository;
use Wrm\Events\Events\Controller\DateListVariables;
use Wrm\Events\Events\Controller\DateSearchVariables;
use Wrm\Events\Pagination\Factory;
use Wrm\Events\Service\DataProcessingForModels;
class DateController extends AbstractController
{
/**
* @var DateDemandFactory
*/
protected $demandFactory;
/**
* @var dateRepository
*/
protected $dateRepository;
/**
* @var regionRepository
*/
protected $regionRepository;
/**
* @var CategoryRepository
*/
protected $categoryRepository;
/**
* @var Factory
*/
protected $paginationFactory;
/**
* @var DataProcessingForModels
*/
protected $dataProcessing;
/**
* @var EventDispatcher
*/
protected $eventDispatcher;
/**
* @var ExtensionService
*/
protected $extensionService;
public function __construct(
DateDemandFactory $demandFactory,
DateRepository $dateRepository,
RegionRepository $regionRepository,
CategoryRepository $categoryRepository,
Factory $paginationFactory,
DataProcessingForModels $dataProcessing,
EventDispatcher $eventDispatcher,
ExtensionService $extensionService
) {
$this->demandFactory = $demandFactory;
$this->dateRepository = $dateRepository;
$this->regionRepository = $regionRepository;
$this->categoryRepository = $categoryRepository;
$this->paginationFactory = $paginationFactory;
$this->dataProcessing = $dataProcessing;
$this->eventDispatcher = $eventDispatcher;
$this->extensionService = $extensionService;
}
protected function initializeAction(): void
{
parent::initializeAction();
$contentObject = $this->configurationManager->getContentObject();
if ($contentObject !== null) {
$this->demandFactory->setContentObjectRenderer($contentObject);
}
$this->dataProcessing->setConfigurationManager($this->configurationManager);
$this->handlePostRequest();
}
/**
* @param array $search
* @param int $currentPage
*/
public function listAction(
array $search = [],
int $currentPage = 1
): void {
$demand = $this->demandFactory->fromSettings($this->settings);
if ($search !== []) {
$demand = $this->demandFactory->createFromRequestValues($search, $this->settings);
}
$dates = $this->dateRepository->findByDemand($demand);
$event = $this->eventDispatcher->dispatch(new DateListVariables(
$search,
$demand,
$dates,
$this->paginationFactory->create(
$currentPage,
$this->settings['itemsPerPage'] ?? 25,
$this->settings['maximumLinks'] ?? 5,
$dates
)
));
if (!$event instanceof DateListVariables) {
throw new \Exception('Did not retrieve DateSearchVariables from event dispatcher, got: ' . get_class($event), 1657542318);
}
$this->view->assignMultiple($event->getVariablesForView());
}
/**
* @param array $search
*/
public function searchAction(array $search = []): void
{
$demand = $this->demandFactory->fromSettings($this->settings);
if ($search !== []) {
$demand = $this->demandFactory->createFromRequestValues($search, $this->settings);
}
$event = $this->eventDispatcher->dispatch(new DateSearchVariables(
$search,
$demand,
$this->regionRepository->findAll(),
$this->categoryRepository->findAllCurrentlyAssigned($this->settings['uids']['categoriesParent'] ?? 0, 'categories'),
$this->categoryRepository->findAllCurrentlyAssigned($this->settings['uids']['featuresParent'] ?? 0, 'features')
));
if (!$event instanceof DateSearchVariables) {
throw new \Exception('Did not retrieve DateSearchVariables from event dispatcher, got: ' . get_class($event), 1657542318);
}
$this->view->assignMultiple($event->getVariablesForView());
}
public function teaserAction(): void
{
$dates = $this->dateRepository->findByUids($this->settings['eventUids']);
$this->view->assign('dates', $dates);
}
/**
* @Extbase\IgnoreValidation("date")
*/
public function showAction(Date $date): void
{
$this->view->assign('date', $date);
}
/**
* Convert POST to proper GET.
*
* @see: https://en.wikipedia.org/wiki/Post/Redirect/Get
*/
private function handlePostRequest(): void
{
if (
$this->request->getMethod() === 'POST'
&& $this->request->hasArgument('search')
&& is_array($this->request->getArgument('search'))
) {
$namespace = $this->extensionService->getPluginNamespace(null, null);
$this->redirectToUri($this->configurationManager->getContentObject()->typoLink_URL([
'parameter' => 't3://page?uid=current',
'additionalParams' => '&' . http_build_query([
$namespace => [
'search' => array_filter($this->request->getArgument('search')),
],
]),
]));
}
}
}