Open aschoelling opened 2 months ago
@aschoelling You are right, you have to extend your ke_search indexer with a "Zombie Check" (visible elements, in invisible columns), here is an example from an older project:
public function zombieCheck($record) {
if(!class_exists('FluidTYPO3\\Flux\\Utility\\ColumnNumberUtility')) {
return false;
}
$parents = $this->getFluxParents($record['uid']);
if(!empty($parents)) {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content');
$queryBuilder->setRestrictions(GeneralUtility::makeInstance(FrontendRestrictionContainer::class));
$queryBuilder->select('pid', 'uid', 'hidden', 'deleted', 'CType')
->from('tt_content')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($record['uid'], Connection::PARAM_INT))
);
$row = $queryBuilder->execute()->fetch();
$parents = array_merge([$row], $parents);
}
$i = 0;
foreach($parents as $parent) {
if($parent['hidden'] == '1' || $parent['deleted'] == '1') {
return true;
}
$i++;
}
$page = $this->pageRepository->getPage($record['pid']);
if(!empty($page)) {
if($page['hidden'] == '1' || $page['deleted'] == '1' || $page['no_search'] == '1') {
return true;
}
}
return false;
}
public function getFluxParents($uid) {
$result = [];
if(!class_exists('FluidTYPO3\\Flux\\Utility\\ColumnNumberUtility')) {
return $result;
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content');
$queryBuilder->setRestrictions(GeneralUtility::makeInstance(FrontendRestrictionContainer::class));
$queryBuilder->select('colPos')
->from('tt_content')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($uid, Connection::PARAM_INT))
);
$res = $queryBuilder->execute()->fetch();
if(isset($res['colPos'])) {
$parentUid = ColumnNumberUtility::calculateParentUid($res['colPos']);
}
if(is_numeric($parentUid) && !empty(intval($parentUid))) {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content');
$queryBuilder->setRestrictions(GeneralUtility::makeInstance(FrontendRestrictionContainer::class));
$queryBuilder->select('pid', 'uid', 'hidden', 'deleted', 'CType')
->from('tt_content')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($parentUid, Connection::PARAM_INT))
);
$parent = $queryBuilder->execute()->fetch();
if(!empty($parent)) {
$result = array_merge([$parent], $this->getFluxParents($parent['uid']));
}
}
return $result;
}
Child elements of hidden columnrow elements are indexed unless they themselves are hdden.