Skip to content
Snippets Groups Projects
Commit 9acbcb3e authored by Kevin Ditscheid's avatar Kevin Ditscheid
Browse files

Merge branch 'master' into feature_pluginPreview

parents 11e27034 d07f3aa8
No related branches found
No related tags found
1 merge request!24[FEATURE] Plugin Backend Previews
Showing
with 478 additions and 319 deletions
......@@ -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;
}
}
......@@ -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
*
......
......@@ -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()
......
......@@ -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;
}
}
......@@ -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
*
......
......@@ -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;
}
}
......@@ -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
*
......
......@@ -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,]);
}
}
......@@ -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;
}
}
......@@ -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;
......
......@@ -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;
......
......@@ -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;
......
......@@ -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]]))
......
......@@ -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>';
......
......@@ -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;
}
}
......@@ -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']);
......
......@@ -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);
......
<?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
];
}
}
......@@ -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
];
}
}
......@@ -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'])) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment