This commit is contained in:
Dirk 2020-08-17 14:26:38 +02:00
commit 552986b2aa
35 changed files with 1076 additions and 431 deletions

View file

@ -23,29 +23,23 @@ class DestinationDataImportCommand extends Command {
'storage-pid', 'storage-pid',
InputArgument::OPTIONAL, InputArgument::OPTIONAL,
'What is the storage pid?', 'What is the storage pid?',
'281' '284'
); );
$this->addArgument( $this->addArgument(
'region-uid', 'region-uid',
InputArgument::OPTIONAL, InputArgument::OPTIONAL,
'What is the region uid?', 'What is the region uid?',
'3'
);
$this->addArgument(
'category-parent-uid',
InputArgument::OPTIONAL,
'What is the default category parent uid?',
'6' '6'
); );
$this->addArgument('rest-experience', $this->addArgument('rest-experience',
InputArgument::OPTIONAL, InputArgument::OPTIONAL,
'What is the rest experience?', 'What is the rest experience?',
'arnstadt' 'stadtmarketing-erfurt'
); );
$this->addArgument('files-folder', $this->addArgument('files-folder',
InputArgument::OPTIONAL, InputArgument::OPTIONAL,
'Where to save the image files?', 'Where to save the image files?',
'redaktion/arnstadt/events/' 'staedte/erfurt/events/'
); );
} }
@ -59,7 +53,6 @@ class DestinationDataImportCommand extends Command {
$input->getArgument('rest-experience'), $input->getArgument('rest-experience'),
$input->getArgument('storage-pid'), $input->getArgument('storage-pid'),
$input->getArgument('region-uid'), $input->getArgument('region-uid'),
$input->getArgument('category-parent-uid'),
$input->getArgument('files-folder') $input->getArgument('files-folder')
); );
} }

View file

@ -1,6 +1,7 @@
<?php <?php
namespace Wrm\Events\Controller; namespace Wrm\Events\Controller;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use Wrm\Events\Domain\Model\Dto\DateDemand; use Wrm\Events\Domain\Model\Dto\DateDemand;
use Wrm\Events\Domain\Repository\DateRepository; use Wrm\Events\Domain\Repository\DateRepository;
use Wrm\Events\Domain\Repository\RegionRepository; use Wrm\Events\Domain\Repository\RegionRepository;
@ -63,8 +64,17 @@ class DateController extends ActionController
*/ */
public function listAction() public function listAction()
{ {
if (($this->request->hasArgument('searchword') && $this->request->getArgument('searchword') != '') ||
($this->request->hasArgument('region') && $this->request->getArgument('region') != '') ||
($this->request->hasArgument('start') && $this->request->getArgument('start') != '') ||
($this->request->hasArgument('end') && $this->request->getArgument('end') != ''))
{
$demand = $this->createDemandFromSearch();
$dates = $this->dateRepository->findByDemand($demand);
} else {
$demand = $this->createDemandFromSettings(); $demand = $this->createDemandFromSettings();
$dates = $this->dateRepository->findByDemand($demand); $dates = $this->dateRepository->findByDemand($demand);
}
$this->view->assign('dates', $dates); $this->view->assign('dates', $dates);
} }
@ -73,42 +83,21 @@ class DateController extends ActionController
*/ */
public function searchAction() public function searchAction()
{ {
$arguments = GeneralUtility::_GET('tx_events_datelist');
$searchword = null; $searchword = $arguments['searchword'];
$regions = null; $selRegion = $arguments['region'];
$selRegion = null; $start = $arguments['start'];
$dates = null; $end = $arguments['end'];
$start = null; $considerDate = $arguments['considerDate'];
$end = null;
if ($this->request->hasArgument('searchword') && $this->request->getArgument('searchword') != '') {
$searchword = $this->request->getArgument('searchword');
}
if ($this->request->hasArgument('region') && $this->request->getArgument('region') != '') {
$selRegion = $this->request->getArgument('region');
}
if ($this->request->hasArgument('start') && $this->request->getArgument('start') != '') {
$start = date( "d.m.y", strtotime( $this->request->getArgument('start')));
}
if ($this->request->hasArgument('end') && $this->request->getArgument('end') != '') {
$end = date( "d.m.y", strtotime( $this->request->getArgument('end')));
}
$demand = $this->createDemandFromSearch();
$dates = $this->dateRepository->findByDemand($demand);
$regions = $this->regionRepository->findAll(); $regions = $this->regionRepository->findAll();
$this->view->assign('regions', $regions);
$this->view->assign('searchword', $searchword); $this->view->assign('searchword', $searchword);
$this->view->assign('regions', $regions);
$this->view->assign('selRegion', $selRegion); $this->view->assign('selRegion', $selRegion);
$this->view->assign('dates', $dates);
$this->view->assign('start', $start); $this->view->assign('start', $start);
$this->view->assign('end', $end); $this->view->assign('end', $end);
$this->view->assign('considerDate', $considerDate);
} }
/** /**
@ -172,13 +161,14 @@ class DateController extends ActionController
if ($this->request->hasArgument('searchword') && $this->request->getArgument('searchword') != '') if ($this->request->hasArgument('searchword') && $this->request->getArgument('searchword') != '')
$demand->setSearchword((string)$this->request->getArgument('searchword')); $demand->setSearchword((string)$this->request->getArgument('searchword'));
if ($this->request->hasArgument('start') && $this->request->getArgument('start') != '') { if ($this->request->hasArgument('start') && $this->request->getArgument('start') != '')
$demand->setStart(date( "Y-m-d", strtotime( $this->request->getArgument('start')))); $demand->setStart(strtotime($this->request->getArgument('start') . ' 00:00'));
}
if ($this->request->hasArgument('end') && $this->request->getArgument('end') != '') { if ($this->request->hasArgument('end') && $this->request->getArgument('end') != '')
$demand->setEnd(date( "Y-m-d", strtotime( $this->request->getArgument('end')))); $demand->setEnd(strtotime($this->request->getArgument('end') . ' 23:59'));
}
if ($this->request->hasArgument('considerDate') && $this->request->getArgument('considerDate') != '')
$demand->setConsiderDate(strtotime($this->request->getArgument('considerDate')));
$demand->setSortBy((string)$this->settings['sortByDate']); $demand->setSortBy((string)$this->settings['sortByDate']);
$demand->setSortOrder((string)$this->settings['sortOrder']); $demand->setSortOrder((string)$this->settings['sortOrder']);

View file

@ -49,10 +49,10 @@ class Date extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
} }
/** /**
* @param string $end * @param \DateTime $end
* @return void * @return void
*/ */
public function setEnd($end) public function setEnd(\DateTime $end)
{ {
$this->end = $end; $this->end = $end;
} }

View file

@ -59,6 +59,11 @@ class DateDemand {
*/ */
protected $searchword = ''; protected $searchword = '';
/**
* @var bool
*/
protected $considerDate = 0;
/** /**
* @return string * @return string
*/ */
@ -235,4 +240,20 @@ class DateDemand {
$this->end = $end; $this->end = $end;
} }
/**
* @return bool
*/
public function getConsiderDate(): bool
{
return $this->considerDate;
}
/**
* @param bool $considerDate
*/
public function setConsiderDate(string $considerDate): void
{
$this->considerDate = $considerDate;
}
} }

View file

