* @owner University of Latvia * @version 2.0.0 * @since 20.07.2018 * * @package Lu\LuNabamusic\Controller */ class FrontController extends ActionController { /** * @var SongRepository */ private $songRepository; /** * Frontend-Session * * @var \Lu\LuNabamusic\Domain\Session\FrontendSessionHandler */ protected $frontendSession; /** * Frontend- or Backend-Session * The type of session is set automatically in initializeAction(). * * @var \Lu\LuNabamusic\Domain\Session\SessionHandler */ protected $session; /** * Current page ID * * @var int */ protected $pageUid; /** * Plugin configuration settings * * @var array */ private $conf; /** * MusicController constructor. * * Assign page ID */ public function __construct() { if (!$this->pageUid) { $this->pageUid = $_REQUEST['id']; } // Fetch config $this->conf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('lu_nabamusic'); } /** * Inject the product repository * * @param \Lu\LuNabamusic\Domain\Repository\SongRepository $songRepository */ public function injectProductRepository(SongRepository $songRepository) { $this->songRepository = $songRepository; } /** * List Action * * @return void */ public function listAction() { // Preset used variables $playModel = new Play(); $swap = $this->settings['pluginType'] ?? ''; $cacheHelper = new CacheHelper(); $data = []; // Swap view types @TODO Make data gather to methods! switch ($swap) { default: case "frontpageTop": $data = $this->getTopSongs(); $this->setTemplateUrl('Front/MiniList.html'); break; case "extendedTop": $data = $this->getTopSongs(); // Add CSS and JavaScript files $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class); $pageRenderer->addCssFile("/typo3conf/ext/lu_nabamusic/Resources/Public/Css/tinyPlayer.css"); $pageRenderer->addCssFile("https://netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/scripts.js"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/howler.min.js"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/tinyPlayer.js"); break; case "frontpageLive": // Check to small song list, if voting not allowed $data = [ 'programme' => $playModel->getCurrentProgramme(), 'songString' => $playModel->getCurrentSong(true), ]; // Add scripts for correct frontend remndering $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/jquery-3.4.1.min.js"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/jquery.hammer.js"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/lunabamusic.js"); // Set custom view $this->setTemplateUrl('Front/FrontLive.html'); break; case "monthSearch": $args = $this->request->getArguments(); $pickedMonth = $args['month']; $limit = $this->settings['songsInTop'] ? $this->settings['songsInTop'] : 50; if ($pickedMonth) { $data['mostPlayedSongs'] = [ 'songs' => $playModel->getMostPlayedSongs($limit, $pickedMonth), 'month' => $pickedMonth ]; } else { $data['mostPlayedSongs'] = [ 'songs' => $cacheHelper->get('most_played_songs') ?: $playModel->getMostPlayedSongs($limit), ]; } $this->setTemplateUrl('Front/SongHistoryMonth.html'); $this->request->setArguments([]); $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class); $pageRenderer->addCssFile("https://netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/bootstrap-datepicker.min.js"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/bootstrap-datepicker.lv.min.js"); $pageRenderer->addCssFile("/typo3conf/ext/lu_nabamusic/Resources/Public/Css/bootstrap-datepicker3.min.css"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/datepicker-setup.js"); break; case "search": $args = $this->request->getArguments(); $pickedDay = $args['date']; $query = $args['name']; // If date or query was passed in search for them // Otherwise get songs played on current day if ($pickedDay || $query) { $data['mostPlayedSongs'] = [ 'songs' => $playModel->searchSongs($pickedDay, $query), 'date' => $pickedDay, 'name' => $query ]; } else { $data['mostPlayedSongs'] = [ 'songs' => $cacheHelper->get('todays_songs') ?: $playModel->getTodaysSongs(), ]; } $this->setTemplateUrl('Front/SongSearch.html'); $this->request->setArguments([]); $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class); $pageRenderer->addCssFile("https://netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/bootstrap-datepicker.min.js"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/bootstrap-datepicker.lv.min.js"); $pageRenderer->addCssFile("/typo3conf/ext/lu_nabamusic/Resources/Public/Css/bootstrap-datepicker3.min.css"); $pageRenderer->addJsFooterFile("/typo3conf/ext/lu_nabamusic/Resources/Public/JavaScript/datepicker-setup.js"); break; } // Assign data to view $this->view->assign('data', $data); } /** * Get songs from cache * * @return mixed */ private function getTopSongs() { $cacheHelper = new CacheHelper(); $data = $cacheHelper->get('naba_top_'.$this->settings['songsInTop']); $UriBuilder = $this->controllerContext->getUriBuilder()->reset()->setCreateAbsoluteUri(true); // If songs list is not cached do it now if(!$data) { GeneralUtility::makeInstance(Top::class)->executeCron(); $data = $cacheHelper->get('naba_top_'.$this->settings['songsInTop']); } foreach ($data['songs'] as $key => $item) { // Create voting url $data['songs'][$key]['votes']['current']['plus'] = $UriBuilder->reset()->setCreateAbsoluteUri(true)->uriFor('increase', ['time_period' => $data['currentDate'], 'song_id' => $item[0], 'admin' => true], 'Votes'); } // Add full list view url $data['fullListView'] = !empty($this->settings['fullListView']) ? $this->settings['fullListView'] : 0; return $data; } /** * Returns the LanguageService * * @return LanguageService */ protected function getLanguageService() { return $GLOBALS['LANG'] ?? LanguageService::createFromUserPreferences($GLOBALS['BE_USER']); } /** * Get a CSRF token * * @param bool $tokenOnly Set it to TRUE to get only the token, otherwise including the &moduleToken= as prefix * * @return string */ protected function getToken($tokenOnly = false) { $token = FormProtectionFactory::get()->generateToken('moduleCall', 'web_LuNabamusicMusic'); if ($tokenOnly) { return $token; } else { return '&moduleToken='.$token; } } /** * Get tempate path with config params and sets the it * * @param $name * * @return string */ private function setTemplateUrl($name) { $extbaseFrameworkConfiguration = $this->configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); if (is_array($extbaseFrameworkConfiguration['view']['templateRootPaths'])) { for ($k = sizeof($extbaseFrameworkConfiguration['view']['templateRootPaths']); $k--; $k < 0) { $templateRootPath = $extbaseFrameworkConfiguration['view']['templateRootPaths'][$k]; if (!empty($templateRootPath)) { break; } } } $tempaltePath = trim($templateRootPath, ' /') . '/' . $name; $this->view->setTemplatePathAndFilename($tempaltePath); } }