diff --git a/Classes/Controller/JoblistController.php b/Classes/Controller/JoblistController.php index 19418c4315762ecb1bc39057ede505474f3cdf66..fa79eff828ba1434564b4ad08333098213db2c44 100644 --- a/Classes/Controller/JoblistController.php +++ b/Classes/Controller/JoblistController.php @@ -123,15 +123,28 @@ class JoblistController extends ActionController { $this->jobRepository = $jobRepository; } + /** + * Initialize the indexAction to set the currentPageBrowserPage parameter + * + * @throws \TYPO3\CMS\Extbase\Mvc\Exception\InvalidArgumentNameException + */ + public function initializeIndexAction() { + $currentPageBrowserPage = (int) GeneralUtility::_GP('tx_sgjobs_pagebrowser')['currentPage']; + if ($currentPageBrowserPage > 0) { + $this->request->setArgument('currentPageBrowserPage', $currentPageBrowserPage); + } + } + /** * Show all job offers and options to manage them * * @param array $filters * @param int $jobId + * @param int $currentPageBrowserPage * @return void - * @throws \InvalidArgumentException + * @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException */ - public function indexAction(array $filters = [], $jobId = NULL): void { + public function indexAction(array $filters = [], int $jobId = NULL, int $currentPageBrowserPage = 0): void { if ($filters) { $this->view->assign('selectedCountry', $filters['filterCountry']); $this->view->assign('selectedCompany', $filters['filterCompany']); @@ -167,7 +180,6 @@ class JoblistController extends ActionController { } else { // pagination logic $offset = 0; - $currentPageBrowserPage = (int) GeneralUtility::_GP('tx_sgjobs_pagebrowser')['currentPage']; if ($currentPageBrowserPage && $jobLimit) { $offset = $currentPageBrowserPage * $jobLimit; } @@ -203,16 +215,15 @@ class JoblistController extends ActionController { /** * Renders the application form with an optional job * - * @param JobApplication $applyData + * @param JobApplication|null $applyData * @param string $error * @param int $jobId + * @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\InvalidArgumentNameException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException - * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException - * @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException */ - public function applyFormAction(JobApplication $applyData = NULL, $error = NULL, $jobId = NULL): void { - if ($error !== NULL && $error !== '') { + public function applyFormAction(JobApplication $applyData = NULL, string $error = '', int $jobId = NULL): void { + if ($error !== '') { $this->view->assign('internalError', $error); $this->request->setArgument('error', NULL); } @@ -302,7 +313,6 @@ class JoblistController extends ActionController { * @return void * @throws NoSuchArgumentException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException - * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException */ protected function initializeApplyAction(): void { try { @@ -333,17 +343,14 @@ class JoblistController extends ActionController { * @param string $folderName * @return void * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException - * @throws \RuntimeException - * @throws \InvalidArgumentException - * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException - * @throws \TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException */ protected function submitApplicationFiles(JobApplication $applicationData, $folderName): void { $resourceFactory = $this->objectManager->get(ResourceFactory::class); $newName = \date('Ymd-His') . '_' . $applicationData->getJobId() . '-' . $applicationData->getFirstName() . '-' . $applicationData->getLastName(); $storage = $resourceFactory->getStorageObject(1); - $applicationFilePath = Environment::getPublicPath() . '/' . $storage->getConfiguration()['basePath'] . 'JobApplication/' . $folderName . + $applicationFilePath = Environment::getPublicPath() . '/' . $storage->getConfiguration( + )['basePath'] . 'JobApplication/' . $folderName . '/' . $newName . '.csv'; $this->writeApplicationFile($applicationData, $applicationFilePath); } @@ -363,9 +370,7 @@ class JoblistController extends ActionController { $applyData->setPid($GLOBALS['TSFE']->id); $job = $applyData->getJob(); // look for a configured default job, in case of unsolicited application - if (($job === '' || $job === NULL || $applyData->getJobId() === NULL) - && $applyData->getCompany() !== NULL - ) { + if ((!$job || $applyData->getJobId() === NULL) && $applyData->getCompany() !== NULL) { $applyData->setJobId($applyData->getCompany()->getJobId()); } @@ -378,7 +383,6 @@ class JoblistController extends ActionController { $this->moveTmpFolder($folderName); $this->submitApplicationFiles($applyData, $folderName); - /** @noinspection PhpMethodParametersCountMismatchInspection */ $mailService = $this->objectManager->get( MailTemplateService::class, 'application_mail', 'sg_jobs', $this->getApplicationMailMarkers($applyData) @@ -426,8 +430,11 @@ class JoblistController extends ActionController { $redirectPageUid = (int) $this->settings['redirectPage']; if ($redirectPageUid) { - $url = $this->configurationManager->getContentObject()->getTypoLink_URL($redirectPageUid); - $this->redirectToUri($url); + $contentObject = $this->configurationManager->getContentObject(); + if ($contentObject) { + $url = $contentObject->getTypoLink_URL($redirectPageUid); + $this->redirectToUri($url); + } } $this->redirect('applyForm'); @@ -448,7 +455,7 @@ class JoblistController extends ActionController { * Assign filter values * * @param int $rootPageId - * @throws \InvalidArgumentException + * @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException */ protected function assignFilterValues($rootPageId): void { $countries = $this->companyRepository->getAllCountries($rootPageId); @@ -473,7 +480,7 @@ class JoblistController extends ActionController { * @param JobApplication $applyData * @return array */ - protected function getApplicationMailMarkers($applyData): array { + protected function getApplicationMailMarkers(JobApplication $applyData): array { $location = ''; if ($applyData->getCompany() !== NULL) { $location = $applyData->getCompany()->getCity(); @@ -499,13 +506,36 @@ class JoblistController extends ActionController { * * @param JobApplication $data * @param string $filePath - * @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException - * @throws \InvalidArgumentException - * @throws \RuntimeException - * @throws \TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException */ protected function writeApplicationFile(JobApplication $data, $filePath): void { + $coverLetter = ''; + $coverLetterObject = $data->getCoverLetter(); + if ($coverLetterObject) { + $coverLetterObject = $coverLetterObject->getOriginalResource(); + if ($coverLetterObject) { + $coverLetter = $coverLetterObject->getPublicUrl(); + } + } + + $cv = ''; + $cvObject = $data->getCv(); + if ($cvObject) { + $cvObject = $cvObject->getOriginalResource(); + if ($cvObject) { + $cv = $cvObject->getPublicUrl(); + } + } + + $certificate = ''; + $certificateObject = $data->getCertificate(); + if ($certificateObject) { + $certificateObject = $certificateObject->getOriginalResource(); + if ($certificateObject) { + $certificate = $certificateObject->getPublicUrl(); + } + } + $dataToInsertArr = [ $data->getJobId(), $data->getFirstName(), @@ -520,9 +550,9 @@ class JoblistController extends ActionController { $data->getNationality(), $data->getPhone(), $data->getEmail(), - $data->getCoverLetter() === NULL ? '' : $data->getCoverLetter()->getOriginalResource()->getPublicUrl(), - $data->getCv() === NULL ? '' : $data->getCv()->getOriginalResource()->getPublicUrl(), - $data->getCertificate() === NULL ? '' : $data->getCertificate()->getOriginalResource()->getPublicUrl(), + $coverLetter, + $cv, + $certificate, $data->getMessage() ]; @@ -583,7 +613,7 @@ class JoblistController extends ActionController { /** * If for any reason something goes wrong, delete the tmp upload folder * - * @return string|void + * @return void * @throws NoSuchArgumentException */ public function errorAction() { diff --git a/Classes/ViewHelpers/PageBrowserViewHelper.php b/Classes/ViewHelpers/PageBrowserViewHelper.php index dd46580760627f5b47b7527ff5997dca115c324e..4679093d30963c032d04d03400ae310c0499bfb7 100644 --- a/Classes/ViewHelpers/PageBrowserViewHelper.php +++ b/Classes/ViewHelpers/PageBrowserViewHelper.php @@ -28,26 +28,32 @@ namespace SGalinski\SgJobs\ViewHelpers; use TYPO3\CMS\Core\TypoScript\TypoScriptService; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Fluid\View\StandaloneView; -use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper; /** * View helper that renders a page browser based upon the pagebrowse extension. * * Example: - * {namespace sg=SGalinski\SgJobs\ViewHelpers} + * {namespace sg=SGalinski\SgNews\ViewHelpers} * <sg:pageBrowser numberOfPages="" /> */ class PageBrowserViewHelper extends AbstractViewHelper { + /** + * Specifies whether the escaping interceptors should be disabled or enabled for the render-result of this ViewHelper + * + * @see isOutputEscapingEnabled() + * + * @var boolean + */ + protected $escapeOutput = FALSE; /** - * Register the ViewHelper arguments + * Initialize the ViewHelpers arguments */ public function initializeArguments() { parent::initializeArguments(); - $this->registerArgument('numberOfPages', 'int', 'The number of pages', TRUE); + $this->registerArgument('numberOfPages', 'int', 'The number of pages to browse', TRUE); } /** @@ -57,27 +63,31 @@ class PageBrowserViewHelper extends AbstractViewHelper { * @throws \UnexpectedValueException */ public function render(): string { + /** @var TypoScriptService $typoScriptService */ $typoScriptService = GeneralUtility::makeInstance(TypoScriptService::class); - $configuration = $typoScriptService->convertTypoScriptArrayToPlainArray($GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_sgjobs.']); + $configuration = $typoScriptService->convertTypoScriptArrayToPlainArray( + $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_sgjobs.'] + ); $view = GeneralUtility::makeInstance(StandaloneView::class); $view->setRenderingContext($this->renderingContext); - $view->setTemplate('PageBrowser/Index'); $view->setTemplateRootPaths($configuration['view']['templateRootPaths']); $view->setPartialRootPaths($configuration['view']['partialRootPaths']); $view->setLayoutRootPaths($configuration['view']['layoutRootPaths']); - $pageBrowserVars = GeneralUtility::_GP('tx_sgnews_pagebrowser'); + $view->setTemplate('PageBrowser/Index'); + + $currentPage = 0; + $pageBrowserVars = GeneralUtility::_GP('tx_sgjobs_pagebrowser'); if (isset($pageBrowserVars['currentPage']) && (int) $pageBrowserVars['currentPage'] > 0) { $currentPage = (int) $pageBrowserVars['currentPage']; - } else { - $currentPage = 1; } $pageLinks = []; - $start = \max($currentPage - 1, 1); + $start = \max($currentPage - 2, 0); $end = \min($this->arguments['numberOfPages'], $currentPage + 2); for ($i = $start; $i < $end; $i++) { $pageLinks[] = [ - 'number' => $i, + 'number' => $i + 1, + 'page' => $i, 'isCurrentPage' => $i === $currentPage, ]; } @@ -88,7 +98,7 @@ class PageBrowserViewHelper extends AbstractViewHelper { 'enableMorePages' => 1, 'pageLinks' => $pageLinks, 'currentPage' => $currentPage, - 'prevPageExist' => $currentPage > 1, + 'prevPageExist' => $currentPage >= 1, 'showLessPages' => ($currentPage - 1) > 1, 'showNextPages' => ($currentPage + 2) < $this->arguments['numberOfPages'], 'nextPageExist' => $currentPage < $this->arguments['numberOfPages'] - 1, diff --git a/Resources/Private/Templates/PageBrowser/Index.html b/Resources/Private/Templates/PageBrowser/Index.html index 90600cdca33bb71c504dd2d4ac04ae7874fe3d7d..fbc785d413113b7a4e9628bfcece2cdbd05c78b4 100644 --- a/Resources/Private/Templates/PageBrowser/Index.html +++ b/Resources/Private/Templates/PageBrowser/Index.html @@ -1,6 +1,6 @@ {namespace sg=SGalinski\SgJobs\ViewHelpers} -<f:layout name="PageBrowser" /> +<f:layout name="PageBrowser"/> <f:section name="main"> <nav> @@ -8,8 +8,8 @@ <f:if condition="{prevPageExist}"> <f:then> <li class="tx-pagebrowse-prev"> - <f:variable name="prevPage" value="{currentPage - 1}" /> - <f:link.action additionalParams="{tx_sgnews_pagebrowser: {currentPage: prevPage}}" + <f:variable name="prevPage" value="{currentPage - 1}"/> + <f:link.action addQueryString="1" additionalParams="{tx_sgjobs_pagebrowser: {currentPage: prevPage}}" additionalAttributes="{aria-label: 'Previous'}"> « </f:link.action> @@ -28,8 +28,8 @@ <f:if condition="{enableLessPages} && {showLessPages}"> <li> - <f:variable name="lessPage" value="{currentPage - 2}" /> - <f:link.action additionalParams="{tx_sgnews_pagebrowser: {currentPage: lessPage}}"> + <f:variable name="lessPage" value="{currentPage - 2}"/> + <f:link.action addQueryString="1" additionalParams="{tx_sgjobs_pagebrowser: {currentPage: lessPage}}"> ... </f:link.action> </li> @@ -49,7 +49,7 @@ </f:then> <f:else> <li class="tx-pagebrowse-page"> - <f:link.action additionalParams="{tx_sgnews_pagebrowser: {currentPage: pageLink.number}}"> + <f:link.action addQueryString="1" additionalParams="{tx_sgjobs_pagebrowser: {currentPage: pageLink.page}}"> {pageLink.number} </f:link.action> </li> @@ -59,8 +59,8 @@ <f:if condition="{enableMorePages} && {showNextPages}"> <li> - <f:variable name="morePage" value="{currentPage + 2}" /> - <f:link.action additionalParams="{tx_sgnews_pagebrowser: {currentPage: morePage}}"> + <f:variable name="morePage" value="{currentPage + 2}"/> + <f:link.action addQueryString="1" additionalParams="{tx_sgjobs_pagebrowser: {currentPage: morePage}}"> ... </f:link.action> </li> @@ -69,8 +69,8 @@ <f:if condition="{nextPageExist}"> <f:then> <li class="tx-pagebrowse-next"> - <f:variable name="nextPage" value="{currentPage + 1}" /> - <f:link.action additionalParams="{tx_sgnews_pagebrowser: {currentPage: nextPage}}" + <f:variable name="nextPage" value="{currentPage + 1}"/> + <f:link.action addQueryString="1" additionalParams="{tx_sgjobs_pagebrowser: {currentPage: nextPage}}" additionalAttributes="{aria-label: 'Next'}"> » </f:link.action>