diff --git a/Classes/Command/MigrateNewsCommandController.php b/Classes/Command/MigrateNewsCommandController.php index 4aec4af5b1bc6839e17ead1614a45920c6e90bc0..a2883ae130c90bcddca3c6f792c683693802bbeb 100644 --- a/Classes/Command/MigrateNewsCommandController.php +++ b/Classes/Command/MigrateNewsCommandController.php @@ -29,65 +29,28 @@ namespace SGalinski\SgNews\Command; use SGalinski\SgNews\Domain\Model\News; use SGalinski\SgNews\Domain\Repository\FileReferenceRepository; use SGalinski\SgNews\Domain\Repository\NewsRepository; -use TYPO3\CMS\Backend\FrontendBackendUserAuthentication; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use TYPO3\CMS\Core\Core\Bootstrap; +use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\StartTimeRestriction; use TYPO3\CMS\Core\DataHandling\DataHandler; use TYPO3\CMS\Core\Resource\File; use TYPO3\CMS\Core\Resource\FileInterface; +use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\VersionNumberUtility; -use TYPO3\CMS\Extbase\Mvc\Controller\CommandController; +use Symfony\Component\Console\Command\Command; +use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException; use TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException; use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager; -use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; /** * Command controller, that migrates data from tx_news to sg_news */ -class MigrateNewsCommandController extends CommandController { - /** - * @var bool - */ - protected $requestAdminPermissions = TRUE; - - /** - * @var PersistenceManager - */ - protected $persistenceManager; - - /** - * @param PersistenceManager $persistenceManager - */ - public function injectPersistenceManager(PersistenceManager $persistenceManager) { - $this->persistenceManager = $persistenceManager; - } - - /** - * @var NewsRepository - */ - protected $newsRepository; - - /** - * @param NewsRepository $newsRepository - */ - public function injectNewsRepository(NewsRepository $newsRepository) { - $this->newsRepository = $newsRepository; - } - - /** - * @var FileReferenceRepository - */ - private $fileReferenceRepository; - - /** - * @param FileReferenceRepository $fileReferenceRepository - */ - public function injectFileReferenceRepository(FileReferenceRepository $fileReferenceRepository) { - $this->fileReferenceRepository = $fileReferenceRepository; - } - +class MigrateNewsCommandController extends Command { /** * this array maps new pages to their original entry in the tx_news table * @@ -95,13 +58,6 @@ class MigrateNewsCommandController extends CommandController { */ protected $newsPagesMap = []; - /** - * this array contains all pages that should be migrated to sg_news - * - * @var array $pagesToMigrate - */ - protected $pagesToMigrate = []; - /** * @var array $languageMap */ @@ -113,43 +69,55 @@ class MigrateNewsCommandController extends CommandController { protected $categoryMap = []; /** - * @param string $copyPageId the page id of the template that should be copied - * @param int $categoryPid the page id of the category page - * @param int $year only news from that year will be migrated - * @param string $languageMapAsJson a json, mapping language ids (old => new). this is needed if the sys_language_uids have changed - * @param string $categoryMapAsJson a json, mapping sys_category ids (old => new). t - * @param int $pId only news from that pid will be migrated + * Configure the command + */ + public function configure() { + $this->setDescription('Migrate data from tx_news to sg_news') + ->addArgument('copyPageId', InputArgument::REQUIRED, 'The page id of the template that should be copied') + ->addArgument('categoryPid', InputArgument::REQUIRED, 'The page id of the category page') + ->addArgument('year', InputArgument::OPTIONAL, 'Only news from that year will be migrated', 2015) + ->addArgument('languageMapAsJson', InputArgument::OPTIONAL, 'A json, mapping language ids (old => new). this is needed if the sys_language_uids have changed', '{"3":1,"1":0,"2":2,"0":3}') + ->addArgument('categoryMapAsJson', InputArgument::OPTIONAL, 'A json, mapping sys_category ids (old => new).', '{"2":17,"3":16,"4":15,"5":14,"6":14,"7":15,"8":16,"9":17}') + ->addArgument('pId', InputArgument::OPTIONAL, 'Only news from that pid will be migrated', 52); + } + + /** + * Execute the command * + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void * @throws IllegalObjectTypeException * @throws UnknownObjectException - * @throws \Exception + * @throws \JsonException + * @throws \TYPO3\CMS\Extbase\Object\Exception */ - public function runMigrateNewsCommand( - $copyPageId, $categoryPid, $year = 2015, - $languageMapAsJson = '{"3":1,"1":0,"2":2,"0":3}', - $categoryMapAsJson = '{"2":17,"3":16,"4":15,"5":14,"6":14,"7":15,"8":16,"9":17}', - $pId = 52 - ) { - // fix repair translation bug where tsfe is missing from command controller, can be removed when v1.5 is released - if (!$GLOBALS['TSFE']) { - $GLOBALS['TSFE'] = $this->objectManager->get( - TypoScriptFrontendController::class, $GLOBALS['TYPO3_CONF_VARS'], 0, 0 - ); - } - - $this->languageMap = json_decode($languageMapAsJson, TRUE); - $this->categoryMap = json_decode($categoryMapAsJson, TRUE); + public function execute(InputInterface $input, OutputInterface $output) { + $objectManager = GeneralUtility::makeInstance(ObjectManager::class); + $persistenceManager = $objectManager->get(PersistenceManager::class); + $fileReferenceRepository = $objectManager->get(FileReferenceRepository::class); + $newsRepository = $objectManager->get(NewsRepository::class); + + $copyPageId = $input->getArgument('copyPageId'); + $categoryPid = $input->getArgument('categoryPid'); + $year = $input->getArgument('year'); + $languageMapAsJson = $input->getArgument('languageMapAsJson'); + $categoryMapAsJson = $input->getArgument('categoryMapAsJson'); + $pId = $input->getArgument('pId'); + + $this->languageMap = json_decode($languageMapAsJson, TRUE, 512, JSON_THROW_ON_ERROR); + $this->categoryMap = json_decode($categoryMapAsJson, TRUE, 512, JSON_THROW_ON_ERROR); $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_news_domain_model_news'); $queryBuilder->getRestrictions()->removeByType(StartTimeRestriction::class); $rows = $queryBuilder->select('*') ->from('tx_news_domain_model_news') ->where( - $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($pId, \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($pId, Connection::PARAM_INT)) ) ->execute()->fetchAll(); $localDataHandler = GeneralUtility::makeInstance(DataHandler::class); - $beUser = $this->simulateBackendUser(); + Bootstrap::initializeBackendAuthentication(); $localCommandMap = [ 'pages' => [ $copyPageId => [ @@ -166,7 +134,7 @@ class MigrateNewsCommandController extends CommandController { // if no l10n_parent exists, create a copy of the page if ((int) $row['l10n_parent'] === 0) { - $localDataHandler->start([], $localCommandMap, $beUser); + $localDataHandler->start([], $localCommandMap); $localDataHandler->bypassAccessCheckForRecords = TRUE; $localDataHandler->checkModifyAccessList('pages'); $localDataHandler->process_cmdmap(); @@ -178,7 +146,7 @@ class MigrateNewsCommandController extends CommandController { $this->newsPagesMap[$row['uid']] = $newPageId; /** @var News $newsPage */ - $newsPage = $this->newsRepository->findByUidIgnoreEnableFields($newPageId); + $newsPage = $newsRepository->findByUidIgnoreEnableFields($newPageId); if ($newsPage !== NULL) { $title = date('Y-m-d', $row['datetime']) . ' - ' . $row['title']; @@ -192,7 +160,7 @@ class MigrateNewsCommandController extends CommandController { /** @var File $image */ $file = $this->getMatchingFile($row); if ($file instanceof File) { - $teaserImage1 = $this->fileReferenceRepository->addFileReferenceFromFile( + $teaserImage1 = $fileReferenceRepository->addFileReferenceFromFile( $file, $this->newsPagesMap[$row['uid']], $this->newsPagesMap[$row['uid']], 'pages', 'tx_sgnews_teaser1_image' ); @@ -200,7 +168,7 @@ class MigrateNewsCommandController extends CommandController { if ($teaserImage1) { $newsPage->addTeaser1Image($teaserImage1); - $teaserImage2 = $this->fileReferenceRepository->addFileReferenceFromFile( + $teaserImage2 = $fileReferenceRepository->addFileReferenceFromFile( $file, $this->newsPagesMap[$row['uid']], $this->newsPagesMap[$row['uid']], 'pages', 'tx_sgnews_teaser2_image' ); @@ -208,8 +176,8 @@ class MigrateNewsCommandController extends CommandController { } } - $this->newsRepository->update($newsPage); - $this->persistenceManager->persistAll(); + $newsRepository->update($newsPage); + $persistenceManager->persistAll(); // update content element from the new page $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content'); @@ -217,7 +185,7 @@ class MigrateNewsCommandController extends CommandController { $queryBuilder->update('tt_content') ->where( $queryBuilder->expr()->andX( - $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($newPageId, \PDO::PARAM_INT)), + $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($newPageId, Connection::PARAM_INT)), $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($this->languageMap[(int) $row['sys_language_uid']], \PDO::PARAM_INT)) ) ) @@ -247,7 +215,7 @@ class MigrateNewsCommandController extends CommandController { $queryBuilder->expr()->andX( $queryBuilder->expr()->eq('tablenames', $queryBuilder->createNamedParameter('tx_news_domain_model_news')), $queryBuilder->expr()->eq('fieldname', $queryBuilder->createNamedParameter('fal_media')), - $queryBuilder->expr()->eq('uid_foreign', $queryBuilder->createNamedParameter($row['uid'], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('uid_foreign', $queryBuilder->createNamedParameter($row['uid'], Connection::PARAM_INT)) ) ) ->execute()->fetch(); @@ -260,7 +228,7 @@ class MigrateNewsCommandController extends CommandController { $fileResult = $queryBuilder->select('identifier') ->from('sys_file_news_migration') ->where( - $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($fileReferenceResult['uid_local'], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($fileReferenceResult['uid_local'], Connection::PARAM_INT)) ) ->execute()->fetch(); if (!$fileResult) { @@ -268,7 +236,7 @@ class MigrateNewsCommandController extends CommandController { } $oldIdentifier = $fileResult['identifier']; - $resourceFactory = \TYPO3\CMS\Core\Resource\ResourceFactory::getInstance(); + $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class); $storage = $resourceFactory->getStorageObject(1); if (!$storage->hasFile($oldIdentifier)) { return NULL; @@ -288,7 +256,7 @@ class MigrateNewsCommandController extends CommandController { $mmRows = $queryBuilder->select('uid_local', 'sorting_foreign') ->from('sys_category_record_mm_news_migration') ->where( - $queryBuilder->expr()->eq('uid_foreign', $queryBuilder->createNamedParameter($row['uid'], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('uid_foreign', $queryBuilder->createNamedParameter($row['uid'], Connection::PARAM_INT)) ) ->execute()->fetchAll(); foreach ($mmRows as $mmRow) { @@ -312,13 +280,12 @@ class MigrateNewsCommandController extends CommandController { private function updateTranslation(array $row) { // get entry in news map $parentId = $this->newsPagesMap[$row['l10n_parent']]; - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content'); $queryBuilder->getRestrictions()->removeAll(); $originalContentElement = $queryBuilder->select('l18n_parent') ->from('tt_content') ->where( - $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($parentId, \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($parentId, Connection::PARAM_INT)) ) ->execute()->fetch(); @@ -326,22 +293,22 @@ class MigrateNewsCommandController extends CommandController { // if its the new default, there is no l18n_parent if ((int) $this->languageMap[(int) $row['sys_language_uid'] === 0]) { $queryBuilder->where( - $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($originalContentElement[0], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($originalContentElement[0], Connection::PARAM_INT)) ); } else { $queryBuilder->where( - $queryBuilder->expr()->eq('l18n_parent', $queryBuilder->createNamedParameter($originalContentElement[0], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('l18n_parent', $queryBuilder->createNamedParameter($originalContentElement[0], Connection::PARAM_INT)) ); } // look up the correct language id, if they have changed if (isset($this->languageMap[(int) $row['sys_language_uid']])) { $queryBuilder->andWhere( - $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($this->languageMap[(int) $row['sys_language_uid']], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($this->languageMap[(int) $row['sys_language_uid']], Connection::PARAM_INT)) ); } else { $queryBuilder->andWhere( - $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($row['sys_language_uid'], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($row['sys_language_uid'], Connection::PARAM_INT)) ); } $queryBuilder->set('bodytext', $row['bodytext'], TRUE) @@ -349,30 +316,22 @@ class MigrateNewsCommandController extends CommandController { // possibly the default language needs to be overwritten and the old default translation needs to be preserved if (isset($this->languageMap[(int) $row['sys_language_uid']]) && $this->languageMap[(int) $row['sys_language_uid']] === 0) { - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); $queryBuilder->getRestrictions()->removeAll(); $result = $queryBuilder->select('title', 'subtitle') ->from('pages') ->where( - $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($parentId, \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($parentId, Connection::PARAM_INT)) ) ->execute()->fetch(); if ($result) { $queryBuilder->where( - $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($this->languageMap[0], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($this->languageMap[0], Connection::PARAM_INT)) ); - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $queryBuilder->update('pages_language_overlay') - ->andWhere( - $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($parentId, \PDO::PARAM_INT)) - ); - } else { - $queryBuilder->update('pages') - ->andWhere( - $queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($this->languageMap[0], \PDO::PARAM_INT)) - ); - } + $queryBuilder->update('pages') + ->andWhere( + $queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($this->languageMap[0], Connection::PARAM_INT)) + ); $queryBuilder->set('title', $result['title'], TRUE) ->set('subtitle', $result['subtitle'], TRUE) ->set('navtitle', '', TRUE) @@ -382,7 +341,7 @@ class MigrateNewsCommandController extends CommandController { $newTitle = date('Y-m-d', $row['datetime']) . ' - ' . $row['title']; $queryBuilder->update('pages') ->where( - $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($parentId, \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($parentId, Connection::PARAM_INT)) ) ->set('title', $newTitle, TRUE) ->set('subtitle', $row['title'], TRUE) @@ -390,48 +349,23 @@ class MigrateNewsCommandController extends CommandController { ->set('navtitle', '', TRUE) ->execute(); } else { - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $queryBuilder->update('pages_language_overlay') - ->where( - $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($parentId, \PDO::PARAM_INT)) - ); - } else { - $queryBuilder->update('pages') - ->where( - $queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($parentId, \PDO::PARAM_INT)) - ); - } + $queryBuilder->update('pages') + ->where( + $queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($parentId, Connection::PARAM_INT)) + ); // finally translate the page title if necessary if (isset($this->languageMap[(int) $row['sys_language_uid']]) && $this->languageMap[(int) $row['sys_language_uid']] > 0) { $queryBuilder->andWhere( - $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($this->languageMap[(int) $row['sys_language_uid']], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($this->languageMap[(int) $row['sys_language_uid']], Connection::PARAM_INT)) ); } else { $queryBuilder->andWhere( - $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($row['sys_language_uid'], \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($row['sys_language_uid'], Connection::PARAM_INT)) ); } $queryBuilder->set('title', date('Y-m-d', $row['datetime']) . ' - ' . $row['title'], TRUE) ->execute(); } } - - /** - * Simulate Backend User for DataHandler - * - * @return FrontendBackendUserAuthentication - */ - private function simulateBackendUser() { - /** @var \TYPO3\CMS\Backend\FrontendBackendUserAuthentication $BE_USER */ - $BE_USER = GeneralUtility::makeInstance(FrontendBackendUserAuthentication::class); - $BE_USER->setBeUserByName('admin'); - if ($BE_USER->user['uid']) { - $BE_USER->fetchGroupData(); - } - $BE_USER->uc_default['copyLevels'] = '9999'; - $BE_USER->uc = $BE_USER->uc_default; - $GLOBALS['PAGES_TYPES'][254]['allowedTables'] = '*'; - return $BE_USER; - } } diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php index 95dbdf5436248466734c1f14f46505dc77eb23f7..27101357c42cdec3d1d395628506f22bf5f06f46 100644 --- a/Classes/Controller/AbstractController.php +++ b/Classes/Controller/AbstractController.php @@ -29,7 +29,7 @@ namespace SGalinski\SgNews\Controller; use RuntimeException; use SGalinski\SgNews\Domain\Model\Category; use SGalinski\SgNews\Domain\Model\News; -use SGalinski\SgNews\Utility\ExtensionUtility; +use SGalinski\SgNews\Service\ImageService; use TYPO3\CMS\Extbase\Domain\Model\FileReference; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; @@ -38,8 +38,7 @@ use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; */ abstract class AbstractController extends ActionController { /** - * @inject - * @var \SGalinski\SgNews\Service\ImageService + * @var ImageService */ protected $imageService; @@ -60,11 +59,18 @@ abstract class AbstractController extends ActionController { */ public function initializeAction() { $extensionKey = $this->request->getControllerExtensionKey(); - $this->extensionConfiguration = ExtensionUtility::getExtensionConfiguration($extensionKey); + $this->extensionConfiguration = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extensionKey] ?? []; parent::initializeAction(); } + /** + * @param ImageService $imageService + */ + public function injectImageService(ImageService $imageService) { + $this->imageService = $imageService; + } + /** * Error Handler * diff --git a/Classes/Controller/BackendController.php b/Classes/Controller/BackendController.php index 35a4d0483339b65793a639554bd82d8f876b64c4..059f328f917632314740b6211704651dd270517a 100644 --- a/Classes/Controller/BackendController.php +++ b/Classes/Controller/BackendController.php @@ -35,9 +35,7 @@ use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Imaging\IconFactory; -use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\VersionNumberUtility; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; use TYPO3\CMS\Extbase\Mvc\View\ViewInterface; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; @@ -154,14 +152,6 @@ class BackendController extends ActionController { $currentLanguageInfo = $languageOptions[$this->language] ?? NULL; } - $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class); - $pageRenderer->addJsInlineCode('typo3_version', 'TYPO3.version=' - . VersionNumberUtility::convertVersionNumberToInteger(VersionNumberUtility::getCurrentTypo3Version()) - . ';'); - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $pageRenderer->loadExtJS(); - } - $this->docHeaderComponent->setMetaInformation($this->pageInfo); $this->makeButtons(); $this->makeLanguageMenu(); @@ -170,7 +160,6 @@ class BackendController extends ActionController { $this->view->assign('language', $this->language); $this->view->assign('languageInfo', $currentLanguageInfo); $this->view->assign('docHeader', $this->docHeaderComponent->docHeaderContent()); - $this->view->assign('typo3Version', VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version)); } } @@ -227,12 +216,7 @@ class BackendController extends ActionController { /** @var IconFactory $iconFactory */ $iconFactory = GeneralUtility::makeInstance(IconFactory::class); - - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $locallangPath = 'LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:'; - } else { - $locallangPath = 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:'; - } + $locallangPath = 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:'; // Refresh $refreshButton = $buttonBar->makeLinkButton() diff --git a/Classes/Controller/LatestController.php b/Classes/Controller/LatestController.php index 2221c06038c42a287cf6438602945f7fe830ee95..9dbfd3be2af3280b1ad0f418bdb1d890feb0890d 100644 --- a/Classes/Controller/LatestController.php +++ b/Classes/Controller/LatestController.php @@ -28,6 +28,9 @@ namespace SGalinski\SgNews\Controller; use SGalinski\SgNews\Domain\Model\Category; use SGalinski\SgNews\Domain\Model\News; +use SGalinski\SgNews\Domain\Repository\CategoryRepository; +use SGalinski\SgNews\Domain\Repository\NewsRepository; +use SGalinski\SgNews\Domain\Repository\TagRepository; use SGalinski\SgNews\Service\ConfigurationService; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -36,20 +39,17 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; */ class LatestController extends AbstractController { /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\CategoryRepository + * @var CategoryRepository */ protected $categoryRepository; /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\TagRepository + * @var TagRepository */ protected $tagRepository; /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\NewsRepository + * @var NewsRepository */ protected $newsRepository; @@ -118,4 +118,26 @@ class LatestController extends AbstractController { $this->view->assign('newsMetaData', $newsMetaData); } + + /** + * @param CategoryRepository $categoryRepository + */ + public function injectCategoryRepository(CategoryRepository $categoryRepository + ) { + $this->categoryRepository = $categoryRepository; + } + + /** + * @param NewsRepository $newsRepository + */ + public function injectNewsRepository(NewsRepository $newsRepository) { + $this->newsRepository = $newsRepository; + } + + /** + * @param TagRepository $tagRepository + */ + public function injectTagRepository(TagRepository $tagRepository) { + $this->tagRepository = $tagRepository; + } } diff --git a/Classes/Controller/ListByCategoryController.php b/Classes/Controller/ListByCategoryController.php index 86829008000737ffea6ed797ffab0be27e9d4b0e..65f77a6fc76b38998697a4f0f38b2ed47a7162c4 100644 --- a/Classes/Controller/ListByCategoryController.php +++ b/Classes/Controller/ListByCategoryController.php @@ -27,6 +27,9 @@ namespace SGalinski\SgNews\Controller; ***************************************************************/ use SGalinski\SgNews\Domain\Model\News; +use SGalinski\SgNews\Domain\Repository\CategoryRepository; +use SGalinski\SgNews\Domain\Repository\NewsRepository; +use SGalinski\SgNews\Domain\Repository\TagRepository; use SGalinski\SgNews\Service\ConfigurationService; use SGalinski\SgNews\Service\HeaderMetaDataService; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -37,20 +40,17 @@ use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface; */ class ListByCategoryController extends AbstractController { /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\CategoryRepository + * @var CategoryRepository */ protected $categoryRepository; /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\TagRepository + * @var TagRepository */ protected $tagRepository; /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\NewsRepository + * @var NewsRepository */ protected $newsRepository; @@ -66,6 +66,28 @@ class ListByCategoryController extends AbstractController { } } + /** + * @param CategoryRepository $categoryRepository + */ + public function injectCategoryRepository(CategoryRepository $categoryRepository + ) { + $this->categoryRepository = $categoryRepository; + } + + /** + * @param NewsRepository $newsRepository + */ + public function injectNewsRepository(NewsRepository $newsRepository) { + $this->newsRepository = $newsRepository; + } + + /** + * @param TagRepository $tagRepository + */ + public function injectTagRepository(TagRepository $tagRepository) { + $this->tagRepository = $tagRepository; + } + /** * Renders the news list of a category * diff --git a/Classes/Controller/NewsFeedController.php b/Classes/Controller/NewsFeedController.php index 21a1f85e97440aad042c2c4db63f9e3c5edd0c00..6278c9adbfaca33f6d51999d700d327c369e4099 100644 --- a/Classes/Controller/NewsFeedController.php +++ b/Classes/Controller/NewsFeedController.php @@ -26,6 +26,7 @@ namespace SGalinski\SgNews\Controller; * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ +use SGalinski\SgNews\Domain\Repository\NewsRepository; use TYPO3\CMS\Core\Utility\GeneralUtility; /** @@ -33,8 +34,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; */ class NewsFeedController extends AbstractController { /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\NewsRepository + * @var NewsRepository */ protected $newsRepository; @@ -53,4 +53,11 @@ class NewsFeedController extends AbstractController { ); $this->view->assign('news', $news); } + + /** + * @param NewsRepository $newsRepository + */ + public function injectNewsRepository(NewsRepository $newsRepository) { + $this->newsRepository = $newsRepository; + } } diff --git a/Classes/Controller/OverviewController.php b/Classes/Controller/OverviewController.php index 16a74fda1d4bd14e5178c46a5c9d14367aa6e5c0..a4d7b4e284718e1a34b4e303b88cd67979461d0f 100644 --- a/Classes/Controller/OverviewController.php +++ b/Classes/Controller/OverviewController.php @@ -29,6 +29,9 @@ namespace SGalinski\SgNews\Controller; use SGalinski\SgNews\Domain\Model\Category; use SGalinski\SgNews\Domain\Model\Tag; use SGalinski\SgNews\Domain\Model\News; +use SGalinski\SgNews\Domain\Repository\CategoryRepository; +use SGalinski\SgNews\Domain\Repository\NewsRepository; +use SGalinski\SgNews\Domain\Repository\TagRepository; use SGalinski\SgNews\Service\ConfigurationService; use SGalinski\SgNews\Service\HeaderMetaDataService; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -41,20 +44,17 @@ use TYPO3\CMS\Extbase\Persistence\QueryInterface; */ class OverviewController extends AbstractController { /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\CategoryRepository + * @var CategoryRepository */ protected $categoryRepository; /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\TagRepository + * @var TagRepository */ protected $tagRepository; /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\NewsRepository + * @var NewsRepository */ protected $newsRepository; @@ -450,6 +450,28 @@ class OverviewController extends AbstractController { } } + /** + * @param CategoryRepository $categoryRepository + */ + public function injectCategoryRepository(CategoryRepository $categoryRepository + ) { + $this->categoryRepository = $categoryRepository; + } + + /** + * @param NewsRepository $newsRepository + */ + public function injectNewsRepository(NewsRepository $newsRepository) { + $this->newsRepository = $newsRepository; + } + + /** + * @param TagRepository $tagRepository + */ + public function injectTagRepository(TagRepository $tagRepository) { + $this->tagRepository = $tagRepository; + } + /** * Renders the news in a paginated list * diff --git a/Classes/Controller/PageBrowserController.php b/Classes/Controller/PageBrowserController.php index c3152aa56861ccc0f8887c3402c24f8ef75c986d..519d4d430db156bdea5b3010923427843e56d3ad 100644 --- a/Classes/Controller/PageBrowserController.php +++ b/Classes/Controller/PageBrowserController.php @@ -140,7 +140,7 @@ class PageBrowserController extends ActionController { * @return string */ protected function getPageLink($page): string { - return $this->uriBuilder->reset()->setAddQueryString(TRUE)->setUseCacheHash(TRUE) + return $this->uriBuilder->reset()->setAddQueryString(TRUE) ->uriFor('index', ['currentPage' => $page,]); } } diff --git a/Classes/Controller/SingleViewController.php b/Classes/Controller/SingleViewController.php index 9883f08416de0a92bd1dbbb10da555262ffa305f..16587afde8a096dd9bf74bdcfd59a08a7a3153de 100644 --- a/Classes/Controller/SingleViewController.php +++ b/Classes/Controller/SingleViewController.php @@ -28,33 +28,33 @@ namespace SGalinski\SgNews\Controller; use SGalinski\SgNews\Domain\Model\Category; use SGalinski\SgNews\Domain\Model\News; +use SGalinski\SgNews\Domain\Repository\CategoryRepository; +use SGalinski\SgNews\Domain\Repository\NewsRepository; +use SGalinski\SgNews\Domain\Repository\TagRepository; use SGalinski\SgNews\Service\HeaderMetaDataService; +use TYPO3\CMS\Core\Charset\CharsetConverter; /** * Controller that handles the news single view page */ class SingleViewController extends AbstractController { /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\CategoryRepository + * @var CategoryRepository */ protected $categoryRepository; /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\TagRepository + * @var TagRepository */ protected $tagRepository; /** - * @inject - * @var \SGalinski\SgNews\Domain\Repository\NewsRepository + * @var NewsRepository */ protected $newsRepository; /** - * @inject - * @var \TYPO3\CMS\Core\Charset\CharsetConverter + * @var CharsetConverter */ protected $characterSetConverter; @@ -113,4 +113,33 @@ class SingleViewController extends AbstractController { ] ); } + + /** + * @param CategoryRepository $categoryRepository + */ + public function injectCategoryRepository(CategoryRepository $categoryRepository + ) { + $this->categoryRepository = $categoryRepository; + } + + /** + * @param CharsetConverter $characterSetConverter + */ + public function injectCharacterSetConverter(CharsetConverter $characterSetConverter) { + $this->characterSetConverter = $characterSetConverter; + } + + /** + * @param NewsRepository $newsRepository + */ + public function injectNewsRepository(NewsRepository $newsRepository) { + $this->newsRepository = $newsRepository; + } + + /** + * @param TagRepository $tagRepository + */ + public function injectTagRepository(TagRepository $tagRepository) { + $this->tagRepository = $tagRepository; + } } diff --git a/Classes/Domain/Model/Author.php b/Classes/Domain/Model/Author.php index a814b8725c1c2e578e5689587dc1948030b08a9f..4159a58a799aa8065677dcab8dc5a16fdc798650 100644 --- a/Classes/Domain/Model/Author.php +++ b/Classes/Domain/Model/Author.php @@ -60,7 +60,7 @@ class Author extends AbstractEntity { protected $description = ''; /** - * @lazy + * @TYPO3\CMS\Extbase\Annotation\ORM\Lazy * @var \TYPO3\CMS\Extbase\Domain\Model\FileReference */ protected $image; diff --git a/Classes/Domain/Model/CategoryAndNews.php b/Classes/Domain/Model/CategoryAndNews.php index 9db905db4c89ed4acecd9675b03b55e65ccb4ac7..e4be82fb4dbc2a9be5a1f79f6dac5350d7abfa31 100644 --- a/Classes/Domain/Model/CategoryAndNews.php +++ b/Classes/Domain/Model/CategoryAndNews.php @@ -56,13 +56,13 @@ abstract class CategoryAndNews extends AbstractEntity { protected $sorting = 0; /** - * @lazy + * @TYPO3\CMS\Extbase\Annotation\ORM\Lazy * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> */ protected $teaser1Image; /** - * @lazy + * @TYPO3\CMS\Extbase\Annotation\ORM\Lazy * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> */ protected $teaser2Image; diff --git a/Classes/Domain/Model/News.php b/Classes/Domain/Model/News.php index edc21d0544ebddc3cf517acb3c51ff11364fd25a..f6e06c12d0c02c5a76e2658b1778f2fedc2b8c35 100644 --- a/Classes/Domain/Model/News.php +++ b/Classes/Domain/Model/News.php @@ -66,7 +66,7 @@ class News extends CategoryAndNews { protected $creationDate; /** - * @lazy + * @TYPO3\CMS\Extbase\Annotation\ORM\Lazy * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SGalinski\SgNews\Domain\Model\News> */ protected $relatedNews; @@ -77,7 +77,7 @@ class News extends CategoryAndNews { protected $tags; /** - * @lazy + * @TYPO3\CMS\Extbase\Annotation\ORM\Lazy * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\SGalinski\SgNews\Domain\Model\Author> */ protected $newsAuthor; diff --git a/Classes/Hooks/EditDocumentController.php b/Classes/Hooks/EditDocumentController.php index 4976e1e0cae1c8c2428bc184cff5e600aa025528..34b2ef2dfccbea5b3aa949dd7054dc8af7c2c603 100644 --- a/Classes/Hooks/EditDocumentController.php +++ b/Classes/Hooks/EditDocumentController.php @@ -42,7 +42,7 @@ class EditDocumentController { * @return void */ public function preInitAfter($controller) { - $tables = ['pages', 'pages_language_overlay']; + $tables = ['pages']; if ( $GLOBALS['BE_USER']->user['realName'] !== '' && (isset($controller->editconf[$tables[0]]) || isset($controller->editconf[$tables[1]])) diff --git a/Classes/Hooks/PageLayoutController.php b/Classes/Hooks/PageLayoutController.php index 0daa0ec5151ae3a11dcaa520aa54319f198e71ee..cb59462ac1ef9f805ea143cc9bc60a6a3e7e3be4 100644 --- a/Classes/Hooks/PageLayoutController.php +++ b/Classes/Hooks/PageLayoutController.php @@ -32,7 +32,6 @@ use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\VersionNumberUtility; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; /** @@ -80,22 +79,7 @@ class PageLayoutController { $icon = '<span style="vertical-align: middle; display:inline-block;">' . $icon . '</span>'; $buttonLabel = LocalizationUtility::translate('backend.button.goToNewsModule', 'SgNews'); $buttonLabel = '<span style="vertical-align: middle;">' . $buttonLabel . '</span>'; - $path = ''; - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $pageRenderer->addJsInlineCode('typo3_version', 'TYPO3.version=' - . VersionNumberUtility::convertVersionNumberToInteger(VersionNumberUtility::getCurrentTypo3Version()) - . ';'); - $rootline = BackendUtility::BEgetRootLine($categoryRow['uid'], '', TRUE); - ksort($rootline); - $path = '/root'; - foreach ($rootline as $page) { - $path .= '/p' . dechex($page['uid']); - } - - $path = ', \'' . $path . '\''; - } - $onclick = 'TYPO3.SgNewsModule.sgNewsGoToNewsModule(' . $categoryRow['uid'] . $path . '); return false;'; $wrap = ' <div class="btn-group" role="group">%s</div>'; $link = '<a href="#" onclick="' . $onclick . '" class="btn btn-primary">%s</a>'; diff --git a/Classes/Service/ImageService.php b/Classes/Service/ImageService.php index b96887b19a8d323092bee9387826c034ef8c7f41..67aa6736192b1e92ee796fb9e65c29e019043ca0 100644 --- a/Classes/Service/ImageService.php +++ b/Classes/Service/ImageService.php @@ -26,6 +26,8 @@ namespace SGalinski\SgNews\Service; * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ +use TYPO3\CMS\Core\Charset\CharsetConverter; +use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\SingletonInterface; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Domain\Model\FileReference; @@ -35,8 +37,7 @@ use TYPO3\CMS\Extbase\Domain\Model\FileReference; */ class ImageService implements SingletonInterface { /** - * @inject - * @var \TYPO3\CMS\Core\Charset\CharsetConverter + * @var CharsetConverter */ protected $characterSetConverter; @@ -77,19 +78,26 @@ class ImageService implements SingletonInterface { $fileName .= $originalResource->getNameWithoutExtension(); $croppedImage = $path . $prefix . sha1($fileName) . '.' . $extension; - $originalImage = PATH_site . rawurldecode($originalResource->getPublicUrl()); - if ($originalImage !== '' && $croppedImage !== '' && !is_file(PATH_site . $croppedImage)) { - GeneralUtility::mkdir_deep(PATH_site . $path); + $originalImage = Environment::getPublicPath() . '/' . rawurldecode($originalResource->getPublicUrl()); + if ($originalImage !== '' && $croppedImage !== '' && !is_file(Environment::getPublicPath() . '/' . $croppedImage)) { + GeneralUtility::mkdir_deep(Environment::getPublicPath() . '/' . $path); $imagick = new \Imagick($originalImage); $imagick->cropImage($coordinates['w'], $coordinates['h'], $coordinates['x1'], $coordinates['y1']); - $imagick->writeImage(PATH_site . $croppedImage); - if (!is_file(PATH_site . $croppedImage)) { + $imagick->writeImage(Environment::getPublicPath() . '/' . $croppedImage); + if (!is_file(Environment::getPublicPath() . '/' . $croppedImage)) { $croppedImage = ''; } else { - GeneralUtility::fixPermissions(PATH_site . $croppedImage); + GeneralUtility::fixPermissions(Environment::getPublicPath() . '/' . $croppedImage); } } return $croppedImage; } + + /** + * @param CharsetConverter $characterSetConverter + */ + public function injectCharacterSetConverter(CharsetConverter $characterSetConverter) { + $this->characterSetConverter = $characterSetConverter; + } } diff --git a/Classes/Service/LicensingService.php b/Classes/Service/LicensingService.php index 73a0f340e0671f677b465515722eb2fa5c721980..a29290a5aad70ae01323a1987f45123e16b5edaa 100644 --- a/Classes/Service/LicensingService.php +++ b/Classes/Service/LicensingService.php @@ -56,7 +56,7 @@ class LicensingService { public static function checkKey(): bool { if (static::$isLicenseKeyValid === NULL) { static::$isLicenseKeyValid = FALSE; - $configuration = ExtensionUtility::getExtensionConfiguration(self::EXTENSION_KEY); + $configuration = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][self::EXTENSION_KEY] ?? []; if (isset($configuration['key']) && $key = trim($configuration['key'])) { static::$isLicenseKeyValid = (bool) preg_match('/^([A-Z\d]{6}-?){4}$/', $key); } @@ -73,7 +73,7 @@ class LicensingService { */ public static function ping($returnUrl = FALSE): string { try { - $configuration = ExtensionUtility::getExtensionConfiguration(self::EXTENSION_KEY); + $configuration = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][self::EXTENSION_KEY] ?? []; $key = ''; if (isset($configuration['key'])) { $key = trim($configuration['key']); diff --git a/Classes/TCA/TcaProvider.php b/Classes/TCA/TcaProvider.php index b467e5c3c14f73481f876cc98420f1a5c2f351f5..c0ace7acee23cbd3f5eccfe44d7652ab4a88a3de 100644 --- a/Classes/TCA/TcaProvider.php +++ b/Classes/TCA/TcaProvider.php @@ -59,7 +59,7 @@ class TcaProvider implements SingletonInterface { public function processDatamap_afterAllOperations(DataHandler $tceMain) { /** @var array $tablesData */ foreach ($tceMain->datamap as $table => $tablesData) { - if (!in_array($table, ['pages', 'pages_language_overlay'], TRUE)) { + if ($table !== 'pages') { continue; } @@ -71,28 +71,6 @@ class TcaProvider implements SingletonInterface { $translationRow = []; $pagesIdentity = (int) $identity; - if ($table === 'pages_language_overlay') { - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages_language_overlay'); - $queryBuilder->getRestrictions()->removeAll(); - $translationRow = $queryBuilder->select('pid', 'subtitle', 't3ver_oid') - ->from('pages_language_overlay') - ->where( - $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($identity, \PDO::PARAM_INT)) - ) - ->execute()->fetch(); - - $workspaceOriginalId = (int) $translationRow['t3ver_oid']; - if ($workspaceOriginalId > 0) { - $translationRow = $queryBuilder->select('pid', 'subtitle', 't3ver_oid') - ->from('pages_language_overlay') - ->where( - $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($workspaceOriginalId, \PDO::PARAM_INT)) - ) - ->execute()->fetch(); - } - - $pagesIdentity = (int) $translationRow['pid']; - } $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); $queryBuilder->getRestrictions()->removeAll(); @@ -122,9 +100,6 @@ class TcaProvider implements SingletonInterface { } $subtitle = $row['subtitle']; - if ($table === 'pages_language_overlay') { - $subtitle = $translationRow['subtitle']; - } $calculatedTitle = $prefix . strftime('%Y-%m-%d', $row['lastUpdated']) . ' - ' . $subtitle; $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table); diff --git a/Classes/Updates/MigrateSchedulerTasks.php b/Classes/Updates/MigrateSchedulerTasks.php new file mode 100644 index 0000000000000000000000000000000000000000..b7af223e9e09c4d4b1dbcb770aad118f23eda876 --- /dev/null +++ b/Classes/Updates/MigrateSchedulerTasks.php @@ -0,0 +1,170 @@ +<?php +/*************************************************************** + * 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! + ***************************************************************/ + +namespace SGalinski\SgNews\Updates; + +use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Install\Updates\DatabaseUpdatedPrerequisite; +use TYPO3\CMS\Install\Updates\UpgradeWizardInterface; +use TYPO3\CMS\Scheduler\Scheduler; +use TYPO3\CMS\Scheduler\Task\ExecuteSchedulableCommandTask; + +/** + * Class MigrateSchedulerTasks + * + * @package SGalinski\SgNews\Updates + */ +class MigrateSchedulerTasks implements UpgradeWizardInterface { + /** + * Identifier of the upgrade + */ + const IDENTIFIER = 'tx_sgnews_migrateschedulertasks'; + + /** + * @inheritDoc + */ + public function getIdentifier(): string { + return self::IDENTIFIER; + } + + /** + * @inheritDoc + */ + public function getTitle(): string { + return 'Migrate sg_news scheduler tasks to symfony commands API'; + } + + /** + * @inheritDoc + */ + public function getDescription(): string { + return 'This upgrade migrates all sg_news scheduler tasks, created with the old CommandController API to the new Symfony Commands API'; + } + + /** + * @inheritDoc + */ + public function executeUpdate(): bool { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable( + 'tx_scheduler_task' + ); + $tasks = $queryBuilder->select('serialized_task_object') + ->from('tx_scheduler_task') + ->where( + $queryBuilder->expr()->eq('disable', 0) + )->execute()->fetchAll(); + foreach ($tasks as $_task) { + $task = unserialize($_task['serialized_task_object'], [\__PHP_Incomplete_Class::class]); + $taskVars = $this->cleanArrayKeys((array)$task); + $identifier = $taskVars['*commandIdentifier']; + if ( + $identifier === 'sg_news:migratenews:runmigratenews' + ) { + $this->replaceTask($taskVars); + } + } + return TRUE; + } + + /** + * Replace the given extbase task implementation with the new Symfony Commands API one + * + * @param array $task + */ + protected function replaceTask(array $task) { + $commandTask = GeneralUtility::makeInstance(ExecuteSchedulableCommandTask::class); + switch ($task['*commandIdentifier']) { + case 'sg_news:migratenews:runmigratenews': + $commandTask->setCommandIdentifier('sg_news:generateHttpCodeSites'); + break; + } + + if (is_array($task['*arguments'])) { + $commandTask->setArguments($task['*arguments']); + } + + if (is_array($task['*defaults'])) { + foreach ($task['*defaults'] as $key => $default) { + $commandTask->addDefaultValue($key, $default); + } + } + + $commandTask->setTaskGroup($task['*taskGroup']); + $commandTask->setExecution($task['*execution']); + $commandTask->setExecutionTime($task['*executionTime']); + $commandTask->setRunOnNextCronJob($task['*runOnNextCronJob']); + $commandTask->setTaskUid($task['*taskUid']); + GeneralUtility::makeInstance(Scheduler::class)->saveTask($commandTask); + } + + /** + * @inheritDoc + */ + public function updateNecessary(): bool { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable( + 'tx_scheduler_task' + ); + $tasks = $queryBuilder->select('serialized_task_object') + ->from('tx_scheduler_task') + ->where( + $queryBuilder->expr()->eq('disable', 0) + )->execute()->fetchAll(); + foreach ($tasks as $_task) { + $task = unserialize($_task['serialized_task_object'], [\__PHP_Incomplete_Class::class]); + $taskVars = $this->cleanArrayKeys((array)$task); + $identifier = $taskVars['*commandIdentifier']; + if ( + $identifier === 'sg_news:migratenews:runmigratenews' + ) { + return TRUE; + } + } + return FALSE; + } + + /** + * Cleans array keys from their hidden \0 + * + * @param array $array + * @return array + */ + protected function cleanArrayKeys(array $array) { + $newArray = []; + foreach($array as $key => $value) { + $newArray[str_replace("\0", '', $key)] = $value; + } + return $newArray; + } + + /** + * @inheritDoc + */ + public function getPrerequisites(): array { + return [ + DatabaseUpdatedPrerequisite::class + ]; + } +} diff --git a/Classes/Updates/UpdateAuthors.php b/Classes/Updates/UpdateAuthors.php index 650a4134c43800c21d6c0690eaf6781d37a252ec..eb56fa715436765a2e45b831a0edc1f0f1a7b655 100644 --- a/Classes/Updates/UpdateAuthors.php +++ b/Classes/Updates/UpdateAuthors.php @@ -31,57 +31,63 @@ use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Install\Updates\AbstractUpdate; +use TYPO3\CMS\Install\Updates\DatabaseUpdatedPrerequisite; +use TYPO3\CMS\Install\Updates\UpgradeWizardInterface; /** * Migrate template db entries to the correct root pages */ -class UpdateAuthors extends AbstractUpdate { - +class UpdateAuthors implements UpgradeWizardInterface { /** - * @var string + * The wizard identifier */ - protected $identifier = 'tx_sgnews_update_authors'; + const IDENTIFIER = 'tx_sgnews_update_authors'; /** - * @var string + * Retrieves the next site root in the page hierarchy from the current page + * + * @param int $currentPid + * @return int */ - protected $title = 'Migrate all news authors to the new author table for each site root.'; + protected function getSiteRoot($currentPid): int { + $rootLine = BackendUtility::BEgetRootLine((int) $currentPid); + $siteRoot = ['uid' => 0]; + + foreach ($rootLine as $page) { + if ((int) $page['is_siteroot'] === 1) { + $siteRoot = $page; + break; + } + } + + return $siteRoot['uid']; + } /** - * Checks whether updates are required. - * - * @param string &$description The description for the update - * @return bool Whether an update is required (TRUE) or not (FALSE) + * @return string */ - public function checkForUpdate(&$description) { - $description = 'Create new author entries for the old author field of news pages'; - - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); - $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); - $rowCount = $queryBuilder->select('*') - ->from('pages') - ->where( - $queryBuilder->expr()->andX( - $queryBuilder->expr()->eq('doktype', News::DOK_TYPE_NEWS), - $queryBuilder->expr()->isNotNull('author') - ) - ) - ->execute()->rowCount(); + public function getIdentifier(): string { + return self::IDENTIFIER; + } - return $rowCount > 0; + /** + * @return string + */ + public function getTitle(): string { + return 'Migrate all news authors to the new author table for each site root.'; } /** - * Performs the according updates. - * - * @param array &$dbQueries Queries done in this update - * @param mixed &$customMessages Custom messages - * @return bool Whether everything went smoothly or not + * @return string */ - public function performUpdate(array &$dbQueries, &$customMessages) { - $dbQueries = []; + public function getDescription(): string { + return 'Create new author entries for the old author field of news pages'; + } + /** + * @return bool + */ + public function executeUpdate(): bool { $newsQueryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); $newsQueryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); $newsEntries = $newsQueryBuilder->select('*') @@ -94,7 +100,6 @@ class UpdateAuthors extends AbstractUpdate { ) ->execute()->fetchAll(); if (count($newsEntries) <= 0) { - $this->markWizardAsDone(); return TRUE; } foreach ($newsEntries as $news) { @@ -127,8 +132,6 @@ class UpdateAuthors extends AbstractUpdate { 'crdate' => time(), 'tstamp' => time(), ])->execute(); - $dbQueries[] = $authorQueryBuilder->getSQL(); - $authorUid = (int) $authorQueryBuilder->getConnection()->lastInsertId(); } else { $authorUid = $author[0]['uid']; @@ -139,30 +142,36 @@ class UpdateAuthors extends AbstractUpdate { ->set('author', '') ->where($newsQueryBuilder->expr()->eq('uid', $news['uid'])) ->execute(); - $dbQueries[] = $newsQueryBuilder->getSQL(); } - $this->markWizardAsDone(); return TRUE; } /** - * Retrieves the next site root in the page hierarchy from the current page - * - * @param int $currentPid - * @return int + * @return bool */ - protected function getSiteRoot($currentPid): int { - $rootLine = BackendUtility::BEgetRootLine((int) $currentPid); - $siteRoot = ['uid' => 0]; + public function updateNecessary(): bool { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); + $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $rowCount = $queryBuilder->select('*') + ->from('pages') + ->where( + $queryBuilder->expr()->andX( + $queryBuilder->expr()->eq('doktype', News::DOK_TYPE_NEWS), + $queryBuilder->expr()->isNotNull('author') + ) + ) + ->execute()->rowCount(); - foreach ($rootLine as $page) { - if ((int) $page['is_siteroot'] === 1) { - $siteRoot = $page; - break; - } - } + return $rowCount > 0; + } - return $siteRoot['uid']; + /** + * @return array|string[] + */ + public function getPrerequisites(): array { + return [ + DatabaseUpdatedPrerequisite::class + ]; } } diff --git a/Classes/Utility/BackendNewsUtility.php b/Classes/Utility/BackendNewsUtility.php index 97ae987a71d08ae3e02eb3ff98788b0b41cfeb83..4cb2354ff3afcc609df0fd6a15987630a4ff7ad9 100644 --- a/Classes/Utility/BackendNewsUtility.php +++ b/Classes/Utility/BackendNewsUtility.php @@ -42,7 +42,6 @@ use TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider; use TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider; use TYPO3\CMS\Core\Imaging\IconRegistry; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\VersionNumberUtility; use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Extbase\Persistence\QueryInterface; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; @@ -91,9 +90,6 @@ class BackendNewsUtility { public static function getAlternativePageOptions(): array { $options = []; $andWhere = ' AND sys_language_uid IN (0,-1)'; - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $andWhere = ''; - } /** @var array $rootOptionRows */ $rootOptionRows = self::getRecordsByField( 'pages', 'is_siteroot', 1, $andWhere, '', 'sorting' @@ -363,21 +359,12 @@ class BackendNewsUtility { ->groupBy('p.uid') ->orderBy('p.sorting'); if ($languageUid) { - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $queryBuilder->leftJoin('p', 'pages_language_overlay', 'translation', - $queryBuilder->expr()->andX( - $queryBuilder->expr()->eq('translation.pid', 'p.uid'), - $queryBuilder->expr()->eq('translation.sys_language_uid', $queryBuilder->createNamedParameter($languageUid, \PDO::PARAM_INT)) - ) - ); - } else { - $queryBuilder->leftJoin('p', 'pages', 'translation', - $queryBuilder->expr()->andX( - $queryBuilder->expr()->eq('translation.l10n_parent', 'p.uid'), - $queryBuilder->expr()->eq('translation.sys_language_uid', $queryBuilder->createNamedParameter($languageUid, \PDO::PARAM_INT)) - ) - ); - } + $queryBuilder->leftJoin('p', 'pages', 'translation', + $queryBuilder->expr()->andX( + $queryBuilder->expr()->eq('translation.l10n_parent', 'p.uid'), + $queryBuilder->expr()->eq('translation.sys_language_uid', $queryBuilder->createNamedParameter($languageUid, \PDO::PARAM_INT)) + ) + ); } if (isset($filters['tags']) && is_array($filters['tags']) && count($filters['tags'])) { diff --git a/Classes/Utility/ExtensionUtility.php b/Classes/Utility/ExtensionUtility.php deleted file mode 100644 index 65cf527ef8ecea6ca50d5026f4a97099089e3298..0000000000000000000000000000000000000000 --- a/Classes/Utility/ExtensionUtility.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -namespace SGalinski\SgNews\Utility; - -/** - * - * 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\Utility\VersionNumberUtility; - -/** - * Class ExtensionUtility - * - * @package SGalinski\SgMail\Utility - * @author Kevin Ditscheid <kevin.ditscheid@sgalinski.de> - */ -class ExtensionUtility { - /** - * Get the extension configuration - * - * @param string $extKey - * @return array - */ - public static function getExtensionConfiguration(string $extKey = 'sg_news'): array { - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $extConf = \unserialize( - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][$extKey], ['allowed_classes' => FALSE] - ); - return is_array($extConf) ? $extConf : []; - } - - return $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extKey] ?? []; - } -} diff --git a/Classes/ViewHelpers/Backend/ControlViewHelper.php b/Classes/ViewHelpers/Backend/ControlViewHelper.php index f1aedda2430b977f668d936e6ca1ed12b0f7d370..b8a5c8a4edd4bfd4c825daaec32de88edb3ece43 100644 --- a/Classes/ViewHelpers/Backend/ControlViewHelper.php +++ b/Classes/ViewHelpers/Backend/ControlViewHelper.php @@ -34,7 +34,6 @@ use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\VersionNumberUtility; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; use TYPO3\CMS\Recordlist\RecordList\DatabaseRecordList; @@ -77,12 +76,7 @@ class ControlViewHelper extends AbstractViewHelper { $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class); $pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/AjaxDataHandler'); $pageRenderer->addInlineLanguageLabelFile('EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf'); - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $languageService = GeneralUtility::makeInstance(\TYPO3\CMS\Lang\LanguageService::class); - } else { - $languageService = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Localization\LanguageService::class); - } - + $languageService = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Localization\LanguageService::class); $languageService->includeLLFile('EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf'); $databaseRecordList->currentTable = $sortingData; @@ -103,17 +97,6 @@ class ControlViewHelper extends AbstractViewHelper { $iconFactory = GeneralUtility::makeInstance(IconFactory::class); $buttonLabel = LocalizationUtility::translate('backend.button.editPageContent', 'SgNews'); $path = ''; - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $rootline = BackendUtility::BEgetRootLine($row['uid'], '', TRUE); - ksort($rootline); - $path = '/root'; - foreach ($rootline as $page) { - $path .= '/p' . dechex($page['uid']); - } - - $path = ', \'' . $path . '\''; - } - $onclick = 'return TYPO3.SgNewsModule.sgNewsGoToPageModule(' . $row['uid'] . $path . ');'; $icon = $iconFactory->getIcon('actions-document-open-white', Icon::SIZE_SMALL)->render(); $wrap = ' <div class="btn-group" role="group">%s</div>'; diff --git a/Classes/ViewHelpers/Backend/EditOnClickViewHelper.php b/Classes/ViewHelpers/Backend/EditOnClickViewHelper.php index 9645ebf43252d074dd791cd6151da6863d22f80b..2d3cbb0d57a1ebe15c913922a3c2f78fdc5257db 100644 --- a/Classes/ViewHelpers/Backend/EditOnClickViewHelper.php +++ b/Classes/ViewHelpers/Backend/EditOnClickViewHelper.php @@ -28,7 +28,10 @@ namespace SGalinski\SgNews\ViewHelpers\Backend; use SGalinski\SgNews\Utility\BackendNewsUtility; use SGalinski\SgNews\ViewHelpers\AbstractViewHelper; -use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Backend\Routing\Exception\RouteNotFoundException; +use TYPO3\CMS\Backend\Routing\UriBuilder; +use TYPO3\CMS\Core\Utility\ArrayUtility; +use TYPO3\CMS\Core\Utility\GeneralUtility; /** * Class EditOnClickViewHelper @@ -52,18 +55,36 @@ class EditOnClickViewHelper extends AbstractViewHelper { * @return string */ public function render(): string { - $table = $this->arguments['table']; - $uid = $this->arguments['uid']; - $new = $this->arguments['new']; - $type = $this->arguments['type']; - $additionalParameters = ''; - if ($new && $table === 'pages' && in_array($type, ['news', 'category'], TRUE)) { - $additionalParameters = '&overrideVals[pages][doktype]=' . - ($type === 'news' ? BackendNewsUtility::NEWS_DOKTYPE : BackendNewsUtility::CATEGORY_DOKTYPE); + $additionalParameters = []; + if ($this->arguments['new'] && $this->arguments['table'] === 'pages' && in_array($this->arguments['type'], ['news', 'category'], TRUE)) { + $additionalParameters = [ + 'overrideVals' => + [ + 'pages' => + [ + 'doktype' => $this->arguments['type'] === 'news' ? BackendNewsUtility::NEWS_DOKTYPE : BackendNewsUtility::CATEGORY_DOKTYPE + ] + ] + ]; + } + $parameters = [ + 'edit' => [ + $this->arguments['table'] => [ + $this->arguments['uid'] => [ + $this->arguments['new'] ? 'new' : 'edit' + ] + ] + ], + 'returnUrl' => rawurlencode(GeneralUtility::getIndpEnv('REQUEST_URI')) + ]; + ArrayUtility::mergeRecursiveWithOverrule($parameters, $additionalParameters); + try { + return GeneralUtility::makeInstance(UriBuilder::class)->buildUriFromRoute( + 'record_edit', + $parameters + ); + } catch (RouteNotFoundException $exception) { + return ''; } - - return BackendUtility::editOnClick( - '&edit[' . $table . '][' . $uid . ']=' . ($new ? 'new' : 'edit') . $additionalParameters, '', -1 - ); } } diff --git a/Classes/ViewHelpers/Backend/TranslationLinksViewHelper.php b/Classes/ViewHelpers/Backend/TranslationLinksViewHelper.php index 249f4827a1e712dfca2d527bc54b1adc1d7d8913..ff0645abcb3bdb37f312e5ab31da56bf6a8abb11 100644 --- a/Classes/ViewHelpers/Backend/TranslationLinksViewHelper.php +++ b/Classes/ViewHelpers/Backend/TranslationLinksViewHelper.php @@ -35,7 +35,6 @@ use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Type\Icon\IconState; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Core\Utility\VersionNumberUtility; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; /** @@ -94,13 +93,8 @@ class TranslationLinksViewHelper extends AbstractViewHelper { $editLabel = LocalizationUtility::translate('backend.action.edit', 'SgNews'); $newLabel = LocalizationUtility::translate('backend.action.new', 'SgNews'); $translationParameters = '&cmd[' . $table . '][' . $row['uid'] . '][localize]=%s'; - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $returnUrl = BackendUtility::getModuleUrl('web_SgNewsNews', ['id' => GeneralUtility::_GP('id')]); - } else { - $returnUrl = GeneralUtility::makeInstance(UriBuilder::class) - ->buildUriFromRoute('web_SgNewsNews', ['id' => GeneralUtility::_GP('id')]); - } - + $returnUrl = GeneralUtility::makeInstance(UriBuilder::class) + ->buildUriFromRoute('web_SgNewsNews', ['id' => GeneralUtility::_GP('id')]); foreach ($languages as $languageUid => $language) { $translatedUid = 0; if ((int) $languageUid <= 0) { @@ -115,26 +109,15 @@ class TranslationLinksViewHelper extends AbstractViewHelper { } if ($translatedUid) { - if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $link = BackendUtility::getModuleUrl('record_edit', [ + $link = GeneralUtility::makeInstance(UriBuilder::class) + ->buildUriFromRoute('record_edit', [ 'edit' => [ $translationTable => [ $translatedUid => 'edit' ] ], - 'returnUrl' => $returnUrl + 'returnUrl' => (string) $returnUrl ]); - } else { - $link = GeneralUtility::makeInstance(UriBuilder::class) - ->buildUriFromRoute('record_edit', [ - 'edit' => [ - $translationTable => [ - $translatedUid => 'edit' - ] - ], - 'returnUrl' => (string) $returnUrl - ]); - } $out .= ' <a href="' . $link . '" title="'. $language['title'] . ' [' . $editLabel . ']" >' . $iconFactory->getIcon($language['flag'], Icon::SIZE_SMALL)->render() diff --git a/Configuration/Commands.php b/Configuration/Commands.php new file mode 100644 index 0000000000000000000000000000000000000000..813f2eed18af07382c22a5a6c20bad8a1c1a2ecd --- /dev/null +++ b/Configuration/Commands.php @@ -0,0 +1,6 @@ +<?php +return [ + 'sg_news:migrateNews' => [ + 'class' => \SGalinski\SgNews\Command\MigrateNewsCommandController::class + ] +]; diff --git a/Configuration/Extbase/Persistence/Classes.php b/Configuration/Extbase/Persistence/Classes.php new file mode 100644 index 0000000000000000000000000000000000000000..1630518858a63d3e3784138bd2f1f0597cba9fe9 --- /dev/null +++ b/Configuration/Extbase/Persistence/Classes.php @@ -0,0 +1,70 @@ +<?php +declare(strict_types=1); + +// if you need to change this, keep in mind the changes need to be done in +// Configuration/TypoScript/Common/setup.typoscript for TYPO3 9, too +return [ + \SGalinski\SgNews\Domain\Model\News::class => [ + 'tableName' => 'pages', + 'recordType' => \SGalinski\SgNews\Domain\Model\News::DOK_TYPE_NEWS, + 'properties' => [ + 'highlighted' => [ + 'fieldName' => 'tx_sgnews_highlighted' + ], + 'neverHighlighted' => [ + 'fieldName' => 'tx_sgnews_never_highlighted' + ], + 'relatedNews' => [ + 'fieldName' => 'tx_sgnews_related_news' + ], + 'newsAuthor' => [ + 'fieldName' => 'tx_sgnews_news_author' + ], + 'lastUpdated' => [ + 'fieldName' => 'lastUpdated' + ], + 'creationDate' => [ + 'fieldName' => 'crdate' + ], + 'teaser1Image' => [ + 'fieldName' => 'tx_sgnews_teaser1_image' + ], + 'teaser2Image' => [ + 'fieldName' => 'tx_sgnews_teaser2_image' + ], + 'tags' => [ + 'fieldName' => 'tx_sgnews_tags' + ], + 'likes' => [ + 'fieldName' => 'tx_sgnews_likes' + ], + 'contentFromAnotherPage' => [ + 'fieldName' => 'tx_sgnews_content_from_another_page' + ], + 'location' => [ + 'fieldName' => 'tx_sgnews_location' + ], + 'dateEnd' => [ + 'fieldName' => 'tx_sgnews_date_end' + ] + ] + ], + \SGalinski\SgNews\Domain\Model\Category::class => [ + 'tableName' => 'pages', + 'recordType' => \SGalinski\SgNews\Domain\Model\Category::DOK_TYPE_CATEGORY, + 'properties' => [ + 'teaser1Image' => [ + 'fieldName' => 'tx_sgnews_teaser1_image' + ], + 'teaser2Image' => [ + 'fieldName' => 'tx_sgnews_teaser2_image' + ] + ] + ], + \SGalinski\SgNews\Domain\Model\Tag::class => [ + 'tableName' => 'sys_category' + ], + \SGalinski\SgNews\Domain\Model\FileReference::class => [ + 'tableName' => 'sys_file_reference' + ] +]; diff --git a/Configuration/TCA/Overrides/pages.php b/Configuration/TCA/Overrides/pages.php index 0122d1da42e3d1fdbc4a512a9d4a0bf1a5b8dd28..441a4453d5ee973807a73af68890fd545aa3c5bd 100644 --- a/Configuration/TCA/Overrides/pages.php +++ b/Configuration/TCA/Overrides/pages.php @@ -225,11 +225,6 @@ call_user_func( 'items' => [ ['', ''], ], - 'wizards' => [ - 'suggest' => [ - 'type' => 'suggest', - ], - ], 'fieldControl' => [ 'addRecord' => [ 'disabled' => FALSE, @@ -250,12 +245,7 @@ call_user_func( 'maxitems' => 1, 'items' => [ ['', ''], - ], - 'wizards' => [ - 'suggest' => [ - 'type' => 'suggest', - ], - ], + ] ], ], 'tx_sgnews_related_news' => [ @@ -268,12 +258,7 @@ call_user_func( 'allowed' => $table, 'size' => 5, 'minitems' => 0, - 'maxitems' => 99, - 'wizards' => [ - 'suggest' => [ - 'type' => 'suggest', - ], - ], + 'maxitems' => 99 ], ], 'tx_sgnews_highlighted' => [ @@ -398,60 +383,45 @@ call_user_func( 'canNotCollapse' => 1, ]; - // Removal of the realurl fields, if the extension isn't installed. - if (!\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('realurl')) { - $GLOBALS['TCA'][$table]['palettes']['titleDescriptionAndHighlightFlag'] = str_replace( - '--linebreak--, tx_realurl_pathsegment, tx_realurl_exclude,', '', - $GLOBALS['TCA'][$table]['palettes']['titleDescriptionAndHighlightFlag'] - ); - $GLOBALS['TCA'][$table]['types'][117] = str_replace( - 'tx_realurl_pathsegment, tx_realurl_exclude,', '', - $GLOBALS['TCA'][$table]['types'][117] - ); - } - - if (\version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '>')) { - // if TYPO3 9.5, exclude a lot of fields from the news doktype in localizations - foreach ( - $GLOBALS['TCA'][$table]['columns'] as $languageExcludeField => $_ + foreach ( + $GLOBALS['TCA'][$table]['columns'] as $languageExcludeField => $_ + ) { + if ( + !\in_array( + $languageExcludeField, [ + 'doktype', + 'title', + 'subtitle', + 'description', + 'slug', + 'tx_projectbase_path_segment', + 'tx_projectbase_excludefromsluggeneration', + 'tx_sgnews_location', + 'tx_sgnews_teaser1_image', + 'tx_sgnews_teaser2_image', + 'tx_sgnews_tags', + 'abstract', + 'tx_projectbase_seo_titletag', + 'tx_projectbase_seo_canonicaltag', + 'hidden', + 'sys_language_uid', + 'tx_languagevisibility_visibility', + 'lastUpdated', + 'tx_sgnews_date_end', + 'tx_sgnews_highlighted', + 'tx_sgnews_never_highlighted', + ] + ) ) { - if ( - !\in_array( - $languageExcludeField, [ - 'doktype', - 'title', - 'subtitle', - 'description', - 'slug', - 'tx_projectbase_path_segment', - 'tx_projectbase_excludefromsluggeneration', - 'tx_sgnews_location', - 'tx_sgnews_teaser1_image', - 'tx_sgnews_teaser2_image', - 'tx_sgnews_tags', - 'abstract', - 'tx_projectbase_seo_titletag', - 'tx_projectbase_seo_canonicaltag', - 'hidden', - 'sys_language_uid', - 'tx_languagevisibility_visibility', - 'lastUpdated', - 'tx_sgnews_date_end', - 'tx_sgnews_highlighted', - 'tx_sgnews_never_highlighted', - ] - ) - ) { - $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE]['columnsOverrides'][$languageExcludeField]['l10n_mode'] = 'exclude'; - } + $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE]['columnsOverrides'][$languageExcludeField]['l10n_mode'] = 'exclude'; } - - $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE]['columnsOverrides']['title']['label'] = - 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_db.xlf:' . $table . '.title'; - $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE]['columnsOverrides']['subtitle']['label'] = - 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_db.xlf:' . $table . '.subtitle'; - $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE]['columnsOverrides']['slug']['label'] = - 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_db.xlf:' . $table . '.slug'; } + + $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE]['columnsOverrides']['title']['label'] = + 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_db.xlf:' . $table . '.title'; + $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE]['columnsOverrides']['subtitle']['label'] = + 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_db.xlf:' . $table . '.subtitle'; + $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE]['columnsOverrides']['slug']['label'] = + 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_db.xlf:' . $table . '.slug'; }, 'sg_news', 'pages' ); diff --git a/Configuration/TCA/Overrides/pages_language_overlay.php b/Configuration/TCA/Overrides/pages_language_overlay.php deleted file mode 100644 index 0c0151b69bafa0591431fbe510c3ee56f4f9b7d4..0000000000000000000000000000000000000000 --- a/Configuration/TCA/Overrides/pages_language_overlay.php +++ /dev/null @@ -1,200 +0,0 @@ -<?php -/** - * - * 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! - */ - -if (\version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - call_user_func( - function ($extKey, $table) { - $pagesTable = 'pages'; - $localLangDbPath = 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_db.xlf:'; - $localLangBackendPath = 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_backend.xlf:'; - - $GLOBALS['TYPO3_CONF_VARS']['FE']['pageOverlayFields'] .= ',tx_sgnews_teaser1_image,tx_sgnews_teaser2_image'; - - foreach ( - [ - \SGalinski\SgNews\Utility\BackendNewsUtility::CATEGORY_DOKTYPE => [ - 'icon' => 'EXT:sg_news/Resources/Public/Images/Category.png', - 'locallangIndex' => 'pageType.category' - ], - \SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE => [ - 'icon' => 'EXT:sg_news/Resources/Public/Images/News.png', - 'locallangIndex' => 'pageType.news' - ] - ] as $doktype => $configuration) { - // also add the new doktype to the page language overlays type selector (so that translations can inherit the same type) - $GLOBALS['TCA'][$table]['columns']['doktype']['config']['items'][] = [ - $localLangBackendPath . $configuration['locallangIndex'], - $doktype, - $configuration['icon'] - ]; - } - - $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE] = [ - 'showitem' => '--palette--;LLL:EXT:cms/locallang_tca.xlf:' . $pagesTable . '.palettes.standard;standard, - subtitle;' . $localLangDbPath . $pagesTable . '.subtitle.inPalette, - description, tx_realurl_pathsegment, author, tx_sgnews_location, - --div--;' . $localLangDbPath . $pagesTable . '.tabs.images, - tx_sgnews_teaser2_image, tx_sgnews_teaser1_image, - --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:' . $pagesTable . '.tabs.metadata, - --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:' . $pagesTable . '.palettes.abstract;abstract, - tx_projectbase_seo_titletag,tx_projectbase_seo_canonicaltag, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - sys_language_uid, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;LLL:EXT:cms/locallang_tca.xlf:' . $pagesTable . '.palettes.visibility;hiddenonly, - --palette--;LLL:EXT:cms/locallang_tca.xlf:' . $pagesTable . '.palettes.access;access' - ]; - - $GLOBALS['TCA'][$table]['types'][\SGalinski\SgNews\Utility\BackendNewsUtility::CATEGORY_DOKTYPE] = [ - 'showitem' => '--palette--;LLL:EXT:cms/locallang_tca.xlf:' . $pagesTable . '.palettes.standard;standard, - title, tx_realurl_pathsegment, - --div--;' . $localLangDbPath . $table . '.tabs.images, - tx_sgnews_teaser2_image, tx_sgnews_teaser1_image, - --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:' . $pagesTable . '.tabs.metadata, - --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:' . $pagesTable . '.palettes.abstract;abstract, - tx_projectbase_seo_titletag,tx_projectbase_seo_canonicaltag, description, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, - sys_language_uid, - --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, - --palette--;LLL:EXT:cms/locallang_tca.xlf:' . $pagesTable . '.palettes.visibility;hiddenonly, - --palette--;LLL:EXT:cms/locallang_tca.xlf:' . $pagesTable . '.palettes.access;access' - ]; - - \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns( - $table, [ - 'tx_sgnews_teaser1_image' => [ - 'exclude' => TRUE, - 'label' => $localLangDbPath . $pagesTable . '.tx_sgnews_teaser1_image', - 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( - 'tx_sgnews_teaser1_image', - [ - 'maxitems' => 9999, - 'foreign_types' => [ - '0' => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_TEXT => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_IMAGE => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_AUDIO => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_VIDEO => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_APPLICATION => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ] - ], - 'appearance' => [ - 'showPossibleLocalizationRecords' => TRUE, - 'showRemovedLocalizationRecords' => TRUE, - 'showSynchronizationLink' => TRUE, - 'showAllLocalizationLink' => TRUE, - ], - ], - $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'] - ), - ], - 'tx_sgnews_teaser2_image' => [ - 'exclude' => TRUE, - 'label' => $localLangDbPath . $pagesTable . '.tx_sgnews_teaser2_image', - 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( - 'tx_sgnews_teaser2_image', - [ - 'maxitems' => 9999, - 'foreign_types' => [ - '0' => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_TEXT => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_IMAGE => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_AUDIO => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_VIDEO => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ], - \TYPO3\CMS\Core\Resource\File::FILETYPE_APPLICATION => [ - 'showitem' => ' - --palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, - --palette--;;filePalette' - ] - ], - 'appearance' => [ - 'showPossibleLocalizationRecords' => TRUE, - 'showRemovedLocalizationRecords' => TRUE, - 'showSynchronizationLink' => TRUE, - 'showAllLocalizationLink' => TRUE, - ], - ], - $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'] - ), - ], - 'tx_sgnews_location' => [ - 'exclude' => TRUE, - 'label' => $localLangDbPath . $pagesTable . '.tx_sgnews_location', - 'config' => [ - 'type' => 'input', - 'size' => 20, - 'eval' => 'trim' - ] - ] - ] - ); - - }, 'sg_news', 'pages_language_overlay' - ); -} diff --git a/Configuration/TCA/tx_sgnews_domain_model_author.php b/Configuration/TCA/tx_sgnews_domain_model_author.php index 4d5cddff1e1ca317f1698079bc69f26389b3d0ca..f3571b150530d2cc39b35c4e743aac46bb9d2a63 100644 --- a/Configuration/TCA/tx_sgnews_domain_model_author.php +++ b/Configuration/TCA/tx_sgnews_domain_model_author.php @@ -45,10 +45,7 @@ $configuration = [ 'transOrigDiffSourceField' => 'l10n_diffsource', 'iconfile' => 'EXT:sg_news/Resources/Public/Icons/module-sgnews.svg' ], - 'interface' => [ - 'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, crdate, name, email, - description, website, image, path_segment', - ], + 'interface' => [], 'types' => [ '1' => [ 'showitem' => 'hidden;;1, --palette--;;authorInfos, path_segment, description' @@ -73,7 +70,7 @@ $configuration = [ 'label' => 'LLL:EXT:sg_news/Resources/Private/Language/locallang_db.xlf:tx_sgnews_domain_model_author.crdate', 'config' => [ 'type' => 'input', - 'max' => '20', + 'max' => 20, 'eval' => 'datetime', 'default' => $GLOBALS['EXEC_TIME'], ] @@ -105,7 +102,6 @@ $configuration = [ ], 'l10n_parent' => [ 'displayCond' => 'FIELD:sys_language_uid:>:0', - 'exclude' => TRUE, 'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xlf:LGL.l18n_parent', 'config' => [ 'type' => 'select', @@ -197,12 +193,8 @@ $configuration = [ ], ] ]; - - -// The slug field isn't available for TYPO3 8 and below. -if (TYPO3\CMS\Core\Utility\VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version) < 9000000) { - unset($configuration['columns']['path_segment']); - $configuration['types'] = str_replace('path_segment', '', $configuration['types']); +if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '10.3.0', '<')) { + $configuration['interface']['showRecordFieldList'] = 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, crdate, name, email, description, website, image, path_segment'; } return $configuration; diff --git a/Configuration/TypoScript/Common/setup.typoscript b/Configuration/TypoScript/Common/setup.typoscript index 5c5bbd5e8856d78a0652ddd92b6229e69143687a..1223a9805550ed76981e5ea357b34c112095d4f1 100644 --- a/Configuration/TypoScript/Common/setup.typoscript +++ b/Configuration/TypoScript/Common/setup.typoscript @@ -1,6 +1,8 @@ config.tx_extbase { persistence { classes { + # @deprecated This configuration does not work in TYPO3 10 at all, you need to also change + # Configuration/Extbase/Persistence/Classes.php SGalinski\SgNews\Domain\Model\News { mapping { tableName = pages diff --git a/README.md b/README.md index 20c3369edc4992cfde828335ae3e130c3685c6e4..851ebb81552358e65b962dd505c828e6f05bc6c5 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Repository: https://gitlab.sgalinski.de/typo3/sg_news Please report bugs here: https://gitlab.sgalinski.de/typo3/sg_news -TYPO3 version: >=7.6 +TYPO3 version: >=9.5 **Note**: sg_news can be used for free or by buying a licence key from our <a href="https://shop.sgalinski.de/products/" target="_blank">online shop</a>. You can enter the licence key in the extension manager configuration of sg_news. @@ -27,15 +27,11 @@ additional meta information. This extensions adds the behaviour, that the images of the localization of a news or categories could be differ to the image in the default language. So the images can be translated now. -NOTE: This extension is just working, if the patch "pages_language_overlay_fix.diff" is active. The pull request for -this patch could be found here: [pull request](https://github.com/froemken/repair_translation/pull/1) - - ## Integration -Before using sg_news you need to supply your frontend some information on how the extension needs to be integrated into your template. +Before using sg_news you need to supply your frontend some information on how the extension needs to be integrated into your template. -As the extension itself provides two new [doktypes](https://docs.typo3.org/typo3cms/CoreApiReference/PageTypes/Index.html), you can simply add a switch case to your Fluid template to provide different rendering paths. +As the extension itself provides two new [doktypes](https://docs.typo3.org/typo3cms/CoreApiReference/PageTypes/Index.html), you can simply add a switch case to your Fluid template to provide different rendering paths. ### Example @@ -87,14 +83,14 @@ lib.pageTemplate.default { } ``` -In this example we will load the first column for the intro section by default -and the second column in the backend for the content below that. +In this example we will load the first column for the intro section by default +and the second column in the backend for the content below that. -The news category (doktype 117) will render by default not the content on the page alone, but also the default category listing. +The news category (doktype 117) will render by default not the content on the page alone, but also the default category listing. With our example we don't want the intro section (116) and the default content to be rendered, because the extension handles those parts. -The single news plugin also needs some additional information so it can get the base content. +The single news plugin also needs some additional information so it can get the base content. By default it will resolve to the following code if not provided by you: ``` @@ -102,8 +98,8 @@ lib.mainContent < styles.content.col1 ``` ### Example integration into your page template -Finally you need to output the **INTRO** and **CONTENT** variable in your page template: - +Finally you need to output the **INTRO** and **CONTENT** variable in your page template: + <main> <!--TYPO3SEARCH_begin--> <f:if condition="{INTRO}"> @@ -112,7 +108,7 @@ Finally you need to output the **INTRO** and **CONTENT** variable in your page t {BREADCRUMB_MENU -> f:format.raw()} </div> </f:if> - + <div class="main-content"> {CONTENT -> f:format.raw()} </div> @@ -144,7 +140,7 @@ routeEnhancers: In addition to categories, multiple tags can be created and specified for each news page. Tags can be created by adding sys_category records to the root page of the news block (blog). -In order to differentiate each block's tags from the others, +In order to differentiate each block's tags from the others, the PageTS value of **TCEFORM.pages.tx_sgnews_tags.PAGE_TSCONFIG_ID** can be set for each of the blocks containing the pid value for the selectable tags. @@ -157,31 +153,31 @@ Add the plugin **News Overview** and optionally the plugin **Latest News** to a After that you must create sites of type **Category** sites below the blog page level and name them accordingly. -On the next lower page level of each **Category** you can create pages of type **News**. -On these pages you can use all your usual content elements to visualize your news entries belonging to the specific category. +On the next lower page level of each **Category** you can create pages of type **News**. +On these pages you can use all your usual content elements to visualize your news entries belonging to the specific category. ### Plugins General settings for the plugins can be found in the **Frontend/setup.txt** and **Frontend/constants.txt** TypoScript file: - + *setup.txt* settings { # Name of your site - required for the news.xml siteName = - + # Your rootpage id - required for the news.xml to retrieve the base path rootpageId = 1 - + # News limit (can be usually set also inside the flexforms) newsLimitPerPage = {$plugin.tx_sgnews.settings.newsLimitPerPage} - + # Uid of the page containing sys_category records used as tags tagPid = {$plugin.tx_sgnews.settings.tagPid} - + # How to sort the news in general (date, positionInTree) sortBy = date } - + *constants.txt* settings { @@ -225,7 +221,7 @@ Provides a RSS Feed **news.xml** as a typenum. The typenum is defined in the **F newsFeed = PAGE newsFeed { typeNum = 78906523 - + 10 = USER 10 { userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run @@ -243,7 +239,7 @@ Provides a RSS Feed **news.xml** as a typenum. The typenum is defined in the **F showCategories = } } - + config { disableAllHeaderCode = 1 additionalHeaders = Content-type:text/xml @@ -253,19 +249,19 @@ Provides a RSS Feed **news.xml** as a typenum. The typenum is defined in the **F } --- ###### PageBrowser -Automatically adds a pagination to the **News Overview** and **List News** plugins. +Automatically adds a pagination to the **News Overview** and **List News** plugins. You find the settings in the **Fontend/constants.txt** configuration file: pagebrowser.settings { # Number of page links to show before the current page pagesBefore = 1 - + # Number of page links to show before the current page pagesAfter = 1 - + # Enables section for "more" pages. This section is shown after links to next pages, normally like three dots (1 2 3 ...). Notice that you can also hide it by emptying corresponding template section. enableMorePages = 1 - + # Enables section for "less" pages. This section is shown after links to next pages, normally like three dots (... 1 2 3) Notice that you can also hide it by emptying corresponding template section. enableLessPages = 1 } @@ -278,7 +274,7 @@ If it should be like this, then make sure to remove this button from the sg_news ## The Backend Module -After a successful Installation, you have a new module in the "WEB" section of your TYPO3 Backend. +After a successful Installation, you have a new module in the "WEB" section of your TYPO3 Backend. Clicking on it loads the administration panel. Using the drop-down above you can switch between the different languages set up in your TYPO3 installation. Once you have selected a language, the module will display the news records and tag filter corresponding to that language. @@ -294,7 +290,7 @@ You can also use the '<img height="20px" width="20px" src="https://camo.githubus ### Options for your news list items -For each news item in the paginated result list you have multiple editing/administration options, depending on the logged-in user's permissions. +For each news item in the paginated result list you have multiple editing/administration options, depending on the logged-in user's permissions. You can click a list item's title to edit it (language sensitive) or use the menu buttons: @@ -312,7 +308,7 @@ You can click a list item's title to edit it (language sensitive) or use the men <br> <img height="20px" width="20px" src="https://camo.githubusercontent.com/b4980d61f65fdfca4853fbd240f88de2b6fcb893/68747470733a2f2f7261776769742e636f6d2f5459504f332f5459504f332e49636f6e732f6d61737465722f646973742f616374696f6e732f616374696f6e732d706167652d6d6f76652e737667"> Change the page's position in the page-tree <br> -<img height="20px" width="20px" src="https://camo.githubusercontent.com/91c383d7beded93dbe6a62e2a1ae94bf82d1d783/68747470733a2f2f7261776769742e636f6d2f5459504f332f5459504f332e49636f6e732f6d61737465722f646973742f616374696f6e732f616374696f6e732d646f63756d656e742d686973746f72792d6f70656e2e737667"> Show history +<img height="20px" width="20px" src="https://camo.githubusercontent.com/91c383d7beded93dbe6a62e2a1ae94bf82d1d783/68747470733a2f2f7261776769742e636f6d2f5459504f332f5459504f332e49636f6e732f6d61737465722f646973742f616374696f6e732f616374696f6e732d646f63756d656e742d686973746f72792d6f70656e2e737667"> Show history <br> <img height="20px" width="20px" src="https://camo.githubusercontent.com/78584763b0c5d3c1908183719f3b37508bd54620/68747470733a2f2f7261776769742e636f6d2f5459504f332f5459504f332e49636f6e732f6d61737465722f646973742f616374696f6e732f616374696f6e732d6c6f636b2e737667"> Change permissions <br> @@ -351,4 +347,3 @@ This extension comes with the command controller task **** to migirate tx_news e To use your old file references, you need to import your sys_file and sys_file_reference_table as sys_file_news_migration and sys_file_reference into your database. The Filepaths must not change! - diff --git a/Resources/Private/Templates/Backend/Index.html b/Resources/Private/Templates/Backend/Index.html index 850801f8170cb1101fe62cb44aad3a0a1c030d93..85528e985b0e8fc471bfa28d746d361c8b7b1185 100644 --- a/Resources/Private/Templates/Backend/Index.html +++ b/Resources/Private/Templates/Backend/Index.html @@ -58,7 +58,7 @@ <f:alias map="{newsItemTags: '{sg:backend.newsItemTags(uid: singleNews.uid, languageUid: language)}'}"> <f:if condition="{singleNews.translation_uid}"> <f:then> - <a href="#" onclick="{sg:backend.editOnClick(table: 'pages_language_overlay', uid: singleNews.translation_uid)}"> + <a href="#" onclick="{sg:backend.editOnClick(table: 'pages', uid: singleNews.translation_uid)}"> <span> <f:if condition="{singleNews.translation_title}"> <f:then> diff --git a/Upgrade.md b/Upgrade.md index 060dbef44962ea76ff9e44db2826ec07a075a4f6..46954d1bba673691d031d2f86b9ecf3a3a58a2fb 100644 --- a/Upgrade.md +++ b/Upgrade.md @@ -54,3 +54,7 @@ In order for your module bundler to find the ```sgnews``` package, you need to a } } ``` + +## Version 9 Breaking Changes + +- Dropped TYPO3 8 support diff --git a/composer.json b/composer.json index f933f36f73105b24373524663019e5c1bb7ac90a..a4b2c3791d8c6beb66183ee7060f921086588f7d 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "license": [ "GPL-2.0-or-later" ], - "version": "8.4.2", + "version": "9.0.0-dev", "support": { }, "repositories": [ @@ -24,7 +24,7 @@ } ], "require": { - "typo3/cms-core": "^8.7.0 || ^9.5.1" + "typo3/cms-core": "^9.5.0 || ^10.4.0" }, "require-dev": { "roave/security-advisories": "dev-master" diff --git a/ext_emconf.php b/ext_emconf.php index 0043a6d3dc752276f47988a3c350e55fcb6ee75a..c7a7993ed43512d5f4c2d706cf2d700466afa286 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -1,6 +1,6 @@ <?php -$EM_CONF[$_EXTKEY] = [ +$EM_CONF['sg_news'] = [ 'title' => 'News System', 'description' => 'News System', 'category' => 'plugin', @@ -19,17 +19,17 @@ $EM_CONF[$_EXTKEY] = [ 'modify_tables' => '', 'clearCacheOnLoad' => 0, 'lockType' => '', - 'version' => '8.4.2', + 'version' => '9.0.0-dev', 'constraints' => [ 'depends' => [ - 'typo3' => '8.7.0-9.5.99', - 'php' => '7.0.0-7.3.99', + 'typo3' => '9.5.0-10.4.99', + 'php' => '7.3.0-7.4.99', ], 'conflicts' => [], 'suggests' => [ - 'sg_comments' => '3.0.0', - 'sg_ajax' => '2.0.0', - 'languagevisibility' => '2.0.0', + 'sg_comments' => '5.0.0', + 'sg_ajax' => '3.0.0', + 'languagevisibility' => '3.0.0', ], ], 'suggests' => [], diff --git a/ext_localconf.php b/ext_localconf.php index 101048027654eb2da97d1f504ba92184ba7a9558..2da0053c54e7746ef0a946911bae3c9704d5cd74 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -28,7 +28,7 @@ call_user_func( function ($extKey) { // common typoscript configuration \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTypoScriptSetup( - '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:' . $extKey . '/Configuration/TypoScript/Common/setup.typoscript">' + '@import "EXT:' . $extKey . '/Configuration/TypoScript/Common/setup.typoscript"' ); // plugin configurations @@ -106,12 +106,6 @@ call_user_func( $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects']['TYPO3\CMS\Core\Page\PageRenderer'] = ['className' => 'SGalinski\SgNews\Xclass\PageRenderer']; - // add realurl configuration - if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('realurl')) { - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/realurl/class.tx_realurl_autoconfgen.php']['extensionConfiguration']['sgnews'] = - \SGalinski\SgNews\Hooks\RealUrlAutoConfiguration::class . '->addNewsConfig'; - } - /** @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher $signalSlotDispatcher */ $signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( \TYPO3\CMS\Extbase\SignalSlot\Dispatcher::class @@ -130,10 +124,6 @@ call_user_func( $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/db_layout.php']['drawHeaderHook'][] = \SGalinski\SgNews\Hooks\PageLayoutController::class . '->addNewsModuleLink'; - // register command controllers - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = - 'SGalinski\SgNews\Command\MigrateNewsCommandController'; - // add the new doktype to the list of types available from the new page menu at the top of the page tree \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addUserTSConfig( 'options.pageTree.doktypesToShowInNewPageDragArea := addToList(' . \SGalinski\SgNews\Utility\BackendNewsUtility::NEWS_DOKTYPE . ')' . PHP_EOL @@ -143,11 +133,13 @@ call_user_func( \SGalinski\SgNews\Utility\BackendNewsUtility::registerIcons(); \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig( - '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:' . $extKey . '/Configuration/TsConfig/Page/NewContentElementWizard.tsconfig">' + '@import "EXT:' . $extKey . '/Configuration/TsConfig/Page/NewContentElementWizard.tsconfig"' ); // Add upgrade wizards - $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update']['tx_sgnews_update_authors'] = + $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][\SGalinski\SgNews\Updates\UpdateAuthors::IDENTIFIER] = \SGalinski\SgNews\Updates\UpdateAuthors::class; + $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'][\SGalinski\SgNews\Updates\MigrateSchedulerTasks::IDENTIFIER] = + \SGalinski\SgNews\Updates\MigrateSchedulerTasks::class; }, 'sg_news' ); diff --git a/ext_tables.php b/ext_tables.php index 0d7d12fd1292fc0084b3e626821d56129b77281e..4834b614d48cd1bc13dcb4d3a738a82aa8147358 100644 --- a/ext_tables.php +++ b/ext_tables.php @@ -32,10 +32,6 @@ call_user_func( if (TYPO3_MODE === 'BE') { $navigationComponentId = 'TYPO3/CMS/Backend/PageTree/PageTreeElement'; - if (version_compare(\TYPO3\CMS\Core\Utility\VersionNumberUtility::getCurrentTypo3Version(), '9.0.0', '<')) { - $navigationComponentId = 'typo3-pagetree'; - } - \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule( 'SGalinski.' . $extKey, 'web', diff --git a/ext_tables.sql b/ext_tables.sql index 376f04d84747324d14d069136e665a08f524dd4c..cf5da4c80990185b37ed49d6cb7afb4664e7e346 100644 --- a/ext_tables.sql +++ b/ext_tables.sql @@ -10,40 +10,14 @@ CREATE TABLE pages ( tx_sgnews_location mediumtext, tx_sgnews_date_end int(10) unsigned DEFAULT '0' NOT NULL, tx_sgnews_content_from_another_page int(11) unsigned DEFAULT '0' NOT NULL, - KEY news_author (tx_sgnews_news_author) ); -CREATE TABLE pages_language_overlay ( - tx_sgnews_teaser1_image int(11) unsigned DEFAULT '0' NOT NULL, - tx_sgnews_teaser2_image int(11) unsigned DEFAULT '0' NOT NULL, - tx_sgnews_location mediumtext -); - CREATE TABLE tx_sgnews_domain_model_author ( - uid int(11) NOT NULL auto_increment, - pid int(11) DEFAULT '0' NOT NULL, - - -- Custom fields name varchar(255) DEFAULT '' NOT NULL, email varchar(255) DEFAULT '' NOT NULL, description text, website text, path_segment text, - image int(11) unsigned DEFAULT '0', - - -- TYPO3 fields - tstamp int(11) unsigned DEFAULT '0' NOT NULL, - crdate int(11) unsigned DEFAULT '0' NOT NULL, - cruser_id int(11) unsigned DEFAULT '0' NOT NULL, - deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, - hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, - - sys_language_uid int(11) DEFAULT '0' NOT NULL, - l10n_parent int(11) DEFAULT '0' NOT NULL, - l10n_diffsource mediumblob, - - PRIMARY KEY (uid), - KEY parent (pid), - KEY language (l10n_parent,sys_language_uid) + image int(11) unsigned DEFAULT '0' );