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

[TASK] Remove TYPO3 legacy db

parent 8f9a15d3
No related branches found
No related tags found
2 merge requests!13Feature remove sg news ajax plugin,!8Feature upgrade to9 lts
......@@ -27,17 +27,20 @@ namespace SGalinski\SgNews\Command;
***************************************************************/
use SGalinski\SgNews\Domain\Model\News;
use SGalinski\SgNews\Domain\Model\Tag;
use SGalinski\SgNews\Domain\Repository\FileReferenceRepository;
use SGalinski\SgNews\Domain\Repository\NewsRepository;
use TYPO3\CMS\Backend\FrontendBackendUserAuthentication;
use TYPO3\CMS\Core\Database\DatabaseConnection;
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\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Domain\Model\FileReference;
use TYPO3\CMS\Core\Utility\VersionNumberUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\CommandController;
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;
/**
......@@ -50,29 +53,41 @@ class MigrateNewsCommandController extends CommandController {
protected $requestAdminPermissions = TRUE;
/**
* @var \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
* @inject
* @var PersistenceManager
*/
protected $persistenceManager;
/**
* @var \SGalinski\SgNews\Domain\Repository\NewsRepository
* @inject
* @param PersistenceManager $persistenceManager
*/
public function injectPersistenceManager(PersistenceManager $persistenceManager) {
$this->persistenceManager = $persistenceManager;
}
/**
* @var NewsRepository
*/
protected $newsRepository;
/**
* @var \SGalinski\SgNews\Domain\Repository\TagRepository
* @inject
* @param NewsRepository $newsRepository
*/
private $tagRepository;
public function injectNewsRepository(NewsRepository $newsRepository) {
$this->newsRepository = $newsRepository;
}
/**
* @var \SGalinski\SgNews\Domain\Repository\FileReferenceRepository
* @inject
* @var FileReferenceRepository
*/
private $fileReferenceRepository;
/**
* @param FileReferenceRepository $fileReferenceRepository
*/
public function injectFileReferenceRepository(FileReferenceRepository $fileReferenceRepository) {
$this->fileReferenceRepository = $fileReferenceRepository;
}
/**
* this array maps new pages to their original entry in the tx_news table
*
......@@ -117,8 +132,7 @@ class MigrateNewsCommandController extends CommandController {
) {
// fix repair translation bug where tsfe is missing from command controller, can be removed when v1.5 is released
if (!$GLOBALS['TSFE']) {
/** @var TypoScriptFrontendController $typoScriptController */
$GLOBALS['TSFE'] = $typoScriptController = $this->objectManager->get(
$GLOBALS['TSFE'] = $this->objectManager->get(
TypoScriptFrontendController::class, $GLOBALS['TYPO3_CONF_VARS'], 0, 0
);
}
......@@ -126,13 +140,14 @@ class MigrateNewsCommandController extends CommandController {
$this->languageMap = json_decode($languageMapAsJson, TRUE);
$this->categoryMap = json_decode($categoryMapAsJson, TRUE);
/** @var DatabaseConnection $db */
$db = $GLOBALS['TYPO3_DB'];
$where = 'hidden = 0 and deleted = 0 and endtime = 0 and pid = ' . (int) $pId;
/** @var \mysqli_result $result */
$result = $db->exec_SELECTquery('*', 'tx_news_domain_model_news', $where);
$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))
)
->execute()->fetchAll();
$localDataHandler = GeneralUtility::makeInstance(DataHandler::class);
$beUser = $this->simulateBackendUser();
$localCommandMap = [
......@@ -143,13 +158,11 @@ class MigrateNewsCommandController extends CommandController {
]
];
$resultArray = [];
while ($row = $result->fetch_assoc()) {
foreach ($rows as $row) {
// ignore the entry if its not within the given year
if ((int) date('Y', $row['datetime']) !== $year) {
continue;
}
$resultArray[] = $row;
// if no l10n_parent exists, create a copy of the page
if ((int) $row['l10n_parent'] === 0) {
......@@ -199,8 +212,17 @@ class MigrateNewsCommandController extends CommandController {
$this->persistenceManager->persistAll();
// update content element from the new page
$where = 'pid = ' . $newPageId . ' AND sys_language_uid = ' . $this->languageMap[(int) $row['sys_language_uid']];
$db->exec_UPDATEquery('tt_content', $where, ['bodytext' => $row['bodytext']]);
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content');
$queryBuilder->getRestrictions()->removeAll();
$queryBuilder->update('tt_content')
->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($newPageId, \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($this->languageMap[(int) $row['sys_language_uid']], \PDO::PARAM_INT))
)
)
->set('bodytext', $queryBuilder->createNamedParameter($row['bodytext']))
->execute();
}
} else { // this row is a translation and should simply update the content accordingly
$this->updateTranslation($row);
......@@ -217,20 +239,30 @@ class MigrateNewsCommandController extends CommandController {
*/
private function getMatchingFile(array $row) {
// match old page id with old file reference id
/** @var DatabaseConnection $db */
$db = $GLOBALS['TYPO3_DB'];
$where = 'tablenames = "tx_news_domain_model_news" AND fieldname = "fal_media" AND uid_foreign = ' . $row['uid'];
/** @var \mysqli_result $result */
$fileReferenceResult = $db->exec_SELECTgetSingleRow(
'uid, uid_local', 'sys_file_reference_news_migration', $where
);
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file_reference_news_migration');
$queryBuilder->getRestrictions()->removeAll();
$fileReferenceResult = $queryBuilder->select('uid', 'uid_local')
->from('sys_file_reference_news_migration')
->where(
$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))
)
)
->execute()->fetch();
if (!$fileReferenceResult) {
return NULL;
}
$where = 'uid = ' . $fileReferenceResult['uid_local'];
/** @var \mysqli_result $result */
$fileResult = $db->exec_SELECTgetSingleRow('identifier', 'sys_file_news_migration', $where);
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file_news_migration');
$queryBuilder->getRestrictions()->removeAll();
$fileResult = $queryBuilder->select('identifier')
->from('sys_file_news_migration')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($fileReferenceResult['uid_local'], \PDO::PARAM_INT))
)
->execute()->fetch();
if (!$fileResult) {
return NULL;
}
......@@ -249,17 +281,17 @@ class MigrateNewsCommandController extends CommandController {
* Get the tag / category, matching the news
*
* @param array $row
* @return News
*/
private function setMatchingTag(array $row) {
/** @var DatabaseConnection $db */
$db = $GLOBALS['TYPO3_DB'];
$where = 'uid_foreign = ' . (int) $row['uid'];
/** @var \mysqli_result $result */
$result = $db->exec_SELECTquery('uid_local, sorting_foreign', 'sys_category_record_mm_news_migration', $where);
while ($mmRow = $result->fetch_assoc()) {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_category_record_mm_news_migration');
$queryBuilder->getRestrictions()->removeAll();
$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))
)
->execute()->fetchAll();
foreach ($mmRows as $mmRow) {
$values = [
'uid_local' => $this->categoryMap[(int) $mmRow['uid_local']],
'uid_foreign' => $this->newsPagesMap[(int) $row['uid']],
......@@ -267,7 +299,8 @@ class MigrateNewsCommandController extends CommandController {
'fieldname' => 'tx_sgnews_tags',
'sorting_foreign' => (int) $mmRow['sorting_foreign']
];
$db->exec_INSERTquery('sys_category_record_mm', $values);
$queryBuilder->insert('sys_category_record_mm')
->values($values);
}
}
......@@ -277,68 +310,111 @@ class MigrateNewsCommandController extends CommandController {
* @param array $row
*/
private function updateTranslation(array $row) {
/** @var DatabaseConnection $db */
$db = $GLOBALS['TYPO3_DB'];
// get entry in news map
$parentId = $this->newsPagesMap[$row['l10n_parent']];
// get content element from the original page
$where = 'pid = ' . (int) $parentId;
/** @var \mysqli_result $result */
$result = $db->exec_SELECTquery('l18n_parent', 'tt_content', $where);
$originalContentElement = $result->fetch_row();
$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))
)
->execute()->fetch();
$queryBuilder->update('tt_content');
// if its the new default, there is no l18n_parent
if ((int) $this->languageMap[(int) $row['sys_language_uid'] === 0]) {
$where = 'uid = ' . (int) $originalContentElement[0];
$queryBuilder->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($originalContentElement[0], \PDO::PARAM_INT))
);
} else {
$where = 'l18n_parent = ' . (int) $originalContentElement[0];
$queryBuilder->where(
$queryBuilder->expr()->eq('l18n_parent', $queryBuilder->createNamedParameter($originalContentElement[0], \PDO::PARAM_INT))
);
}
// look up the correct language id, if they have changed
if (isset($this->languageMap[(int) $row['sys_language_uid']])) {
$where .= ' AND sys_language_uid = ' . $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))
);
} else {
$where .= ' AND sys_language_uid = ' . (int) $row['sys_language_uid'];
$queryBuilder->andWhere(
$queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($row['sys_language_uid'], \PDO::PARAM_INT))
);
}
$db->exec_UPDATEquery('tt_content', $where, ['bodytext' => $row['bodytext']]);
$queryBuilder->set('bodytext', $queryBuilder->createNamedParameter($row['bodytext']))
->execute();
// 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) {
$where = 'uid = ' . (int) $parentId;
/** @var \mysqli_result $result */
$result = $db->exec_SELECTgetSingleRow('title, subtitle', 'pages', $where);
$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))
)
->execute()->fetch();
if ($result) {
$where = 'pid = ' . (int) $parentId . ' AND sys_language_uid = ' . $this->languageMap[0];
$db->exec_UPDATEquery(
'pages_language_overlay', $where,
['title' => $result['title'], 'subtitle' => $result['subtitle'], 'navtitle' => '']
$queryBuilder->where(
$queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($this->languageMap[0], \PDO::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->set('title', $queryBuilder->createNamedParameter($result['title']))
->set('subtitle', $queryBuilder->createNamedParameter($result['subtitle']))
->set('navtitle', $queryBuilder->createNamedParameter(''))
->execute();
}
$where = 'uid = ' . (int) $parentId;
$db->exec_UPDATEquery(
'pages', $where, ['title' => date(
'Y-m-d', $row['datetime']
) . ' - ' . $row['title'], 'subtitle' => $row['title'], 'lastUpdated' => $row['datetime'], 'navtitle' => '']
);
$newTitle = date('Y-m-d', $row['datetime']) . ' - ' . $row['title'];
$queryBuilder->update('pages')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($parentId, \PDO::PARAM_INT))
)
->set('title', $queryBuilder->createNamedParameter($newTitle))
->set('subtitle', $queryBuilder->createNamedParameter($row['title']))
->set('lastUpdated', $queryBuilder->createNamedParameter($row['datetime'], \PDO::PARAM_INT))
->set('navtitle', $queryBuilder->createNamedParameter(''))
->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))
);
}
// finally translate the page title if necessary
/** @noinspection NotOptimalIfConditionsInspection */
if (isset($this->languageMap[(int) $row['sys_language_uid']]) && $this->languageMap[(int) $row['sys_language_uid']] > 0) {
$where = 'pid = ' . (int) $parentId . ' AND sys_language_uid = ' . $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))
);
} else {
$where = 'pid = ' . (int) $parentId . ' AND sys_language_uid = ' . (int) $row['sys_language_uid'];
$queryBuilder->andWhere(
$queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter($row['sys_language_uid'], \PDO::PARAM_INT))
);
}
$queryBuilder->set('title', $queryBuilder->createNamedParameter(date('Y-m-d', $row['datetime']) . ' - ' . $row['title']))
->execute();
}
$db->exec_UPDATEquery(
'pages_language_overlay', $where, ['title' => date('Y-m-d', $row['datetime']) . ' - ' . $row['title']]
);
}
/**
......
......@@ -27,9 +27,8 @@ namespace SGalinski\SgNews\Controller\Ajax;
***************************************************************/
use SGalinski\SgAjax\Controller\Ajax\AbstractAjaxController;
use TYPO3\CMS\Core\Database\DatabaseConnection;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* The LikeController handles the Ajax-Actions related to the like feature
......@@ -46,13 +45,13 @@ class LikeController extends AbstractAjaxController {
*/
public function addLikeAction($newsPid) {
try {
/** @var DatabaseConnection $database */
$database = $GLOBALS['TYPO3_DB'];
/** @var PageRepository $pageRepository */
$pageRepository = GeneralUtility::makeInstance(PageRepository::class);
$database->sql_query('UPDATE pages SET tx_sgnews_likes = tx_sgnews_likes ' . '+ 1 WHERE uid=' . (int) $newsPid .
$pageRepository->enableFields('pages'));
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
$queryBuilder->update('pages')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($newsPid, \PDO::PARAM_INT))
)
->set('tx_sgnews_likes', 'tx_sgnews_likes + 1')
->execute();
} catch (\Exception $exception) {
$this->returnData(['success' => false]);
}
......
......@@ -26,8 +26,9 @@ namespace SGalinski\SgNews\Domain\Repository;
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use SGalinski\SgNews\Domain\Model\FileReference;
use TYPO3\CMS\Core\Database\DatabaseConnection;
use TYPO3\CMS\Core\Resource\File;
/**
......@@ -78,23 +79,23 @@ class FileReferenceRepository extends AbstractRepository {
* @throws \Exception
*/
public function addFileReferenceFromFileId($fileId, array $reference, $tablename, $fieldname) {
/** @var DatabaseConnection $db */
$db = $GLOBALS['TYPO3_DB'];
$arguments = [
'crdate' => $GLOBALS['EXEC_TIME'],
'tstamp' => $GLOBALS['EXEC_TIME'],
'pid' => (int) $reference['pid'],
'table_local' => 'sys_file',
'uid_local' => $fileId,
'uid_foreign' => (int) $reference['uid'],
'tablenames' => $tablename,
'fieldname' => $fieldname,
];
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file_reference');
$success = $queryBuilder->insert('sys_file_reference')
->values([
'crdate' => $GLOBALS['EXEC_TIME'],
'tstamp' => $GLOBALS['EXEC_TIME'],
'pid' => (int) $reference['pid'],
'table_local' => 'sys_file',
'uid_local' => $fileId,
'uid_foreign' => (int) $reference['uid'],
'tablenames' => $tablename,
'fieldname' => $fieldname
]);
if (!$db->exec_INSERTquery('sys_file_reference', $arguments)) {
if (!$success) {
throw new \Exception('An error occurred while adding a file reference record.', 1452590219);
}
return (int) $db->sql_insert_id();
return (int) $queryBuilder->getConnection()->lastInsertId();
}
}
......@@ -25,7 +25,7 @@ namespace SGalinski\SgNews\TCA;
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
use TYPO3\CMS\Core\Database\DatabaseConnection;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\DataHandling\DataHandler;
use TYPO3\CMS\Core\SingletonInterface;
use TYPO3\CMS\Core\Utility\GeneralUtility;
......@@ -57,9 +57,6 @@ class TcaProvider implements SingletonInterface {
* @return void
*/
public function processDatamap_afterAllOperations(DataHandler $tceMain) {
/** @var DatabaseConnection $database */
$database = $GLOBALS['TYPO3_DB'];
/** @var array $tablesData */
foreach ($tceMain->datamap as $table => $tablesData) {
if (!in_array($table, ['pages', 'pages_language_overlay'], TRUE)) {
......@@ -75,31 +72,42 @@ class TcaProvider implements SingletonInterface {
$translationRow = [];
$pagesIdentity = (int) $identity;
if ($table === 'pages_language_overlay') {
$translationRow = $database->exec_SELECTgetSingleRow(
'pid, subtitle, t3ver_oid', 'pages_language_overlay', 'uid = ' . (int) $identity
);
$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 = $database->exec_SELECTgetSingleRow(
'pid, subtitle, t3ver_oid', 'pages_language_overlay', 'uid = ' . $workspaceOriginalId
);
$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'];
}
$row = $database->exec_SELECTgetSingleRow(
'doktype, subtitle, lastUpdated, tx_sgnews_highlighted, t3ver_oid', 'pages', 'uid = ' .
$pagesIdentity
);
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
$queryBuilder->getRestrictions()->removeAll();
$row = $queryBuilder->select('doktype', 'subtitle', 'lastUpdated', 'tx_sgnews_highlighted', 't3ver_oid')
->from('pages')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($pagesIdentity, \PDO::PARAM_INT))
)
->execute()->fetch();
$workspaceOriginalId = (int) $row['t3ver_oid'];
if ($workspaceOriginalId > 0) {
$row = $database->exec_SELECTgetSingleRow(
'doktype, subtitle, lastUpdated, tx_sgnews_highlighted, t3ver_oid', 'pages', 'uid = ' .
$workspaceOriginalId
);
$row = $queryBuilder->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($workspaceOriginalId, \PDO::PARAM_INT))
)->execute()->fetch();
}
// only articles
......@@ -119,8 +127,14 @@ class TcaProvider implements SingletonInterface {
}
$calculatedTitle = $prefix . strftime('%Y-%m-%d', $row['lastUpdated']) . ' - ' . $subtitle;
$updateFields = ['nav_title' => $subtitle, 'title' => trim($calculatedTitle)];
$database->exec_UPDATEquery($table, 'uid = ' . $identity, $updateFields);
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
$queryBuilder->update($table)
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($identity, \PDO::PARAM_INT))
)
->set('nav_title', $queryBuilder->createNamedParameter($subtitle))
->set('title', $queryBuilder->createNamedParameter(trim($calculatedTitle)))
->execute();
}
}
}
......
......@@ -32,7 +32,11 @@ use SGalinski\SgNews\Domain\Repository\NewsRepository;
use SGalinski\SgNews\Domain\Repository\TagRepository;
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\Database\DatabaseConnection;
use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\QueryHelper;
use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Database\QueryGenerator;
use TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider;
use TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider;
......@@ -149,14 +153,18 @@ class BackendNewsUtility {
$siteRootUid, PHP_INT_MAX, 0, $GLOBALS['BE_USER']->getPagePermsClause(1)
);
// if doktype = 117 (category) then get the category name (page title)
/** @var DatabaseConnection $databaseConnection */
$databaseConnection = $GLOBALS['TYPO3_DB'];
$where = 'deleted = 0 AND doktype = ' . self::CATEGORY_DOKTYPE . ' AND uid in (' . $childPids . ')';
$result = $databaseConnection->exec_SELECTgetRows('uid, title', 'pages', $where);
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
$queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
$result = $queryBuilder->select('uid', 'title')
->from('pages')
->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('doktype', $queryBuilder->createNamedParameter(self::CATEGORY_DOKTYPE, \PDO::PARAM_INT)),
$queryBuilder->expr()->in('uid', $queryBuilder->createNamedParameter(explode(',', $childPids), Connection::PARAM_INT_ARRAY))
)
)
->execute()->fetchAll();
$categories = [];
/** @var array $result */
foreach ($result as $page) {
$categoryPageInfo = BackendUtility::readPageAccess(
(int) $page['uid'], $GLOBALS['BE_USER']->getPagePermsClause(1)
......@@ -319,110 +327,72 @@ class BackendNewsUtility {
return $out;
}
/** @var DatabaseConnection $databaseConnection */
$databaseConnection = $GLOBALS['TYPO3_DB'];
$result = $databaseConnection->exec_SELECTquery($select, $tables, $where, '`pages`.`uid`', '`pages`.`sorting`');
while ($row = $result->fetch_assoc()) {
$out[] = $row;
}
$databaseConnection->sql_free_result($result);
return $out;
}
/**
* Creates news query parts
*
* @param array $allowedUids
* @param array $filters
* @param int $languageUid
* @return array
*/
private static function getNewsQueryParts(array $allowedUids, array $filters = [], $languageUid = 0): array {
$out = [0 => '
`pages`.`uid` AS uid,
`pages`.`pid` AS pid,
`pages`.`hidden` AS hidden,
`pages`.`sorting` AS sorting,
`pages`.`doktype` AS doktype,
`pages`.`title` AS title
', 1 => '', 2 => ''];
$out[1] = '`pages`';
$out[2] = '`pages`.`uid` IN(' . implode(',', $allowedUids) . ') ' . BackendUtility::deleteClause('pages') .
' AND `pages`.`doktype` = ' . self::NEWS_DOKTYPE;
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
$queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
$queryBuilder->select('p.uid',
'p.pid',
'p.hidden',
'p.sorting',
'p.doktype',
'p.title'
)->from('pages', 'p')
->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->in('uid', $queryBuilder->createNamedParameter($allowedUids, Connection::PARAM_INT_ARRAY)),
$queryBuilder->expr()->eq('doktype', $queryBuilder->createNamedParameter(self::NEWS_DOKTYPE, \PDO::PARAM_INT))
)
)
->groupBy('p.uid')
->orderBy('p.sorting');
if ($languageUid) {
$out[0] .= ', `translation`.`title` AS translation_title';
$out[0] .= ', `translation`.`uid` AS translation_uid';
$out[1] .= ' LEFT JOIN `pages_language_overlay` AS `translation` ON `translation`.`pid` = `pages`.`uid` ' .
BackendUtility::deleteClause('pages_language_overlay', 'translation') .
' AND `translation`.`sys_language_uid` = ' . $languageUid;
}
if (isset($filters['tags']) && is_array($filters['tags']) && count($filters['tags'])) {
$tagUids = [];
/** @var array $filterTags */
$filterTags = $filters['tags'];
foreach ($filterTags as $tagUid) {
if ((int) $tagUid && !in_array((int) $tagUid, $tagUids, TRUE)) {
$tagUids[] = (int) $tagUid;
}
}
if (count($tagUids)) {
$out[1] .= ' INNER JOIN `sys_category_record_mm` AS `tag` ON `tag`.`tablenames` = \'pages\'' .
' AND `tag`.`fieldname` = \'tx_sgnews_tags\' AND `tag`.`uid_foreign` = `pages`.`uid`' .
' AND `tag`.`uid_local` IN (' . implode(',', $filters['tags']) . ')';
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))
)
);
}
}
if (isset($filters['search']) && trim($filters['search'])) {
$out[2] .= self::getNewsSearchClause(trim($filters['search']), $languageUid);
if (isset($filters['tags']) && is_array($filters['tags']) && count($filters['tags'])) {
$queryBuilder->innerJoin('p', 'sys_category_record_mm', 'tag',
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('tag.tablenames', $queryBuilder->createNamedParameter('pages')),
$queryBuilder->expr()->eq('tag.fieldname', $queryBuilder->createNamedParameter('tx_sgnews_tags')),
$queryBuilder->expr()->eq('tag.uid_foreign', 'p.uid'),
$queryBuilder->expr()->in('tag.uid_local', $queryBuilder->createNamedParameter(\array_unique($filters['tags'])))
)
);
}
return $out;
}
/**
* Creates constraints of query for searching news by search-word
*
* @param string $searchString
* @param int $languageUid
* @return string
*/
private static function getNewsSearchClause($searchString = '', $languageUid = 0): string {
$out = '';
$searchString = strtolower(trim($searchString));
$languageUid = (int) $languageUid;
if (!$searchString) {
return $out;
}
$out = ' AND (';
/** @var DatabaseConnection $databaseConnection */
$databaseConnection = $GLOBALS['TYPO3_DB'];
$likeString = 'LIKE \'%' . $databaseConnection->escapeStrForLike($searchString, 'pages') . '%\'';
$constraints = [];
$pageFields = [
'title' => TRUE,
'description' => TRUE,
'author' => TRUE,
'abstract' => TRUE,
];
foreach ($pageFields as $fieldName => $isCommonField) {
if ($isCommonField) {
$constraints[] = 'LOWER(`pages`.`' . $fieldName . '`) ' . $likeString;
}
}
if (!$languageUid) {
foreach ($pageFields as $fieldName => $isCommonField) {
if (!$isCommonField) {
$constraints[] = 'LOWER(`pages`.`' . $fieldName . '`) ' . $likeString;
}
}
} else {
foreach ($pageFields as $fieldName => $isCommonField) {
if ($isCommonField) {
$constraints[] = 'LOWER(`translation`.`' . $fieldName . '`) ' . $likeString;
}
if (isset($filters['search']) && trim($filters['search'])) {
$expressions = [
$queryBuilder->expr()->like('p.title', $queryBuilder->createNamedParameter('%' . trim($filters['search']) . '%')),
$queryBuilder->expr()->like('p.description', $queryBuilder->createNamedParameter('%' . trim($filters['search']) . '%')),
$queryBuilder->expr()->like('p.author', $queryBuilder->createNamedParameter('%' . trim($filters['search']) . '%')),
$queryBuilder->expr()->like('p.abstract', $queryBuilder->createNamedParameter('%' . trim($filters['search']) . '%')),
];
if ($languageUid) {
$expressions[] = $queryBuilder->expr()->like('translation.title', $queryBuilder->createNamedParameter('%' . trim($filters['search']) . '%'));
$expressions[] = $queryBuilder->expr()->like('translation.description', $queryBuilder->createNamedParameter('%' . trim($filters['search']) . '%'));
$expressions[] = $queryBuilder->expr()->like('translation.author', $queryBuilder->createNamedParameter('%' . trim($filters['search']) . '%'));
$expressions[] = $queryBuilder->expr()->like('translation.abstract', $queryBuilder->createNamedParameter('%' . trim($filters['search']) . '%'));
}
$queryBuilder->andWhere(
$queryBuilder->expr()->orX(
$expressions
)
);
}
$out .= implode(' OR ', $constraints) . ')';
return $out;
return $queryBuilder->execute()->fetchAll();
}
/**
......@@ -447,15 +417,11 @@ class BackendNewsUtility {
$languages = [
0 => ['title' => $defaultLanguage, 'flag' => $defaultLanguageFlag]
];
/** @var DatabaseConnection $databaseConnection */
$databaseConnection = $GLOBALS['TYPO3_DB'];
$orderBy = '';
if (VersionNumberUtility::convertVersionNumberToInteger(TYPO3_version) >= 8000000) {
$orderBy = 'sorting';
}
$languageRows = $databaseConnection->exec_SELECTgetRows(
'uid, title, flag', 'sys_language', 'hidden = 0', '', $orderBy
);
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_language');
$languageRows = $queryBuilder->select('uid', 'title', 'flag')
->from('sys_language')
->orderBy('sorting')
->execute()->fetchAll();
if ($languageRows) {
/** @var BackendUserAuthentication $backendUser */
$backendUser = $GLOBALS['BE_USER'];
......@@ -491,27 +457,48 @@ class BackendNewsUtility {
$useDeleteClause = TRUE
) {
if (is_array($GLOBALS['TCA'][$theTable])) {
/** @var DatabaseConnection $databaseConnection */
$databaseConnection = $GLOBALS['TYPO3_DB'];
$result = $databaseConnection->exec_SELECTquery(
'*',
$theTable,
$theField . '=' . $databaseConnection->fullQuoteStr($theValue, $theTable) .
($useDeleteClause ? BackendUtility::deleteClause($theTable) . ' ' : '') .
BackendUtility::versioningPlaceholderClause($theTable) . ' ' .
$whereClause,
$groupBy,
$orderBy,
$limit
);
$rows = [];
while ($row = $databaseConnection->sql_fetch_assoc($result)) {
$rows[] = $row;
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($theTable);
$queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(BackendWorkspaceRestriction::class));;
if ($useDeleteClause) {
$queryBuilder->getRestrictions()
->add(GeneralUtility::makeInstance(DeletedRestriction::class));
}
$databaseConnection->sql_free_result($result);
if (!empty($rows)) {
return $rows;
$queryBuilder->select('*')
->from($theTable)
->where(
$queryBuilder->expr()->eq($theField, $queryBuilder->createNamedParameter($theValue))
);
// additional where
if ($whereClause) {
$queryBuilder->andWhere(QueryHelper::stripLogicalOperatorPrefix($whereClause));
}
// group by
if ($groupBy !== '') {
$queryBuilder->groupBy(QueryHelper::parseGroupBy($groupBy));
}
// order by
if ($orderBy !== '') {
foreach (QueryHelper::parseOrderBy($orderBy) as $orderPair) {
list($fieldName, $order) = $orderPair;
$queryBuilder->addOrderBy($fieldName, $order);
}
}
// limit
if ($limit !== '') {
if (strpos($limit, ',')) {
$limitOffsetAndMax = GeneralUtility::intExplode(',', $limit);
$queryBuilder->setFirstResult((int)$limitOffsetAndMax[0]);
$queryBuilder->setMaxResults((int)$limitOffsetAndMax[1]);
} else {
$queryBuilder->setMaxResults((int)$limit);
}
}
return $queryBuilder->execute()->fetchAll();
}
return NULL;
}
......
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