Extend demand and provide search to templates

This commit is contained in:
Daniel Siepmann 2022-06-28 11:38:55 +02:00
parent 6e6e914e36
commit 3b4ecbe6ce
7 changed files with 338 additions and 11 deletions

View file

@ -91,9 +91,14 @@ class DateController extends AbstractController
); );
} }
public function listAction(): void /**
* @param array $search
*/
public function listAction(array $search = []): void
{ {
if ( if ($search !== []) {
$demand = DateDemand::createFromRequestValues($search, $this->settings);
} elseif (
($this->request->hasArgument('searchword') && $this->request->getArgument('searchword') != '') ($this->request->hasArgument('searchword') && $this->request->getArgument('searchword') != '')
|| ($this->request->hasArgument('region') && $this->request->getArgument('region') != '') || ($this->request->hasArgument('region') && $this->request->getArgument('region') != '')
|| ($this->request->hasArgument('start') && $this->request->getArgument('start') != '') || ($this->request->hasArgument('start') && $this->request->getArgument('start') != '')
@ -104,17 +109,24 @@ class DateController extends AbstractController
} else { } else {
$demand = $this->demandFactory->fromSettings($this->settings); $demand = $this->demandFactory->fromSettings($this->settings);
} }
$dates = $this->dateRepository->findByDemand($demand);
$this->view->assign('dates', $this->dateRepository->findByDemand($demand)); $this->view->assignMultiple([
'search' => $search,
'demand' => $demand,
'dates' => $this->dateRepository->findByDemand($demand),
]);
} }
public function searchAction(): void /**
* @param array $search
*/
public function searchAction(array $search = []): void
{ {
$arguments = GeneralUtility::_GET('tx_events_datelist') ?? []; $arguments = GeneralUtility::_GET('tx_events_datelist') ?? $search;
if (is_array($arguments) === false) { if (is_array($arguments) === false) {
$arguments = []; $arguments = [];
} }
if (isset($arguments['events_search'])) { if (isset($arguments['events_search']) && is_array($arguments['events_search'])) {
$arguments += $arguments['events_search']; $arguments += $arguments['events_search'];
unset($arguments['events_search']); unset($arguments['events_search']);
} }
@ -125,6 +137,7 @@ class DateController extends AbstractController
'start' => $arguments['start'] ?? '', 'start' => $arguments['start'] ?? '',
'end' => $arguments['end'] ?? '', 'end' => $arguments['end'] ?? '',
'considerDate' => $arguments['considerDate'] ?? '', 'considerDate' => $arguments['considerDate'] ?? '',
'search' => $search,
'demand' => DateDemand::createFromRequestValues($arguments, $this->settings), 'demand' => DateDemand::createFromRequestValues($arguments, $this->settings),
'regions' => $this->regionRepository->findAll(), 'regions' => $this->regionRepository->findAll(),
'categories' => $this->categoryRepository->findAllCurrentlyAssigned(), 'categories' => $this->categoryRepository->findAllCurrentlyAssigned(),

View file

@ -66,6 +66,11 @@ class Date extends AbstractEntity
$this->start = $start; $this->start = $start;
} }
public function getHasUsefulStartTime(): bool
{
return $this->getStart()->format('H:i') !== '00:00';
}
/** /**
* @return \DateTime end * @return \DateTime end
*/ */
@ -83,7 +88,15 @@ class Date extends AbstractEntity
$this->end = $end; $this->end = $end;
} }
public function getHasUsefulEndTime(): bool
{
return $this->getEnd()->format('H:i') !== '23:59';
}
public function getEndsOnSameDay(): bool
{
return $this->getStart()->format('Y-m-d') === $this->getEnd()->format('Y-m-d');
}
/** /**
* @return Event * @return Event

View file

@ -22,7 +22,7 @@ class DateDemand
protected $categories = ''; protected $categories = '';
/** /**
* @var array * @var int[]
*/ */
protected $userCategories = []; protected $userCategories = [];
@ -38,9 +38,15 @@ class DateDemand
/** /**
* @var string * @var string
* Legacy, superceeded by regions which allows multi select / filter.
*/ */
protected $region = ''; protected $region = '';
/**
* @var int[]
*/
protected $regions = [];
/** /**
* @var bool * @var bool
*/ */
@ -99,6 +105,9 @@ class DateDemand
$instance->setSynonyms($settings['synonyms'] ?? []); $instance->setSynonyms($settings['synonyms'] ?? []);
$instance->setRegion($submittedValues['region'] ?? ''); $instance->setRegion($submittedValues['region'] ?? '');
if (isset($submittedValues['regions']) && is_array($submittedValues['regions'])) {
$instance->setRegions($submittedValues['regions']);
}
if ($submittedValues['highlight'] ?? false) { if ($submittedValues['highlight'] ?? false) {
$instance->setHighlight($settings['highlight'] ?? false); $instance->setHighlight($settings['highlight'] ?? false);
@ -114,8 +123,8 @@ class DateDemand
$instance->setConsiderDate((bool)$submittedValues['considerDate']); $instance->setConsiderDate((bool)$submittedValues['considerDate']);
} }
if (is_array($submittedValues['userCategories'])) { if (isset($submittedValues['userCategories']) && is_array($submittedValues['userCategories'])) {
$instance->userCategories = array_map('intval', $submittedValues['userCategories']); $instance->setUserCategories($submittedValues['userCategories']);
} }
$instance->setSortBy($settings['sortByDate'] ?? ''); $instance->setSortBy($settings['sortByDate'] ?? '');
@ -154,6 +163,17 @@ class DateDemand
return $this->categories; return $this->categories;
} }
/**
* @param int[] $categories
*/
public function setUserCategories(array $categories): void
{
$this->userCategories = array_map('intval', $categories);
}
/**
* @return int[]
*/
public function getUserCategories(): array public function getUserCategories(): array
{ {
return $this->userCategories; return $this->userCategories;
@ -194,6 +214,19 @@ class DateDemand
$this->region = $region; $this->region = $region;
} }
/**
* @return int[]
*/
public function getRegions(): array
{
return $this->regions;
}
public function setRegions(array $regions): void
{
$this->regions = array_map('intval', $regions);
}
public function getHighlight(): bool public function getHighlight(): bool
{ {
return $this->highlight; return $this->highlight;

View file

@ -0,0 +1,47 @@
2.5.0
=====
Breaking
--------
Nothing
Features
--------
* Respect search in list and search action of date controller.
The argument prefix has to be ``search``.
The value is used to create the demand and filter the dates.
The value is also provided to the view.
That uses Extbase native argument mapping by name. No need for hardcoded plugin
namespaces or to provide some arguments from request to the view.
The search is a plain array and therefore allows to pass whatever the templates
provide.
* Extend ``DateDemand``. It now supports filtering by request values for Regions.
* Extend ``Date`` to provide helpful methods for templates.
New methods:
* ``getHasUsefulStartTime()``
* ``getHasUsefulEndTime()``
* ``getEndsOnSameDay()``
Fixes
-----
Nothing
Tasks
-----
Nothing
Deprecation
-----------
Nothing

View file

@ -0,0 +1,93 @@
<?php
namespace Wrm\Events\Tests\Unit\Domain\Model;
use PHPUnit\Framework\TestCase;
use Wrm\Events\Domain\Model\Date;
/**
* @covers \Wrm\Events\Domain\Model\Date
*/
class DateTest extends TestCase
{
/**
* @test
*/
public function canBeCreated(): void
{
$subject = new Date();
self::assertInstanceOf(
Date::class,
$subject
);
}
/**
* @test
*/
public function returnsThatItHasUsefulStartTime(): void
{
$subject = new Date();
$subject->setStart(new \DateTime('2022-07-11T13:48:00'));
self::assertTrue($subject->getHasUsefulStartTime());
}
/**
* @test
*/
public function returnsThatItDoesNotHaveUsefulStartTime(): void
{
$subject = new Date();
$subject->setStart(new \DateTime('2022-07-11T00:00:00'));
self::assertFalse($subject->getHasUsefulStartTime());
}
/**
* @test
*/
public function returnsThatItHasUsefulEndTime(): void
{
$subject = new Date();
$subject->setEnd(new \DateTime('2022-07-11T00:00:00'));
self::assertTrue($subject->getHasUsefulEndTime());
}
/**
* @test
*/
public function returnsThatItDoesNotHaveUsefulEndTime(): void
{
$subject = new Date();
$subject->setEnd(new \DateTime('2022-07-11T23:59:00'));
self::assertFalse($subject->getHasUsefulEndTime());
}
/**
* @test
*/
public function returnsThatItEndsOnSameDay(): void
{
$subject = new Date();
$subject->setStart(new \DateTime('2022-07-11T14:00:00'));
$subject->setEnd(new \DateTime('2022-07-11T22:00:00'));
self::assertTrue($subject->getEndsOnSameDay());
}
/**
* @test
*/
public function returnsThatItDoesNotEndOnSameDay(): void
{
$subject = new Date();
$subject->setStart(new \DateTime('2022-07-11T14:00:00'));
$subject->setEnd(new \DateTime('2022-07-13T22:00:00'));
self::assertFalse($subject->getEndsOnSameDay());
}
}

View file

@ -0,0 +1,128 @@
<?php
namespace Wrm\Events\Tests\Unit\Domain\Model\Dto;
use PHPUnit\Framework\TestCase;
use Wrm\Events\Domain\Model\Dto\DateDemand;
/**
* @covers \Wrm\Events\Domain\Model\Dto\DateDemand
*/
class DateDemandTest extends TestCase
{
/**
* @test
*/
public function canBeCreated(): void
{
$subject = new DateDemand();
self::assertInstanceOf(
DateDemand::class,
$subject
);
}
/**
* @test
*/
public function searchWordIsSetByRequest(): void
{
$result = DateDemand::createFromRequestValues(
[
'searchword' => 'This is the search word',
],
[
]
);
self::assertSame(
'This is the search word',
$result->getSearchword()
);
}
/**
* @test
*/
public function synonymsAreSetBySettings(): void
{
$result = DateDemand::createFromRequestValues(
[
'searchword' => 'synonym1',
],
[
'synonyms' => [
[
'word' => 'Word1',
'synonyms' => 'synonym1, synonym2',
],
[
'word' => 'Word2',
'synonyms' => 'synonym3, synonym4',
],
[
'word' => 'Word3',
'synonyms' => 'synonym1',
],
],
]
);
self::assertSame(
[
'Word1',
'Word3',
],
$result->getSynonymsForSearchword()
);
}
/**
* @test
*/
public function categoriesAreSetByRequest(): void
{
$result = DateDemand::createFromRequestValues(
[
'userCategories' => [
'10', '20',
],
],
[
]
);
self::assertSame(
[
10,
20,
],
$result->getUserCategories()
);
}
/**
* @test
*/
public function regionsAreSetByRequest(): void
{
$result = DateDemand::createFromRequestValues(
[
'regions' => [
'10', '20',
],
],
[
]
);
self::assertSame(
[
10,
20,
],
$result->getRegions()
);
}
}

View file

@ -9,7 +9,7 @@ $EM_CONF['events'] = [
'state' => 'alpha', 'state' => 'alpha',
'createDirs' => '', 'createDirs' => '',
'clearCacheOnLoad' => 0, 'clearCacheOnLoad' => 0,
'version' => '2.4.4', 'version' => '2.5.0',
'constraints' => [ 'constraints' => [
'depends' => [ 'depends' => [
'typo3' => '10.4.00-11.5.99', 'typo3' => '10.4.00-11.5.99',