@ -105,6 +105,13 @@ class Event extends AbstractEntity
*/ */
protected $country = ''; protected $country = '';
/**
* web
*
* @var string
*/
protected $phone = '';
/** /**
* web * web
* *
@ -381,6 +388,22 @@ class Event extends AbstractEntity
$this->zip = $zip; $this->zip = $zip;
} }
/**
* @return string
*/
public function getPhone()
{
return $this->phone;
}
/**
* @param string $phone
*/
public function setPhone($phone)
{
$this->phone = $phone;
}
/** /**
* @return string $web * @return string $web
*/ */

View file

@ -82,9 +82,12 @@ class DateRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
$constraints['daterange'] = $query->logicalAnd( $constraints['daterange'] = $query->logicalAnd(
[ [
$query->greaterThanOrEqual('start', $demand->getStart()), $query->greaterThanOrEqual('start', $demand->getStart()),
$query->lessThanOrEqual('start', $demand->getEnd()) $query->lessThanOrEqual('end', $demand->getEnd())
] ]
); );
} else {
$now = new \DateTime('now', new \DateTimeZone('Europe/Berlin'));
$constraints['untilnow'] = $query->greaterThanOrEqual('start', $now);
} }
if ($demand->getLimit() !== '') { if ($demand->getLimit() !== '') {

View file

@ -42,6 +42,10 @@ class DestinationDataImportService {
* @var * @var
*/ */
protected $restLimit; protected $restLimit;
/**
* @var
*/
protected $restMode;
/** /**
* @var * @var
*/ */
@ -189,23 +193,23 @@ class DestinationDataImportService {
$this->restLicenseKey = $this->settings['destinationData']['license']; $this->restLicenseKey = $this->settings['destinationData']['license'];
$this->restType = $this->settings['destinationData']['restType']; $this->restType = $this->settings['destinationData']['restType'];
$this->restLimit = $this->settings['destinationData']['restLimit']; $this->restLimit = $this->settings['destinationData']['restLimit'];
$this->restMode = $this->settings['destinationData']['restMode'];
$this->restTemplate = $this->settings['destinationData']['restTemplate']; $this->restTemplate = $this->settings['destinationData']['restTemplate'];
$this->sysCategoriesPid = $this->settings['destinationData']['categoriesPid']; $this->sysCategoriesPid = $this->settings['destinationData']['categoriesPid'];
$this->categoryParentUid = $this->settings['destinationData']['categoryParentUid'];
} }
/** /**
* @param $restExperience * @param $restExperience
* @param $storagePid * @param $storagePid
* @param $regionUid * @param $regionUid
* @param $categoryParentUid
* @param $filesFolder * @param $filesFolder
*/ */
public function import($restExperience, $storagePid, $regionUid, $categoryParentUid, $filesFolder) { public function import($restExperience, $storagePid, $regionUid, $filesFolder) {
$this->restExperience = $restExperience; $this->restExperience = $restExperience;
$this->storagePid = $storagePid; $this->storagePid = $storagePid;
$this->regionUid = $regionUid; $this->regionUid = $regionUid;
$this->categoryParentUid = $categoryParentUid;
$this->filesFolder = $filesFolder; $this->filesFolder = $filesFolder;
// Get configuration // Get configuration
@ -222,16 +226,14 @@ class DestinationDataImportService {
// Set Configuration // Set Configuration
$this->configurationManager->setConfiguration(array_merge($frameworkConfiguration, $persistenceConfiguration)); $this->configurationManager->setConfiguration(array_merge($frameworkConfiguration, $persistenceConfiguration));
$this->logger = GeneralUtility::makeInstance(LogManager::class)->getLogger(__CLASS__); $this->logger = GeneralUtility::makeInstance(LogManager::class)->getLogger(__CLASS__);
$this->logger->info('Starting Destination Data Import Service'); $this->logger->info('Starting Destination Data Import Service');
$restUrl = $this->restUrl . '?experience=' . $this->restExperience . '&licensekey=' . $this->restLicenseKey . '&type=' . $this->restType . '&mode=' . $this->restMode . '&limit=' . $this->restLimit . '&template=' . $this->restTemplate;
$restUrl = $this->restUrl . '?experience=' . $this->restExperience . '&licensekey=' . $this->restLicenseKey . '&type=' . $this->restType . '&limit=' . $this->restLimit . '&template=' . $this->restTemplate;
$this->logger->info('Try to get data from ' . $restUrl); $this->logger->info('Try to get data from ' . $restUrl);
if ($jsonResponse = json_decode(file_get_contents($restUrl),true)) { if ($jsonResponse = json_decode(file_get_contents($restUrl),true)) {
$this->logger->info('Received data with ' . count($jsonResponse) . 'items'); $this->logger->info('Received data with ' . count($jsonResponse['items']) . ' items');
return $this->processData($jsonResponse); return $this->processData($jsonResponse);
} else { } else {
$this->logger->error('Could not receive data.'); $this->logger->error('Could not receive data.');
@ -246,7 +248,9 @@ class DestinationDataImportService {
*/ */
public function processData($data) { public function processData($data) {
// Get seleceted region $this->logger->info('Processing json ' . count($data['items']));
// Get selected region
$selectedRegion = $this->regionRepository->findByUid($this->regionUid); $selectedRegion = $this->regionRepository->findByUid($this->regionUid);
foreach ($data['items'] as $event) { foreach ($data['items'] as $event) {
@ -271,8 +275,9 @@ class DestinationDataImportService {
$this->setTexts($event['texts']); $this->setTexts($event['texts']);
// Set address and geo data // Set address and geo data
if($event['name'] && $event['street'] && $event['city'] && $event['zip'] && $event['country'])
$this->setAddress($event['name'], $event['street'], $event['city'], $event['zip'], $event['country']); if($event['name'] || $event['street'] || $event['city'] || $event['zip'] || $event['country'])
$this->setAddress($event);
// Set LatLng // Set LatLng
if($event['geo']['main']['latitude'] && $event['geo']['main']['longitude']) if($event['geo']['main']['latitude'] && $event['geo']['main']['longitude'])
@ -301,10 +306,12 @@ class DestinationDataImportService {
} }
$this->doSlugUpdate(); $this->doSlugUpdate();
$this->logger->info('Finished import');
return 0; return 0;
} }
/** /**
*
* @param array $categories * @param array $categories
*/ */
protected function setCategories(Array $categories) { protected function setCategories(Array $categories) {
@ -331,7 +338,7 @@ class DestinationDataImportService {
*/ */
protected function setDates(Array $timeIntervals) { protected function setDates(Array $timeIntervals) {
// TODO: does not seem to work --> // @TODO: does not seem to work -->
//$currentEventDates = $this->tmpCurrentEvent->getDates(); //$currentEventDates = $this->tmpCurrentEvent->getDates();
//$this->tmpCurrentEvent->removeAllDates($currentEventDates); //$this->tmpCurrentEvent->removeAllDates($currentEventDates);
// <-- // <--
@ -341,19 +348,18 @@ class DestinationDataImportService {
$this->logger->info('Found ' . count($currentEventDates) . ' to delete'); $this->logger->info('Found ' . count($currentEventDates) . ' to delete');
foreach ($currentEventDates as $currentDate) { foreach ($currentEventDates as $currentDate) {
//$this->logger->info('Delete ' . $currentDate->getStart()->format('Y-m-d'));
$this->dateRepository->remove($currentDate); $this->dateRepository->remove($currentDate);
} }
$now = new \DateTime(); $today = new \DateTime('today');
$now = $now->getTimestamp(); $today = $today->getTimestamp();
foreach ($timeIntervals as $date) { foreach ($timeIntervals as $date) {
// Check if dates are given as interval or not // Check if dates are given as interval or not
if (empty($date['interval'])) { if (empty($date['interval'])) {
if (strtotime($date['start']) > $now) { if (strtotime($date['start']) > $today) {
$this->logger->info('Setup single date'); $this->logger->info('Setup single date');
$dateObj = $this->objectManager->get(\Wrm\Events\Domain\Model\Date::class); $dateObj = $this->objectManager->get(\Wrm\Events\Domain\Model\Date::class);
$start = new \DateTime($date['start'], new \DateTimeZone($date['tz'])); $start = new \DateTime($date['start'], new \DateTimeZone($date['tz']));
@ -367,16 +373,16 @@ class DestinationDataImportService {
} else { } else {
if ($date['freq'] == 'Daily' && empty($date['weekdays']) && !empty($date['repeatUntil'])) {
if ($date['freq'] == 'Daily' && empty($date['weekdays'])) {
$this->logger->info('Setup daily interval dates'); $this->logger->info('Setup daily interval dates');
$this->logger->info('Start ' . $date['start']); $this->logger->info('Start ' . $date['start']);
$this->logger->info('End ' . $date['repeatUntil']); $this->logger->info('End ' . $date['repeatUntil']);
$start = new \DateTime($date['start'], new \DateTimeZone($date['tz'])); $start = new \DateTime($date['start'], new \DateTimeZone($date['tz']));
$until = new \DateTime($date['repeatUntil'], new \DateTimeZone($date['tz'])); $until = new \DateTime($date['repeatUntil'], new \DateTimeZone($date['tz']));
for($i = strtotime($start->format('l'), $start->getTimestamp()); $i <= $until->getTimestamp(); $i = strtotime('+1 day', $i)) { for($i = strtotime($start->format('l'), $start->getTimestamp()); $i <= $until->getTimestamp(); $i = strtotime('+1 day', $i)) {
if ($i > $now) { if ($i >= $today) {
$eventStart = new \DateTime(); $eventStart = new \DateTime();
$eventStart->setTimestamp($i); $eventStart->setTimestamp($i);
$eventStart->setTime($start->format('H'), $start->format('i')); $eventStart->setTime($start->format('H'), $start->format('i'));
@ -392,8 +398,7 @@ class DestinationDataImportService {
} }
else if ($date['freq'] == 'Weekly' && !empty($date['weekdays'])) { else if ($date['freq'] == 'Weekly' && !empty($date['weekdays']) && !empty($date['repeatUntil'])) {
foreach ($date['weekdays'] as $day) { foreach ($date['weekdays'] as $day) {
$this->logger->info('Setup weekly interval dates for ' . $day); $this->logger->info('Setup weekly interval dates for ' . $day);
$this->logger->info('Start ' . $date['start']); $this->logger->info('Start ' . $date['start']);
@ -402,7 +407,7 @@ class DestinationDataImportService {
$until = new \DateTime($date['repeatUntil'], new \DateTimeZone($date['tz'])); $until = new \DateTime($date['repeatUntil'], new \DateTimeZone($date['tz']));
for($i = strtotime($day, $start->getTimestamp()); $i <= $until->getTimestamp(); $i = strtotime('+1 week', $i)) { for($i = strtotime($day, $start->getTimestamp()); $i <= $until->getTimestamp(); $i = strtotime('+1 week', $i)) {
if ($i > $now) { if ($i >= $today) {
$eventStart = new \DateTime(); $eventStart = new \DateTime();
$eventStart->setTimestamp($i); $eventStart->setTimestamp($i);
$eventStart->setTime($start->format('H'), $start->format('i')); $eventStart->setTime($start->format('H'), $start->format('i'));
@ -416,12 +421,10 @@ class DestinationDataImportService {
} }
} }
} }
} }
} }
} }
$this->logger->info('Finished setup dates');
} }
/** /**
@ -436,9 +439,7 @@ class DestinationDataImportService {
$this->tmpCurrentEvent->setOrganizer($tmpOrganizer); $this->tmpCurrentEvent->setOrganizer($tmpOrganizer);
continue; continue;
} }
$tmpOrganizer = $this->objectManager->get(\Wrm\Events\Domain\Model\Organizer::class); $tmpOrganizer = $this->objectManager->get(\Wrm\Events\Domain\Model\Organizer::class);
$tmpOrganizer->setName($address['name']); $tmpOrganizer->setName($address['name']);
$tmpOrganizer->setCity($address['city']); $tmpOrganizer->setCity($address['city']);
$tmpOrganizer->setZip($address['zip']); $tmpOrganizer->setZip($address['zip']);
@ -447,27 +448,30 @@ class DestinationDataImportService {
$tmpOrganizer->setWeb($address['web']); $tmpOrganizer->setWeb($address['web']);
$tmpOrganizer->setEmail($address['email']); $tmpOrganizer->setEmail($address['email']);
$tmpOrganizer->setDistrict($address['district']); $tmpOrganizer->setDistrict($address['district']);
$this->organizerRepository->add($tmpOrganizer); $this->organizerRepository->add($tmpOrganizer);
$this->tmpCurrentEvent->setOrganizer($tmpOrganizer); $this->tmpCurrentEvent->setOrganizer($tmpOrganizer);
} }
} }
} }
/** /**
* @param string $name * @param array $event
* @param string $street
* @param string $city
* @param string $zip
* @param string $country
*/ */
protected function setAddress(String $name, String $street, String $city, String $zip, String $country) { protected function setAddress(Array $event) {
$this->tmpCurrentEvent->setName($name); if (!empty($event['name']))
$this->tmpCurrentEvent->setStreet($street); $this->tmpCurrentEvent->setName($event['name']);
$this->tmpCurrentEvent->setCity($city); if (!empty($event['street']))
$this->tmpCurrentEvent->setZip($zip); $this->tmpCurrentEvent->setStreet($event['street']);
$this->tmpCurrentEvent->setCountry($country); if (!empty($event['city']))
$this->tmpCurrentEvent->setCity($event['city']);
if (!empty($event['zip']))
$this->tmpCurrentEvent->setZip($event['zip']);
if (!empty($event['country']))
$this->tmpCurrentEvent->setCountry($event['country']);
if (!empty($event['phone']))
$this->tmpCurrentEvent->setPhone($event['phone']);
if (!empty($event['web']))
$this->tmpCurrentEvent->setWeb($event['web']);
} }
/** /**
@ -492,6 +496,9 @@ class DestinationDataImportService {
if ($text['rel'] == "teaser" && $text['type'] == "text/plain") { if ($text['rel'] == "teaser" && $text['type'] == "text/plain") {
$this->tmpCurrentEvent->setTeaser($text['value']); $this->tmpCurrentEvent->setTeaser($text['value']);
} }
if ($text['rel'] == "PRICE_INFO" && $text['type'] == "text/plain") {
$this->tmpCurrentEvent->setPriceInfo($text['value']);
}
} }
} }
@ -528,6 +535,8 @@ class DestinationDataImportService {
*/ */
protected function setAssets(Array $assets) { protected function setAssets(Array $assets) {
$this->logger->info("Set assets");
$error = false; $error = false;
foreach ($assets as $media_object) foreach ($assets as $media_object)
@ -536,6 +545,11 @@ class DestinationDataImportService {
$this->storage = $this->resourceFactory->getDefaultStorage(); $this->storage = $this->resourceFactory->getDefaultStorage();
if ($this->storage == null) {
$this->logger->error('No default storage defined. Cancel import.');
die();
}
// Check if file already exists // Check if file already exists
if (file_exists($this->environment->getPublicPath() . '/fileadmin/' . $this->filesFolder . strtolower(basename($media_object['url'])))) { if (file_exists($this->environment->getPublicPath() . '/fileadmin/' . $this->filesFolder . strtolower(basename($media_object['url'])))) {
$this->logger->info('File already exists'); $this->logger->info('File already exists');
@ -634,7 +648,6 @@ class DestinationDataImportService {
*/ */
protected function doSlugUpdate() protected function doSlugUpdate()
{ {
$this->logger->info('Update slugs'); $this->logger->info('Update slugs');
$slugHelper = GeneralUtility::makeInstance( $slugHelper = GeneralUtility::makeInstance(

View file

@ -0,0 +1,9 @@
<?php
namespace Wrm\Events\ViewHelpers;
class FormViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\FormViewHelper {
protected function renderHiddenReferrerFields(){
return '';
}
}

View file

@ -0,0 +1,236 @@
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Options</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.sortByDate>
<TCEforms>
<exclude>1</exclude>
<label>Sort By</label>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Start</numIndex>
<numIndex index="1">start</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">End</numIndex>
<numIndex index="1">end</numIndex>
</numIndex>
</items>
</config>
</TCEforms>
</settings.sortByDate>
<settings.sortOrder>
<TCEforms>
<exclude>1</exclude>
<label>Sort Order</label>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">
Ascending
</numIndex>
<numIndex index="1">ASC</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">
Descending
</numIndex>
<numIndex index="1">DESC</numIndex>
</numIndex>
</items>
<default>ASC</default>
</config>
</TCEforms>
</settings.sortOrder>
<settings.limit>
<TCEforms>
<exclude>1</exclude>
<label>Max Items</label>
<config>
<type>input</type>
<size>10</size>
<max>30</max>
<eval>trim</eval>
</config>
</TCEforms>
</settings.limit>
<settings.highlight>
<TCEforms>
<exclude>1</exclude>
<label>Highlights only</label>
<config>
<type>check</type>
<default>0</default>
</config>
</TCEforms>
</settings.highlight>
<settings.todayOnly>
<TCEforms>
<exclude>1</exclude>
<label>Today only</label>
<config>
<type>check</type>
<default>0</default>
</config>
</TCEforms>
</settings.todayOnly>
<settings.pagination>
<TCEforms>
<exclude>1</exclude>
<label>Show pagination</label>
<config>
<type>check</type>
<default>0</default>
</config>
</TCEforms>
</settings.pagination>
<settings.showPID>
<TCEforms>
<exclude>1</exclude>
<label>Detail page</label>
<config>
<type>group</type>
<internal_type>db</internal_type>
<allowed>pages</allowed>
<size>1</size>
<maxitems>1</maxitems>
<minitems>0</minitems>
<show_thumbs>1</show_thumbs>
</config>
</TCEforms>
</settings.showPID>
</el>
</ROOT>
</sDEF>
<sTemplate>
<ROOT>
<TCEforms>
<sheetTitle>Template</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.template>
<exclude>1</exclude>
<label>Layout option</label>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Default</numIndex>
<numIndex index="1">default</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Costum</numIndex>
<numIndex index="1">costum</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">Table</numIndex>
<numIndex index="1">table</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">Grid</numIndex>
<numIndex index="1">grid</numIndex>
</numIndex>
</items>
<default>default</default>
</config>
</settings.template>
</el>
</ROOT>
</sTemplate>
<sConstrains>
<ROOT>
<TCEforms>
<sheetTitle>Regions &amp; Categories</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.region>
<TCEforms>
<label>Region</label>
<config>
<type>select</type>
<foreign_table>tx_events_domain_model_region</foreign_table>
<foreign_table_where>AND tx_events_domain_model_region.deleted = 0 AND tx_events_domain_model_region.hidden = 0</foreign_table_where>
<size>3</size>
<minitems>0</minitems>
<maxitems>2</maxitems>
</config>
</TCEforms>
</settings.region>
<settings.categoryCombination>
<TCEforms>
<exclude>1</exclude>
<label>Combination</label>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">And</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Or</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
</items>
<default>0</default>
</config>
</TCEforms>
</settings.categoryCombination>
<settings.categories>
<TCEforms>
<exclude>1</exclude>
<label>
Category
</label>
<config>
<type>select</type>
<autoSizeMax>20</autoSizeMax>
<foreign_table>sys_category</foreign_table>
<foreign_table_where> AND sys_category.sys_language_uid IN (-1, 0) ORDER BY sys_category.title ASC</foreign_table_where>
<maxitems>1</maxitems>
<renderMode>tree</renderMode>
<size>8</size>
<treeConfig>
<appearance>
<expandAll>1</expandAll>
<showHeader>1</showHeader>
</appearance>
<parentField>parent</parentField>
</treeConfig>
</config>
</TCEforms>
</settings.categories>
<settings.includeSubcategories>
<TCEforms>
<exclude>1</exclude>
<label>Include Subcategories</label>
<config>
<type>check</type>
<default>0</default>
</config>
</TCEforms>
</settings.includeSubcategories>
</el>
</ROOT>
</sConstrains>
</sheets>
</T3DataStructure>

View file

@ -0,0 +1,39 @@
<T3DataStructure>
<sheets>
<sSearch>
<ROOT>
<TCEforms>
<sheetTitle>Options</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.pageUid>
<TCEforms>
<exclude>1</exclude>
<label>Results page</label>
<config>
<type>group</type>
<internal_type>db</internal_type>
<allowed>pages</allowed>
<size>1</size>
<maxitems>1</maxitems>
<minitems>0</minitems>
<show_thumbs>1</show_thumbs>
</config>
</TCEforms>
</settings.pageUid>
<settings.showRegions>
<TCEforms>
<exclude>1</exclude>
<label>Show Regions</label>
<config>
<type>check</type>
<default>0</default>
</config>
</TCEforms>
</settings.showRegions>
</el>
</ROOT>
</sSearch>
</sheets>
</T3DataStructure>

View file

@ -0,0 +1,57 @@
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Options</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.backPID>
<TCEforms>
<exclude>1</exclude>
<label>Back page</label>
<config>
<type>group</type>
<internal_type>db</internal_type>
<allowed>pages</allowed>
<size>1</size>
<maxitems>1</maxitems>
<minitems>0</minitems>
<show_thumbs>1</show_thumbs>
</config>
</TCEforms>
</settings.backPID>
</el>
</ROOT>
</sDEF>
<sTemplate>
<ROOT>
<TCEforms>
<sheetTitle>Template</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.template>
<exclude>1</exclude>
<label>Layout option</label>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Default</numIndex>
<numIndex index="1">default</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Costum</numIndex>
<numIndex index="1">costum</numIndex>
</numIndex>
</items>
<default>default</default>
</config>
</settings.template>
</el>
</ROOT>
</sTemplate>
</sheets>
</T3DataStructure>

View file

@ -20,5 +20,53 @@ call_user_func(function () {
'FILE:EXT:events/Configuration/FlexForms/Pi1.xml' 'FILE:EXT:events/Configuration/FlexForms/Pi1.xml'
); );
/* Search Plugin */
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Wrm.Events',
'DateSearch',
'Events: Date Search',
'EXT:events/Resources/Public/Icons/user_plugin_events.svg'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['events_datesearch'] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
'events_datesearch',
'FILE:EXT:events/Configuration/FlexForms/DateSearch.xml'
);
/* Date List Plugin */
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Wrm.Events',
'DateList',
'Events: Date List',
'EXT:events/Resources/Public/Icons/user_plugin_events.svg'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['events_datelist'] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
'events_datelist',
'FILE:EXT:events/Configuration/FlexForms/DateList.xml'
);
/* Date Show Plugin */
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Wrm.Events',
'DateShow',
'Events: Date Show',
'EXT:events/Resources/Public/Icons/user_plugin_events.svg'
);
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['events_dateshow'] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
'events_dateshow',
'FILE:EXT:events/Configuration/FlexForms/DateShow.xml'
);
}); });

View file

@ -120,7 +120,7 @@ return [
'exclude' => true, 'exclude' => true,
'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_date.start', 'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_date.start',
'config' => [ 'config' => [
'dbType' => 'datetime', //'dbType' => 'datetime',
'type' => 'input', 'type' => 'input',
'renderType' => 'inputDateTime', 'renderType' => 'inputDateTime',
'size' => 12, 'size' => 12,
@ -132,7 +132,7 @@ return [
'exclude' => true, 'exclude' => true,
'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_date.end', 'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_date.end',
'config' => [ 'config' => [
'dbType' => 'datetime', //'dbType' => 'datetime',
'type' => 'input', 'type' => 'input',
'renderType' => 'inputDateTime', 'renderType' => 'inputDateTime',
'size' => 12, 'size' => 12,
@ -141,14 +141,6 @@ return [
], ],
], ],
/*
'event' => [
'config' => [
'type' => 'passthrough',
],
],
*/
'event' => array( 'event' => array(
'exclude' => 1, 'exclude' => 1,
'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_date.event', 'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_date.event',

View file

@ -20,10 +20,10 @@ return [
'iconfile' => 'EXT:events/Resources/Public/Icons/tx_events_domain_model_event.gif' 'iconfile' => 'EXT:events/Resources/Public/Icons/tx_events_domain_model_event.gif'
], ],
'interface' => [ 'interface' => [
'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, global_id, slug, highlight, teaser, details, price_info, name, street, district, city, zip, country, web, booking, ticket, facebook, youtube, latitude, longitude, images, categories, dates, organizer, region', 'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, global_id, slug, highlight, teaser, details, price_info, name, street, district, city, zip, country, phone, web, booking, ticket, facebook, youtube, latitude, longitude, images, categories, dates, organizer, region',
], ],
'types' => [ 'types' => [
'1' => ['showitem' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, global_id, slug, highlight, teaser, details, price_info, name, street, district, city, zip, country, web, booking, ticket, facebook, youtube, latitude, longitude, images, categories, dates, organizer, region, --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, starttime, endtime'], '1' => ['showitem' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, global_id, slug, highlight, teaser, details, price_info, name, street, district, city, zip, country, phone, web, booking, ticket, facebook, youtube, latitude, longitude, images, categories, dates, organizer, region, --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, starttime, endtime'],
], ],
'columns' => [ 'columns' => [
'sys_language_uid' => [ 'sys_language_uid' => [
@ -150,17 +150,6 @@ return [
'default' => '', 'default' => '',
], ],
], ],
/*
'slug' => [
'exclude' => true,
'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_event.slug',
'config' => [
'type' => 'input',
'size' => 30,
'eval' => 'trim'
],
],
*/
'highlight' => [ 'highlight' => [
'exclude' => true, 'exclude' => true,
'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_event.highlight', 'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_event.highlight',
@ -266,6 +255,15 @@ return [
'eval' => 'trim' 'eval' => 'trim'
], ],
], ],
'phone' => [
'exclude' => true,
'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_event.phone',
'config' => [
'type' => 'input',
'size' => 30,
'eval' => 'trim'
],
],
'web' => [ 'web' => [
'exclude' => true, 'exclude' => true,
'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_event.web', 'label' => 'LLL:EXT:events/Resources/Private/Language/locallang_db.xlf:tx_events_domain_model_event.web',

View file

@ -13,6 +13,8 @@ plugin.tx_events {
storagePid = storagePid =
} }
settings { settings {
# cat=plugin.tx_events//a; type=string; label=Default Image
defaultImagePath = typo3conf/ext/events/Resources/Public/Images/default.jpg
destinationData { destinationData {
# cat=plugin.tx_events//a; type=string; label=Rest Url # cat=plugin.tx_events//a; type=string; label=Rest Url
restUrl = http://meta.et4.de/rest.ashx/search/ restUrl = http://meta.et4.de/rest.ashx/search/
@ -21,11 +23,15 @@ plugin.tx_events {
# cat=plugin.tx_events//a; type=string; label=Data Type # cat=plugin.tx_events//a; type=string; label=Data Type
restType = Event restType = Event
# cat=plugin.tx_events//a; type=string; label=Data Limit # cat=plugin.tx_events//a; type=string; label=Data Limit
restLimit = 200 restLimit = 500
# cat=plugin.tx_events//a; type=string; label=Mode
restMode = next_months,12
# cat=plugin.tx_events//a; type=string; label=Data Template # cat=plugin.tx_events//a; type=string; label=Data Template
restTemplate = ET2014A.json restTemplate = ET2014A.json
# cat=plugin.tx_events//a; type=string; Label=Category Storage # cat=plugin.tx_events//a; type=string; Label=Category Storage
categoriesPid = 54 categoriesPid = 54
# cat=plugin.tx_events//a; type=string; Label=Category Parent ID
categoryParentUid = 6
} }
} }
} }

View file

@ -36,6 +36,7 @@ plugin.tx_events {
defaulDetailEventsPid = defaulDetailEventsPid =
defaultDetailDatesPid = defaultDetailDatesPid =
defaultImagePath = {$plugin.tx_events.settings.defaultImagePath}
paginate { paginate {
# can be overriden by plugin # can be overriden by plugin
@ -50,8 +51,10 @@ plugin.tx_events {
license = {$plugin.tx_events.settings.destinationData.license} license = {$plugin.tx_events.settings.destinationData.license}
restType = {$plugin.tx_events.settings.destinationData.restType} restType = {$plugin.tx_events.settings.destinationData.restType}
restLimit = {$plugin.tx_events.settings.destinationData.restLimit} restLimit = {$plugin.tx_events.settings.destinationData.restLimit}
restMode = {$plugin.tx_events.settings.destinationData.restMode}
restTemplate = {$plugin.tx_events.settings.destinationData.restTemplate} restTemplate = {$plugin.tx_events.settings.destinationData.restTemplate}
categoriesPid = {$plugin.tx_events.settings.destinationData.categoriesPid} categoriesPid = {$plugin.tx_events.settings.destinationData.categoriesPid}
categoryParentUid = {$plugin.tx_events.settings.destinationData.categoryParentUid}
} }
} }
} }

View file

@ -48,6 +48,9 @@
<trans-unit id="tx_events_domain_model_event.web"> <trans-unit id="tx_events_domain_model_event.web">
<source>Web</source> <source>Web</source>
</trans-unit> </trans-unit>
<trans-unit id="tx_events_domain_model_event.phone">
<source>Phone</source>
</trans-unit>
<trans-unit id="tx_events_domain_model_event.booking"> <trans-unit id="tx_events_domain_model_event.booking">
<source>Booking</source> <source>Booking</source>
</trans-unit> </trans-unit>

View file

@ -51,6 +51,9 @@
<trans-unit id="tx_events_domain_model_event.web"> <trans-unit id="tx_events_domain_model_event.web">
<source>Web</source> <source>Web</source>
</trans-unit> </trans-unit>
<trans-unit id="tx_events_domain_model_event.phone">
<source>Phone</source>
</trans-unit>
<trans-unit id="tx_events_domain_model_event.booking"> <trans-unit id="tx_events_domain_model_event.booking">
<source>Booking</source> <source>Booking</source>
</trans-unit> </trans-unit>

View file

@ -6,11 +6,13 @@
<f:if condition="{date.event.images}"> <f:if condition="{date.event.images}">
<f:then> <f:then>
<f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}"> <f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}">
<f:image src="{date.event.images.originalResource.originalFile.uid}" alt="" width="480c" height="320c" class="img-fluid img-thumbnail"/> <f:image src="{date.event.images.originalResource.originalFile.uid}" alt="{date.event.title}" title="{date.event.title}" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action> </f:link.action>
</f:then> </f:then>
<f:else> <f:else>
<img src="https://dummyimage.com/480x320/ddd/ccc" alt="Dummy" width="480" height="320" class="img-fluid img-thumbnail"/> <f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}">
<f:image src="{settings.defaultImagePath}" alt="{date.event.title}" title="{date.event.title}" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action>
</f:else> </f:else>
</f:if> </f:if>
</div> </div>
@ -19,11 +21,15 @@
{date.event.region.title} | <f:format.date format="d. m. Y - H:i">{date.start}</f:format.date> {date.event.region.title} | <f:format.date format="d. m. Y - H:i">{date.start}</f:format.date>
<h4>{date.event.title}</h4> <h4>{date.event.title}</h4>
<p>{date.event.teaser}</p> <p>{date.event.teaser}</p>
<f:comment>
<!--
<f:if condition="{date.event.highlight}"> <f:if condition="{date.event.highlight}">
<f:then> <f:then>
<b>Hightlight</b> <b>Hightlight</b>
</f:then> </f:then>
</f:if> </f:if>
-->
</f:comment>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,9 +1,9 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:widget.paginate objects="{dates}" as="paginatedDates" configuration="{itemsPerPage: 25, insertAbove: 0, insertBelow: 1, maximumNumberOfLinks: 5}"> <f:widget.paginate objects="{dates}" as="paginatedDates" configuration="{itemsPerPage: 25, insertAbove: 0, insertBelow: 1, maximumNumberOfLinks: 5, addQueryStringMethod: 'POST,GET'}">
<f:for each="{paginatedDates}" as="date"> <f:for each="{paginatedDates}" as="date" iteration="index">
<div class="row mb-3"> <div class="row mt-3 mb-3 pb-3">
<div class="col-2"> <div class="col-2">
<b><f:format.date format="H:i">{date.start}</f:format.date></b><br> <b><f:format.date format="H:i">{date.start}</f:format.date></b><br>
<b><f:format.date format="%a">{date.start}</f:format.date></b><br> <b><f:format.date format="%a">{date.start}</f:format.date></b><br>
@ -11,28 +11,46 @@
{date.event.region.title}<br> {date.event.region.title}<br>
</div> </div>
<div class="col-6"> <div class="col-6">
<h4>{date.event.title}</h4>
<h5>{date.event.teaser}</h5> <f:comment>
<f:format.crop maxCharacters="150">{date.event.details}</f:format.crop> <!--
<f:if condition="{date.event.highlight}"> <f:if condition="{date.event.highlight}">
<f:then> <f:then>
<b>Hightlight</b> <b>Highlight</b>
</f:then> </f:then>
</f:if> </f:if>
-->
</f:comment>
<h4>
<f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}">
{date.event.title}
</f:link.action>
</h4>
<p><strong>{date.event.teaser}</strong></p>
<f:format.crop maxCharacters="150">{date.event.details}</f:format.crop>
</div> </div>
<div class="col-3"> <div class="col-4">
<f:if condition="{date.event.images}"> <f:if condition="{date.event.images}">
<f:then> <f:then>
<f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}"> <f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}">
<f:image src="{date.event.images.originalResource.originalFile.uid}" alt="" width="480c" height="240c" class="img-fluid img-thumbnail"/> <f:image src="{date.event.images.originalResource.originalFile.uid}" alt="" width="400c" height="280c" class="img-fluid img-thumbnail"/>
</f:link.action> </f:link.action>
</f:then> </f:then>
<f:else> <f:else>
<img src="https://dummyimage.com/480x320/ddd/ccc" alt="Dummy" width="320" height="320" class="img-fluid img-thumbnail"/> <f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}">
<img src="{settings.defaultImagePath}" alt="Dummy" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action>
</f:else> </f:else>
</f:if> </f:if>
</div> </div>
</div> </div>
<f:if condition="{index.isLast}">
<f:then>
</f:then>
<f:else>
<div class="mb-3 border-bottom"></div>
</f:else>
</f:if>
</f:for> </f:for>
</f:widget.paginate> </f:widget.paginate>

View file

@ -1,9 +1,10 @@
{namespace wrm=Wrm\Events\ViewHelpers}
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="row">
<div class="col-8 mb-5">
<!-- TODO bg color classes not loaded in scss -->
<f:form action="search" controller="Date" additionalAttributes="{role: 'form'}" method="get"> <div class="row">
<div class="col-12 mb-5">
<!-- TODO bg color classes not loaded in scss -->
<f:form action="list" controller="Date" pluginName="DateList" method="get" addQueryString="1" id="events_search" name="events_search">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
@ -60,6 +61,5 @@
<f:form.submit value="Suchen" class="btn btn-primary" /> <f:form.submit value="Suchen" class="btn btn-primary" />
</div> </div>
</f:form> </f:form>
</div> </div>
</div> </div>

View file

@ -1,59 +1,75 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Default" />
<f:section name="content">
<div class="row">
<div class="col-12 mb-5">
<f:form action="list" controller="Date" pluginName="DateList" method="get" id="events_search" name="events_search">
<div class="row">
<div class="col">
<div class="form-group">
<label for="searchword">Suchwort</label>
<f:form.textfield type="text" class="form-control" id="searchword" name="searchword" value="{searchword}" />
</div>
</div>
</div>
<f:comment><!--
<div class="row">
<div class="col">
<div class="form-group form-check">
<f:form.checkbox class="form-check-input" id="considerDate" name="considerDate" value="1" checked="{considerDate} == 1" />
<label class="form-check-label" for="considerDate">Datum berücksichtigen?</label>
</div>
</div>
</div>
--></f:comment>
<div class="row">
<div class="col col-md-6">
<div class="form-group">
<label for="start">Datum von</label>
<div class="input-group date" id="date_start" data-target-input="nearest">
<f:form.textfield type="text" class="form-control datetimepicker-input" id="start" name="start" value="{start}" additionalAttributes="{data-target: '#date_start'}" />
<div class="input-group-append" data-target="#date_start" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fa fa-calendar"></i></div>
</div>
</div>
</div>
</div>
<div class="col col-md-6">
<div class="form-group">
<label for="end">Datum bis</label>
<div class="input-group date" id="date_end" data-target-input="nearest">
<f:form.textfield type="text" class="form-control datetimepicker-input" id="start" name="end" value="{end}" additionalAttributes="{data-target: '#date_end'}" />
<div class="input-group-append" data-target="#date_end" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fa fa-calendar"></i></div>
</div>
</div>
</div>
</div>
</div>
<f:if condition="{settings.showRegions}">
<div class="row">
<div class="col-4 col-md-3 col-lg-3">
<div class="form-check">
<f:form.radio class="form-check-input" name="region" value="{region.uid}" checked="{selRegion}==0" id="radio_0"/>
<label class="form-check-label" for="radio_0">Alle Städte</label>
</div>
</div>
<f:render partial="Date/SearchForm" arguments="{searchword: searchword, dates: dates, regions: regions, selRegion: selRegion, start: start, end: end}"/> <f:for each="{regions}" as="region">
<div class="col-3">
<hr class="mt-2 mb-4"> <div class="form-check">
<f:form.radio class="form-check-input" name="region" value="{region.uid}" checked="{selRegion}=={region.uid}" id="radio_{region.uid}"/>
<f:widget.paginate objects="{dates}" as="paginatedDates" configuration="{itemsPerPage: 25, insertAbove: 0, insertBelow: 1, maximumNumberOfLinks: 5, addQueryStringMethod: 'POST,GET'}"> <label class="form-check-label" for="radio_{region.uid}">{region.title}</label>
<f:for each="{paginatedDates}" as="date" iteration="index">
<div class="row mt-3 mb-3 pb-3">
<div class="col-2">
<b><f:format.date format="H:i">{date.start}</f:format.date></b><br>
<b><f:format.date format="%a">{date.start}</f:format.date></b><br>
<b><f:format.date format="d.m.">{date.start}</f:format.date></b><br>
{date.event.region.title}<br>
</div>
<div class="col-6">
<f:if condition="{date.event.highlight}">
<f:then>
<b>Hightlight</b>
</f:then>
</f:if>
<h4>
<f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}">
{date.event.title}
</f:link.action>
</h4>
<p><strong>{date.event.teaser}</strong></p>
<f:format.crop maxCharacters="150">{date.event.details}</f:format.crop>
<pre style="margin-top:15px; font-size:80%;">
DEBUGGING:
GLOBAL EVENT ID: {date.event.globalId}
</pre>
</div>
<div class="col-4">
<f:if condition="{date.event.images}">
<f:then>
<f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}">
<f:image src="{date.event.images.originalResource.originalFile.uid}" alt="" width="400c" height="280c" class="img-fluid img-thumbnail"/>
</f:link.action>
</f:then>
<f:else>
<f:link.action pageUid="{settings.showPID}" action="show" controller="Date" arguments="{date: date}">
<img src="https://dummyimage.com/400x280/ddd/ccc" alt="Dummy" width="400" height="280" class="img-fluid img-thumbnail"/>
</f:link.action>
</f:else>
</f:if>
</div> </div>
</div> </div>
<f:if condition="{index.isLast}">
<f:then>
</f:then>
<f:else>
<div class="mb-3 border-bottom"></div>
</f:else>
</f:if>
</f:for> </f:for>
</f:widget.paginate> </div>
</f:if>
<div class="form-group mt-3">
<f:form.submit value="Suchen" class="btn btn-primary" />
</div>
</f:form>
</div>
</div>
</f:section>
</html> </html>

View file

@ -0,0 +1,68 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Default" />
<f:section name="content">
<div class="row">
<div class="col-12 mb-5">
<!-- TODO bg color classes not loaded in scss -->
<form action="{settings.resultPID}" controller="Date" extensionName="events" method="get" addQueryString="1" id="events_search" name="events_search">
<div class="row">
<div class="col">
<div class="form-group">
<label for="searchword">Suchwort</label>
<input type="text" class="form-control" id="searchword" name="searchword" value="{searchword}" />
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="form-group">
<label for="start">Datum von</label>
<div class="input-group date" id="date_start" data-target-input="nearest">
<input type="text" class="form-control datetimepicker-input" id="start" name="start" value="{start}" additionalAttributes="{data-target: '#date_start'}" />
<div class="input-group-append" data-target="#date_start" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fa fa-calendar"></i></div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="form-group">
<label for="end">Datum bis</label>
<div class="input-group date" id="date_end" data-target-input="nearest">
<input type="text" class="form-control datetimepicker-input" id="end" name="end" value="{end}" additionalAttributes="{data-target: '#date_end'}" />
<div class="input-group-append" data-target="#date_end" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fa fa-calendar"></i></div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-3">
<div class="form-check">
<input type="radio" class="form-check-input" name="region" value="{region.uid}" checked="{selRegion}==0" id="radio_0"/>
<label class="form-check-label" for="radio_0">Alle Städte</label>
</div>
</div>
<f:for each="{regions}" as="region">
<div class="col-3">
<div class="form-check">
<input type="radio" class="form-check-input" name="region" value="{region.uid}" checked="{selRegion}=={region.uid}" id="radio_{region.uid}"/>
<label class="form-check-label" for="radio_{region.uid}">{region.title}</label>
</div>
</div>
</f:for>
</div>
<div class="form-group mt-3">
<input type="submit" value="Suchen" class="btn btn-primary" />
</div>
</form>
</div>
</div>
</f:section>
</html>

View file

@ -8,7 +8,7 @@
<f:image src="{date.event.images.originalResource.originalFile.uid}" alt="" width="480c" height="320c" class="img-fluid img-thumbnail"/> <f:image src="{date.event.images.originalResource.originalFile.uid}" alt="" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:then> </f:then>
<f:else> <f:else>
<img src="https://dummyimage.com/480x320/ddd/ccc" alt="Dummy" width="480" height="320" class="img-fluid img-thumbnail"/> <img src="{settings.defaultImagePath}" alt="Dummy" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:else> </f:else>
</f:if> </f:if>
</div> </div>
@ -23,15 +23,47 @@
<f:format.html>{date.event.details}</f:format.html> <f:format.html>{date.event.details}</f:format.html>
<p>{event.price_info}</p> <p>{event.price_info}</p>
</div>
</div>
<div class="row">
<div class="col mt-3 mb-3">
</div>
</div>
<div class="row"> <div class="row">
<div class="col-4"> <div class="col-4">
<p>Veranstaltungsort:<br> <p><b>Preis:</b><br>
<f:if condition="{date.event.priceInfo}">
<f:then>
<f:format.nl2br>{date.event.priceInfo}</f:format.nl2br>
</f:then>
<f:else>
Keine Information
</f:else>
</f:if>
</p>
<f:if condition="{date.event.web}">
<p><b>Weitere Informationen:</b><br>
<a href="{date.event.web}" target="_blank">Website</a>
</p>
</f:if>
</div>
<div class="col-4">
<p><b>Veranstaltungsort:</b><br>
{date.event.street}<br> {date.event.street}<br>
{date.event.zip} {date.event.city}<br> {date.event.zip} {date.event.city}<br>
{date.event.phone}<br>
</p> </p>
</div> </div>
</div> <div class="col-4">
<p><b>Veranstalter:</b><br>
{date.event.organizer.name}<br>
{date.event.organizer.street}<br>
{date.event.organizer.zip} {date.event.organizer.city}<br>
{date.event.organizer.phone}<br>
<a href="{date.event.organizer.web}" target="_blank">Website</a>
</p>
</div> </div>
</div> </div>
</f:section> </f:section>

View file

@ -13,11 +13,13 @@
<f:if condition="{date.event.images}"> <f:if condition="{date.event.images}">
<f:then> <f:then>
<f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}"> <f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}">
<f:image src="{date.event.images.originalResource.originalFile.uid}" alt="" width="480c" height="320c" class="img-fluid img-thumbnail"/> <f:image src="{date.event.images.originalResource.originalFile.uid}" alt="{date.event.title}" title="{date.event.title}" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action> </f:link.action>
</f:then> </f:then>
<f:else> <f:else>
<img src="https://dummyimage.com/480x320/ddd/ccc" alt="Dummy" width="480" height="320" class="img-fluid img-thumbnail"/> <f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}">
<f:image src="{settings.defaultImagePath}" alt="{date.event.title}" title="{date.event.title}" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action>
</f:else> </f:else>
</f:if> </f:if>
</div> </div>

View file

@ -9,11 +9,13 @@
<f:if condition="{event.images}"> <f:if condition="{event.images}">
<f:then> <f:then>
<f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}"> <f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}">
<f:image src="{event.images.originalResource.originalFile.uid}" alt="" width="480c" height="320c" class="img-fluid img-thumbnail"/> <f:image src="{event.images.originalResource.originalFile.uid}" alt="{date.event.title}" title="{date.event.title}" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action> </f:link.action>
</f:then> </f:then>
<f:else> <f:else>
<img src="https://dummyimage.com/480x320/ddd/ccc" alt="Dummy" width="480" height="320" class="img-fluid img-thumbnail"/> <f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}">
<f:image src="{settings.defaultImagePath}" alt="{date.event.title}" title="{date.event.title}" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action>
</f:else> </f:else>
</f:if> </f:if>
</div> </div>

View file

@ -11,7 +11,9 @@
</f:link.action> </f:link.action>
</f:then> </f:then>
<f:else> <f:else>
<img src="https://dummyimage.com/480x320/ddd/ccc" alt="Dummy" width="480" height="320" class="img-fluid img-thumbnail"/> <f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}">
<img src="{settings.defaultImagePath}" alt="Dummy" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action>
</f:else> </f:else>
</f:if> </f:if>
</div> </div>

View file

@ -10,7 +10,9 @@
</f:link.action> </f:link.action>
</f:then> </f:then>
<f:else> <f:else>
<img src="https://dummyimage.com/480x320/ddd/ccc" alt="Dummy" width="480" height="320" class="img-fluid img-thumbnail"/> <f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}">
<img src="{settings.defaultImagePath}" alt="Dummy" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action>
</f:else> </f:else>
</f:if> </f:if>
</div> </div>

View file

@ -9,11 +9,13 @@
<f:if condition="{event.images}"> <f:if condition="{event.images}">
<f:then> <f:then>
<f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}"> <f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}">
<f:image src="{event.images.originalResource.originalFile.uid}" alt="" width="480c" height="320c" class="img-fluid img-thumbnail"/> <f:image src="{event.images.originalResource.originalFile.uid}" alt="{date.event.title}" title="{date.event.title}" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action> </f:link.action>
</f:then> </f:then>
<f:else> <f:else>
<img src="https://dummyimage.com/480x320/ddd/ccc" alt="Dummy" width="480" height="320" class="img-fluid img-thumbnail"/> <f:link.action pageUid="{settings.showPID}" action="show" controller="Event" arguments="{event: event}">
<f:image src="{settings.defaultImagePath}" alt="{date.event.title}" title="{date.event.title}" width="480c" height="320c" class="img-fluid img-thumbnail"/>
</f:link.action>
</f:else> </f:else>
</f:if> </f:if>
</div> </div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -5,6 +5,7 @@ call_user_func(
function() function()
{ {
/*
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin( \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Wrm.Events', 'Wrm.Events',
'Pi1', 'Pi1',
@ -17,6 +18,49 @@ call_user_func(
'Date' => 'teaser, list, show, search' 'Date' => 'teaser, list, show, search'
] ]
); );
*/
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Wrm.Events',
'DateSearch',
[
'Date' => 'search'
],
[
'Date' => 'search'
]
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Wrm.Events',
'DateList',
[
'Date' => 'list'
],
[
'Date' => 'list'
]
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Wrm.Events',
'DateShow',
[
'Date' => 'show'
],
[
'Date' => 'show'
]
);
/*
$iconRegistry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Imaging\IconRegistry::class);
$iconRegistry->registerIcon(
'events-plugin',
\TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider::class,
['source' => 'EXT:events/Resources/Public/Icons/user_plugin_events.svg']
);
// wizards // wizards
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig( \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig(
@ -37,14 +81,6 @@ call_user_func(
} }
}' }'
); );
*/
$iconRegistry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Imaging\IconRegistry::class);
$iconRegistry->registerIcon(
'events-plugin',
\TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider::class,
['source' => 'EXT:events/Resources/Public/Icons/user_plugin_events.svg']
);
} }
); );

View file

@ -28,6 +28,31 @@ CREATE TABLE tx_events_domain_model_event (
dates int(11) unsigned DEFAULT '0' NOT NULL, dates int(11) unsigned DEFAULT '0' NOT NULL,
organizer int(11) unsigned DEFAULT '0', organizer int(11) unsigned DEFAULT '0',
region int(11) unsigned DEFAULT '0', region int(11) unsigned DEFAULT '0',
title varchar(255) DEFAULT '' NOT NULL,
global_id varchar(255) DEFAULT '' NOT NULL,
slug varchar(255) DEFAULT '' NOT NULL,
highlight smallint(5) unsigned DEFAULT '0' NOT NULL,
teaser text,
details text,
price_info text,
street varchar(255) DEFAULT '' NOT NULL,
district varchar(255) DEFAULT '' NOT NULL,
city varchar(255) DEFAULT '' NOT NULL,
zip varchar(255) DEFAULT '' NOT NULL,
country varchar(255) DEFAULT '' NOT NULL,
web varchar(255) DEFAULT '' NOT NULL,
phone varchar(255) DEFAULT '' NOT NULL,
booking varchar(255) DEFAULT '' NOT NULL,
ticket varchar(255) DEFAULT '' NOT NULL,
facebook varchar(255) DEFAULT '' NOT NULL,
youtube varchar(255) DEFAULT '' NOT NULL,
latitude varchar(255) DEFAULT '' NOT NULL,
longitude varchar(255) DEFAULT '' NOT NULL,
images int(11) unsigned NOT NULL default '0',
categories int(11) DEFAULT '0' NOT NULL,
dates int(11) unsigned DEFAULT '0' NOT NULL,
organizer int(11) unsigned DEFAULT '0',
region int(11) unsigned DEFAULT '0',
KEY dataHandler (l10n_parent, t3ver_oid, deleted, t3ver_wsid, t3ver_state) KEY dataHandler (l10n_parent, t3ver_oid, deleted, t3ver_wsid, t3ver_state)
); );
@ -53,12 +78,9 @@ CREATE TABLE tx_events_domain_model_organizer (
# Table structure for table 'tx_events_domain_model_date' # Table structure for table 'tx_events_domain_model_date'
# #
CREATE TABLE tx_events_domain_model_date ( CREATE TABLE tx_events_domain_model_date (
event int(11) unsigned DEFAULT '0' NOT NULL, event int(11) unsigned DEFAULT '0' NOT NULL,
start int(11) DEFAULT NULL,
start datetime DEFAULT NULL, end int(11) DEFAULT NULL,
end datetime DEFAULT NULL,
KEY event (event), KEY event (event),
KEY dataHandler (event, t3ver_wsid, pid) KEY dataHandler (event, t3ver_wsid, pid)
); );