diff --git a/Classes/Controller/BackendController.php b/Classes/Controller/BackendController.php index e89fa232983b14f3c0188aef9fd3a4334ca10423..3c5b09db5e85f9d9cdc8be0c223ffc3fb345e6e5 100644 --- a/Classes/Controller/BackendController.php +++ b/Classes/Controller/BackendController.php @@ -73,6 +73,10 @@ class BackendController extends ActionController { // create docheader + buttons $pageInfo = BackendUtility::readPageAccess($pageUid, $GLOBALS['BE_USER']->getPagePermsClause(1)); + if ($pageInfo === FALSE) { + $pageInfo = ['uid' => $pageUid]; + } + $this->docHeaderComponent = GeneralUtility::makeInstance(DocHeaderComponent::class); $this->docHeaderComponent->setMetaInformation($pageInfo); BackendService::makeButtons($this->docHeaderComponent, $this->request); @@ -91,14 +95,15 @@ class BackendController extends ActionController { /** @var QueryResultInterface $companies */ $companies = $this->companyRepository->findByPid($pageUid); $this->view->assign('locationOptions', $companies); + $this->view->assign('typo3Version', VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version)); if ($totalJobCount || $companies->count()) { $this->view->assign('jobs', $jobs); $this->view->assign('filters', $filters); $this->view->assign('pageUid', $pageUid); - $this->view->assign('typo3Version', VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version)); } else { $this->view->assign('noRecords', 1); + $this->view->assign('isAdmin', $GLOBALS['BE_USER']->isAdmin()); $this->addFlashMessage( LocalizationUtility::translate('backend.notice.noRecords', 'SgJobs'), '', FlashMessage::INFO ); diff --git a/Classes/SignalSlot/SitemapSignalSlot.php b/Classes/SignalSlot/SitemapSignalSlot.php new file mode 100644 index 0000000000000000000000000000000000000000..a6ce4eb1048a1665a181b8758ff63a0540375328 --- /dev/null +++ b/Classes/SignalSlot/SitemapSignalSlot.php @@ -0,0 +1,112 @@ +<?php + +namespace SGalinski\SgJobs\SignalSlot; + +/*************************************************************** + * Copyright notice + * + * (c) sgalinski Internet Services (https://www.sgalinski.de) + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; +use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder; +use TYPO3\CMS\Extbase\Object\ObjectManager; +use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; + +/** + * Signal functions regarding sg_seo sitemap generation + */ +class SitemapSignalSlot { + const PLUGIN_NAME = 'sgjobs_jobapplication'; + + /** + * @var UriBuilder + */ + protected $uriBuilder; + + /** + * Before the sitemap is generated + * + * @param array $pageList + * @throws \TYPO3\CMS\Core\Error\Http\ServiceUnavailableException + */ + public function beforeSitemapGeneration(array &$pageList) { + $objectManager = GeneralUtility::makeInstance(ObjectManager::class); + $request = $objectManager->get(\TYPO3\CMS\Extbase\Mvc\Web\Request::class); + $request->setRequestUri(GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL')); + $request->setBaseUri(GeneralUtility::getIndpEnv('TYPO3_SITE_URL')); + + $objectManager = GeneralUtility::makeInstance(ObjectManager::class); + $contentObjectRenderer = $objectManager->get(ContentObjectRenderer::class); + + $configurationManager = $objectManager->get(ConfigurationManager::class); + $configurationManager->setContentObject($contentObjectRenderer); + $this->uriBuilder = $objectManager->get(UriBuilder::class); + $this->uriBuilder->injectConfigurationManager($configurationManager); + + // find sites where job detail plugin is added + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); + $databaseResource = $queryBuilder->select('pid', 'pages') + ->from('tt_content') + ->where( + $queryBuilder->expr()->andX( + $queryBuilder->expr()->eq('CType', $queryBuilder->createNamedParameter('list')), + $queryBuilder->expr()->eq('list_type', $queryBuilder->createNamedParameter(self::PLUGIN_NAME)) + ) + ) + ->execute(); + + $rows = $databaseResource->fetchAll(); + + foreach ($rows as $row) { + $jobs = $this->getJobsByPid($row['pages']); + + foreach ($jobs as $job) { + $url = $this->uriBuilder->reset()->setTargetPageUid($row['pid'])->setArguments( + ['tx_sgjobs_jobapplication' => ['jobId' => $job['uid']]] + )->setCreateAbsoluteUri(TRUE)->buildFrontendUri(); + + $pageList[] = [ + 'url' => $url, + 'title' => '' + ]; + } + } + } + + /** + * Get all jobs stored on specific page ids + * + * @param string $pageList + * @return array|null + */ + private function getJobsByPid($pageList) { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); + $databaseResource = $queryBuilder->select('*') + ->from('tx_sgjobs_domain_model_job') + ->where($queryBuilder->expr()->in('pid', $queryBuilder->createNamedParameter($pageList))) + ->execute(); + + return $databaseResource->fetchAll(); + } +} diff --git a/Configuration/TCA/tx_sgjobs_domain_model_contact.php b/Configuration/TCA/tx_sgjobs_domain_model_contact.php index 571705b136d9a6c5665368a55044142f6270a08e..d2ddba753f4846afca4fd374c490081e97da3fe7 100644 --- a/Configuration/TCA/tx_sgjobs_domain_model_contact.php +++ b/Configuration/TCA/tx_sgjobs_domain_model_contact.php @@ -4,6 +4,8 @@ return [ 'ctrl' => [ 'title' => 'LLL:EXT:sg_jobs/Resources/Private/Language/locallang_db.xlf:tx_sgjobs_domain_model_contact', 'label' => 'last_name', + 'label_alt' => 'email, city', + 'label_alt_force' => 1, 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', diff --git a/Configuration/TCA/tx_sgjobs_domain_model_job.php b/Configuration/TCA/tx_sgjobs_domain_model_job.php index 0b8dc7c0a4f12c2b694001f5ea8cba4f93adc2e7..8903c2ad564817a1fbc23f1aeb94e47e6c750421 100644 --- a/Configuration/TCA/tx_sgjobs_domain_model_job.php +++ b/Configuration/TCA/tx_sgjobs_domain_model_job.php @@ -133,7 +133,7 @@ return [ 'config' => [ 'type' => 'input', 'size' => 30, - 'eval' => 'trim, required' + 'eval' => 'trim, required, unique' ], ], 'job_id' => [ diff --git a/Resources/Private/Backend/Templates/Index.html b/Resources/Private/Backend/Templates/Index.html index 329a0a81fbac098949e6df3853cccf82cfc6b92b..9dd2e2e28183fd0f36efc31c1b83a744383e9dbe 100644 --- a/Resources/Private/Backend/Templates/Index.html +++ b/Resources/Private/Backend/Templates/Index.html @@ -53,7 +53,9 @@ </f:then> <f:else> <f:render partial="SelectRoot" arguments="{pages: pages}" /> - <f:render partial="CreateJob" arguments="{pageUid:pageUid}" /> + <f:if condition="{isAdmin}"> + <f:render partial="CreateJob" arguments="{pageUid:pageUid}" /> + </f:if> </f:else> </f:if> diff --git a/composer.json b/composer.json index 7720dbdb5e79c32504ee3e647aab9d77ab7342b5..78a79790b71ca0191a939735287796ba5250265e 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "license": [ "GPL-2.0-or-later" ], - "version": "1.15.0", + "version": "1.18.1", "support": { "issues": "https://gitlab.sgalinski.de/typo3/sg_jobs" }, diff --git a/ext_emconf.php b/ext_emconf.php index f2807e35070512953818cba09ca9a7b694cc2529..6f562458cde7aa0ea3451841f8e26fa70664002a 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -4,7 +4,7 @@ $EM_CONF[$_EXTKEY] = array ( 'title' => 'Jobs', 'description' => 'Manage and display your Job offers.', 'category' => 'plugin', - 'version' => '1.15.0', + 'version' => '1.18.1', 'state' => 'stable', 'uploadfolder' => FALSE, 'createDirs' => '', diff --git a/ext_localconf.php b/ext_localconf.php index 453b380433459e7814744111b9cefda7a8fec69a..d09161b4d05dd3885cd8a52b361b3c9e9722b94d 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -62,3 +62,15 @@ if (TYPO3_MODE === 'BE') { // register mail templates $GLOBALS['sgmail']['sg_jobs']['ApplicationMail'] = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('sg_jobs') . '/Configuration/SgMail/ApplicationMail.php'; + +// signal slot for sg_seo integration +/** @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher $signalSlotDispatcher */ +$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Extbase\SignalSlot\Dispatcher::class +); +$signalSlotDispatcher->connect( + \SGalinski\SgSeo\Generator\PagesSitemapGenerator::class, + 'accessPageList', + \SGalinski\SgJobs\SignalSlot\SitemapSignalSlot::class, + 'beforeSitemapGeneration' +);