Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save h3nn3s/6df3d951dbed596d9fd1a1361700301e to your computer and use it in GitHub Desktop.
Save h3nn3s/6df3d951dbed596d9fd1a1361700301e to your computer and use it in GitHub Desktop.
Custom indexer configuration for TYPO3 Extension ke_search. This Script is made for TYPO3 7 LTS (and above, but untested atm) and respects - besides the "normal" sysfolder - the storagepids_recursive field too.
<?php
/**
* Created by PhpStorm.
* User: hziegenhain
* Date: 27.12.2016
* Time: 14:42
*/
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class user_kesearchhooks
{
/**
* needed to get all recursive pids
*
* @var \TYPO3\CMS\Core\Database\QueryGenerator
*/
protected $queryGen;
public function registerIndexerConfiguration(&$params, $pObj) {
// add item to "type" field
$newArray = array(
'My Custom Extension',
'customindexer',
ExtensionManagementUtility::extRelPath('myext') . 'ext_icon.gif'
);
$params['items'][] = $newArray;
}
/**
* Custom indexer for ke_search
*
* @param array $indexerConfig Configuration from TYPO3 Backend
* @param array $indexerObject Reference to indexer class.
* @return string Output.
* @author Henrik Ziegenhain <ziegenhain@team-digital.de>
* @since Tue Dec 27 2016 14:42:00 GMT+0100
*/
public function customIndexer(&$indexerConfig, &$indexerObject) {
if ($indexerConfig['type'] === 'machinery') {
$content = '';
// get all the entries to index
// don't index hidden or deleted elements, BUT
// get the elements with frontend user group access restrictions
// or time (start / stop) restrictions.
// Copy those restrictions to the index.
$fields = '*';
$table = 'tx_machinery_domain_model_machinery';
// get the pages from where to index the records
$indexPids = $this->getPidList($indexerConfig['startingpoints_recursive'], $indexerConfig['sysfolder']);
$where = 'pid IN (' . implode(',', $indexPids) . ') AND hidden = 0 AND deleted = 0';
$groupBy = '';
$orderBy = '';
$limit = '';
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $table, $where, $groupBy, $orderBy, $limit);
$resCount = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
// Loop through the records and write them to the index.
if ($resCount) {
while (($record = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))) {
// compile the information which should go into the index
// the field names depend on the table you want to index!
$title = strip_tags($record['name']);
$abstract = '';
//$abstract = strip_tags($record['teaser']);
$content = strip_tags($record['description']);
$fullContent = $title . "\n" . $content;
$params = '&tx_myext_pi1[record]=' . $record['uid'] . '&tx_myext_pi1[action]=show&tx_myext_pi1[controller]=Record';
$tags = '#customindexer#';
$additionalFields = array(
'sortdate' => $record['tstamp'],
'orig_uid' => $record['uid'],
'orig_pid' => $record['pid'],
);
// add something to the title, just to identify the entries
// in the frontend
//$title = $title;
// ... and store the information in the index
$indexerObject->storeInIndex(
$indexerConfig['storagepid'], // storage PID
$title, // record title
'customindexer', // content type
$indexerConfig['targetpid'], // target PID: where is the single view?
$fullContent, // indexed content, includes the title (linebreak after title)
$tags, // tags for faceted search
$params, // typolink params for singleview
$abstract, // abstract; shown in result list if not empty
$record['sys_language_uid'], // language uid
$record['starttime'], // starttime
$record['endtime'], // endtime
$record['fe_group'], // fe_group
false, // debug only?
$additionalFields // additionalFields
);
}
$content = '<p><b>Indexer "' . $indexerConfig['title'] . '":</b><br />' . $resCount . ' Elements have been indexed.</p>';
}
return $content;
}
}
public function getPidList($startingPointsRecursive = '', $singlePages = '') {
$this->queryGen = GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Database\\QueryGenerator');
$pidsRecursive = GeneralUtility::trimExplode(',', $startingPointsRecursive, true);
$pidsNonRecursive = GeneralUtility::trimExplode(',', $singlePages, true);
$pageList = '';
foreach ($pidsRecursive as $pid) {
$pageList .= $this->queryGen->getTreeList($pid, 99, 0, '1=1') . ',';
}
foreach ($pidsNonRecursive as $pid) {
$pageList .= $pid . ',';
}
return GeneralUtility::trimExplode(',', $pageList, true);
}
}
<?php
// enable "sysfolder" and "startingpoints_recursive" field
$GLOBALS['TCA']['tx_kesearch_indexerconfig']['columns']['sysfolder']['displayCond'] .= ',customindexer';
$GLOBALS['TCA']['tx_kesearch_indexerconfig']['columns']['startingpoints_recursive']['displayCond'] .= ',customindexer';
@crochelt
Copy link

Very cool.
Unfortunatley this doesn't work for TYPO3 Version 9. How could I adapt this accordingly?

@h3nn3s
Copy link
Author

h3nn3s commented Jan 21, 2020

Currently not working with ke_search in Version 9.
Please may have a look into official documentation here: https://docs.typo3.org/p/teaminmedias-pluswerk/ke_search/3.1/en-us/Indexing/IndexerTypes/Custom.html

or the examples extension here: https://github.com/teaminmedias-pluswerk/ke_search_hooks - it should be up to date I think

@crochelt
Copy link

I did and it works. But there is a bug.
If your extension uses multiple pages ("sysfolder"), where records can be stored, only the first one will be taken into account:
teaminmedias-pluswerk/ke_search_hooks#12
It would be also nice to add "startingpoints_recursive", but I'd be happy if multiple single pages work (as it did in the earlier versions).

@h3nn3s
Copy link
Author

h3nn3s commented Jan 21, 2020

so please be so kind and report it to the maintainers of ke_search and ke_search_hooks ;-)

I think any help there is welcome.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment