90 $this->queryParser = GeneralUtility::makeInstance(QueryParser::class);
99 public function find($searchQuery)
103 $mounts =
$GLOBALS[
'BE_USER']->returnWebmounts();
104 foreach ($mounts as $pageId) {
107 $pageIdList = array_unique(explode(
',', implode(
',', $pageList)));
109 if ($this->queryParser->isValidCommand($searchQuery)) {
110 $this->
setQueryString($this->queryParser->getSearchQueryValue($searchQuery));
111 $tableName = $this->queryParser->getTableNameFromCommand($searchQuery);
113 $recordArray[] = $this->
findByTable($tableName, $pageIdList, $this->startCount, $this->limitCount);
131 $getRecordArray = [];
132 foreach (
$GLOBALS[
'TCA'] as $tableName => $value) {
135 (isset($value[
'ctrl'][
'hideTable']) && $value[
'ctrl'][
'hideTable'])
138 !
$GLOBALS[
'BE_USER']->check(
'tables_select', $tableName) &&
139 !
$GLOBALS[
'BE_USER']->check(
'tables_modify', $tableName)
144 $recordArray = $this->
findByTable($tableName, $pageIdList, 0, $limit);
145 $recordCount = count($recordArray);
147 $limit -= $recordCount;
148 $getRecordArray[] = $recordArray;
154 return $getRecordArray;
169 protected function findByTable($tableName, $pageIdList, $firstResult, $maxResults)
172 $getRecordArray = [];
173 if (!empty($fieldsToSearchWithin)) {
174 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
175 ->getQueryBuilderForTable($tableName);
176 $queryBuilder->getRestrictions()
177 ->removeByType(HiddenRestriction::class)
178 ->removeByType(StartTimeRestriction::class)
179 ->removeByType(EndTimeRestriction::class);
185 $queryBuilder->expr()->in(
187 $queryBuilder->createNamedParameter($pageIdList, Connection::PARAM_INT_ARRAY)
189 $this->makeQuerySearchByTable($queryBuilder, $tableName, $fieldsToSearchWithin)
191 ->setFirstResult($firstResult)
192 ->setMaxResults($maxResults);
194 if ($tableName ===
'pages' && $this->userPermissions) {
195 $queryBuilder->andWhere($this->userPermissions);
198 $orderBy =
$GLOBALS[
'TCA'][$tableName][
'ctrl'][
'sortby'] ?:
$GLOBALS[
'TCA'][$tableName][
'ctrl'][
'default_sortby'];
200 list($fieldName, $order) = $orderPair;
201 $queryBuilder->addOrderBy($fieldName, $order);
207 return $getRecordArray;
222 $result = $queryBuilder->execute();
223 $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
224 while ($row = $result->fetch()) {
226 if (!is_array($row)) {
229 $onlineUid = $row[
't3ver_oid'] ?: $row[
'uid'];
230 $title =
'id=' . $row[
'uid'] .
', pid=' . $row[
'pid'];
231 $collect[$onlineUid] = [
232 'id' => $tableName .
':' . $row[
'uid'],
233 'pageId' => $tableName ===
'pages' ? $row[
'uid'] : $row[
'pid'],
235 'iconHTML' =>
'<span title="' . htmlspecialchars($title) .
'">' . $iconFactory->getIconForRecord($tableName, $row,
Icon::SIZE_SMALL)->render() .
'</span>',
237 'editLink' => htmlspecialchars($this->
getEditLink($tableName, $row))
254 $calcPerms =
$GLOBALS[
'BE_USER']->calcPerms($pageInfo);
256 if ($tableName ===
'pages') {
264 $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
265 $returnUrl = (string)$uriBuilder->buildUriFromRoute(
'web_list', [
'id' => $row[
'pid']]);
266 $editLink = (string)$uriBuilder->buildUriFromRoute(
'record_edit', [
267 'edit[' . $tableName .
'][' . $row[
'uid'] .
']' =>
'edit',
268 'returnUrl' => $returnUrl
298 $titleLength =
$GLOBALS[
'BE_USER']->uc[
'titleLen'];
300 return htmlspecialchars(GeneralUtility::fixed_lgd_cs($title, $titleLength));
311 protected function makeQuerySearchByTable(QueryBuilder &$queryBuilder, $tableName, array $fieldsToSearchWithin)
317 foreach ($fieldsToSearchWithin as $fieldName) {
318 if ($fieldName !==
'uid'
319 && $fieldName !==
'pid'
320 && !isset(
$GLOBALS[
'TCA'][$tableName][
'columns'][$fieldName])
324 $fieldConfig =
$GLOBALS[
'TCA'][$tableName][
'columns'][$fieldName][
'config'];
325 $fieldType = $fieldConfig[
'type'];
326 $evalRules = $fieldConfig[
'eval'] ?:
'';
329 if ($fieldName ===
'uid'
330 || $fieldName ===
'pid'
331 || ($fieldType ===
'input' && $evalRules && GeneralUtility::inList($evalRules,
'int'))
333 $constraints[] = $queryBuilder->expr()->eq(
335 $queryBuilder->createNamedParameter($this->queryString, \PDO::PARAM_INT)
337 } elseif ($fieldType ===
'text'
338 || $fieldType ===
'flex'
339 || ($fieldType ===
'input' && (!$evalRules || !preg_match(
'/\b(?:date|time|int)\b/', $evalRules)))
342 $constraints[] = $constraints[] = $queryBuilder->expr()->like(
344 $queryBuilder->createNamedParameter(
345 '%' . $queryBuilder->escapeLikeWildcards((
int)$this->queryString) .
'%',
352 $like =
'%' . $queryBuilder->escapeLikeWildcards($this->queryString) .
'%';
353 foreach ($fieldsToSearchWithin as $fieldName) {
354 if (!isset(
$GLOBALS[
'TCA'][$tableName][
'columns'][$fieldName])) {
357 $fieldConfig = &
$GLOBALS[
'TCA'][$tableName][
'columns'][$fieldName][
'config'];
358 $fieldType = $fieldConfig[
'type'];
359 $evalRules = $fieldConfig[
'eval'] ?:
'';
362 $searchConstraint = $queryBuilder->expr()->andX(
363 $queryBuilder->expr()->comparison(
364 'LOWER(' . $queryBuilder->quoteIdentifier($fieldName) .
')',
366 $queryBuilder->createNamedParameter(mb_strtolower($like), \PDO::PARAM_STR)
370 if (is_array($fieldConfig[
'search'])) {
371 if (in_array(
'case', $fieldConfig[
'search'],
true)) {
373 $searchConstraint = $queryBuilder->expr()->andX(
374 $queryBuilder->expr()->like(
376 $queryBuilder->createNamedParameter($like, \PDO::PARAM_STR)
381 if ($fieldConfig[
'search'][
'andWhere']) {
382 $searchConstraint->add(
388 if ($fieldType ===
'text'
389 || $fieldType ===
'flex'
390 || ($fieldType ===
'input' && (!$evalRules || !preg_match(
'/\b(?:date|time|int)\b/', $evalRules)))
392 if ($searchConstraint->count() !== 0) {
393 $constraints[] = $searchConstraint;
400 if (empty($constraints)) {
404 return $queryBuilder->expr()->orX(...$constraints);
416 if (isset(
$GLOBALS[
'TCA'][$tableName][
'ctrl'][
'searchFields'])) {
417 $fieldListArray = GeneralUtility::trimExplode(
',',
$GLOBALS[
'TCA'][$tableName][
'ctrl'][
'searchFields'],
true);
419 $fieldListArray = [];
423 $fieldListArray[] =
'uid';
424 $fieldListArray[] =
'pid';
426 return $fieldListArray;
438 $this->limitCount = $limit;
472 $tree = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Tree\View\PageTreeView::class);
473 $tree->init(
'AND ' . $this->userPermissions);
475 $tree->fieldArray = [
'uid',
'php_tree_stop'];
477 $tree->getTree($id, $depth,
'');
482 return implode(
',', $tree->ids);