I want ke_search to index metadata of pages like 'author' or 'description' (and add it to "content"). I have a class "AdditionalFields" with 'registerAdditionalFields':
$additionalFields[] = 'author';
and then this:
public function modifyPagesIndexEntry($uid, &$pageContent, &$tags, $cachedPageRecords, &$additionalFields)
{
if (isset($cachedPageRecords[0][$uid]['author'])
&& $cachedPageRecords[0][$uid]['author'] > 0
) {
$additionalFields['content'] .= $cachedPageRecords[0][$uid]['author'];
}
}
but with this the "content" (in the DB) ist replaced by the 'author'. Any ideas?
The easiest way to achive what you want is to implement following hook.
EXT:your_extension/Classes/Hooks/KeSearchPageIndexerHook.php
<?php
namespace VENDOR\YourExtension\Hooks;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class KeSearchPageIndexerHook
{
public function modifyPagesIndexEntry(
$uid,
&$pageContent,
$tags,
$cachedPageRecords,
$additionalFields,
$indexerConfig,
$indexEntryDefaultValues,
$pageIndexerClass
)
{
$table = 'pages';
$querybuilderProductgroup = GeneralUtility::makeInstance(ConnectionPool::class)
->getConnectionForTable($table)
->createQueryBuilder();
$author = $querybuilderProductgroup
->select('author')
->from($table)
->where(
$querybuilderProductgroup->expr()->eq('uid', $uid)
)
->execute()
->fetchOne();
if($author != '')
{
// Be aware that $pageContent is an array with all localizations of the indexed content.
// $pageContent[0] is the base-language. Just in case you have a multi-language setup.
$pageContent[0] = "Author: $author " . $pageContent[0];
}
}
}
And then register the hook in the localconf. EXT:your_extension/ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ke_search']['modifyPagesIndexEntry'][] =
\VENDOR\YourExtension\Hooks\KeSearchPageIndexerHook::class;
That should do the job.