Provide new "Event selected" plugin

Allow editors to select specific events to display.
Therefore add new necessary demand and setting for events and respect
them within repository.

Relates: #8092
This commit is contained in:
Daniel Siepmann 2021-01-12 14:12:58 +01:00
parent 8da7284e1f
commit 17bd83eedf
8 changed files with 128 additions and 25 deletions

View file

@ -3,6 +3,7 @@
namespace Wrm\Events\Controller; namespace Wrm\Events\Controller;
use TYPO3\CMS\Core\Database\QueryGenerator; use TYPO3\CMS\Core\Database\QueryGenerator;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Annotation as Extbase; use TYPO3\CMS\Extbase\Annotation as Extbase;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface; use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
@ -122,6 +123,7 @@ class EventController extends ActionController
protected function createDemandFromSettings(): EventDemand protected function createDemandFromSettings(): EventDemand
{ {
/** @var EventDemand $demand */
$demand = $this->objectManager->get(EventDemand::class); $demand = $this->objectManager->get(EventDemand::class);
$demand->setRegion((string)$this->settings['region']); $demand->setRegion((string)$this->settings['region']);
@ -138,6 +140,8 @@ class EventController extends ActionController
$demand->setHighlight((bool)$this->settings['highlight']); $demand->setHighlight((bool)$this->settings['highlight']);
$demand->setRecordUids(GeneralUtility::intExplode(',', $this->settings['selectedRecords'], true));
if (!empty($this->settings['limit'])) { if (!empty($this->settings['limit'])) {
$demand->setLimit($this->settings['limit']); $demand->setLimit($this->settings['limit']);
} }

View file

@ -45,6 +45,11 @@ class EventDemand
*/ */
protected $limit = ''; protected $limit = '';
/**
* @var array
*/
protected $recordUids = [];
/** /**
* @return string * @return string
*/ */
@ -172,4 +177,20 @@ class EventDemand
{ {
$this->limit = $limit; $this->limit = $limit;
} }
/**
* @return array
*/
public function getRecordUids(): array
{
return $this->recordUids;
}
/**
* @param array $recordUids
*/
public function setRecordUids(array $recordUids): void
{
$this->recordUids = $recordUids;
}
} }

View file

@ -20,6 +20,7 @@ use TYPO3\CMS\Extbase\Persistence\QueryInterface;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface; use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
use TYPO3\CMS\Extbase\Persistence\Repository; use TYPO3\CMS\Extbase\Persistence\Repository;
use Wrm\Events\Domain\Model\Dto\EventDemand; use Wrm\Events\Domain\Model\Dto\EventDemand;
use Wrm\Events\Domain\Model\Event;
use Wrm\Events\Service\CategoryService; use Wrm\Events\Service\CategoryService;
class EventRepository extends Repository class EventRepository extends Repository
@ -56,6 +57,11 @@ class EventRepository extends Repository
public function findByDemand(EventDemand $demand) public function findByDemand(EventDemand $demand)
{ {
$query = $this->createDemandQuery($demand); $query = $this->createDemandQuery($demand);
if ($demand->getRecordUids() !== [] && $demand->getSortBy() === 'default') {
return $this->sortByDemand($query, $demand);
}
return $query->execute(); return $query->execute();
} }
@ -70,7 +76,8 @@ class EventRepository extends Repository
// sorting // sorting
$sortBy = $demand->getSortBy(); $sortBy = $demand->getSortBy();
if ($sortBy && $sortBy !== 'singleSelection' && $sortBy !== 'default') { $sortingsToIgnore = ['singleSelection', 'default'];
if ($sortBy && in_array($sortBy, $sortingsToIgnore) === false) {
$order = strtolower($demand->getSortOrder()) === 'desc' ? QueryInterface::ORDER_DESCENDING : QueryInterface::ORDER_ASCENDING; $order = strtolower($demand->getSortOrder()) === 'desc' ? QueryInterface::ORDER_DESCENDING : QueryInterface::ORDER_ASCENDING;
$query->setOrderings([$sortBy => $order]); $query->setOrderings([$sortBy => $order]);
} }
@ -88,6 +95,10 @@ class EventRepository extends Repository
} }
} }
if ($demand->getRecordUids() !== []) {
$constraints['recordUids'] = $query->in('uid', $demand->getRecordUids());
}
if ($demand->getRegion() !== '') { if ($demand->getRegion() !== '') {
$constraints['region'] = $query->equals('region', $demand->getRegion()); $constraints['region'] = $query->equals('region', $demand->getRegion());
} }
@ -133,6 +144,20 @@ class EventRepository extends Repository
return $constraints; return $constraints;
} }
private function sortByDemand(QueryInterface $query, EventDemand $demand): array
{
$result = $query->execute()->toArray();
$expectedSorting = $demand->getRecordUids();
usort($result, function (Event $eventA, Event $eventB) use ($expectedSorting) {
$positionOfA = array_search($eventA->getUid(), $expectedSorting);
$positionOfB = array_search($eventB->getUid(), $expectedSorting);
return $positionOfA <=> $positionOfB;
});
return $result;
}
public function findSearchWord($search) public function findSearchWord($search)
{ {

View file

@ -0,0 +1,24 @@
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<type>array</type>
<el>
<settings.selectedRecords>
<TCEforms>
<exclude>1</exclude>
<label>LLL:EXT:events/Resources/Private/Language/de.locallang_db.xlf:tx_events.flexform.selected.selectedRecords</label>
<config>
<type>group</type>
<internal_type>db</internal_type>
<allowed>tx_events_domain_model_event</allowed>
<minitems>1</minitems>
<show_thumbs>1</show_thumbs>
</config>
</TCEforms>
</settings.selectedRecords>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>

View file

@ -69,4 +69,20 @@ call_user_func(function () {
); );
/* Event Selected Plugin */
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Events',
'Selected',
'Events: Show selected',
'EXT:events/Resources/Public/Icons/user_plugin_events.svg'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['events_selected'] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
'events_selected',
'FILE:EXT:events/Configuration/FlexForms/Selected.xml'
);
}); });

View file

@ -11,6 +11,10 @@
<source>Event Modul</source> <source>Event Modul</source>
<target>Veranstaltungs Modul</target> <target>Veranstaltungs Modul</target>
</trans-unit> </trans-unit>
<trans-unit id="tx_events.flexform.selected.selectedRecords">
<source>Records to show</source>
<target>Anzuzeigende Veranstaltungen</target>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View file

@ -9,6 +9,9 @@
<trans-unit id="tx_events.description"> <trans-unit id="tx_events.description">
<source>Event Modul</source> <source>Event Modul</source>
</trans-unit> </trans-unit>
<trans-unit id="tx_events.flexform.selected.selectedRecords">
<source>Records to show</source>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View file

@ -26,6 +26,12 @@ call_user_func(
[\Wrm\Events\Controller\DateController::class => 'show'] [\Wrm\Events\Controller\DateController::class => 'show']
); );
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Events',
'Selected',
[\Wrm\Events\Controller\EventController::class => 'list']
);
$iconRegistry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Imaging\IconRegistry::class); $iconRegistry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Imaging\IconRegistry::class);
$iconRegistry->registerIcon( $iconRegistry->registerIcon(
'events-plugin', 'events-plugin',