[TASK] Allow multiple search words for file search 57/50457/4
authorMarkus Klein <markus.klein@typo3.org>
Mon, 31 Oct 2016 19:08:02 +0000 (20:08 +0100)
committerPhilipp Gampe <philipp.gampe@typo3.org>
Tue, 1 Nov 2016 12:03:53 +0000 (13:03 +0100)
The file search must consider each word of the search text as
individual word and all of them must be present in the file name.

Search words can be bound together by quoting them with
double quotes.

Resolves: #78519
Releases: master, 7.6
Change-Id: I95dcdf3418bfc9090a16c4f199af60799437390e
Reviewed-on: https://review.typo3.org/50457
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Philipp Gampe <philipp.gampe@typo3.org>
Tested-by: Philipp Gampe <philipp.gampe@typo3.org>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/core/Classes/Resource/Index/FileIndexRepository.php

index eba6b24..09e3f7a 100644 (file)
@@ -216,13 +216,24 @@ class FileIndexRepository implements SingletonInterface
         $storageUids = array_unique($storageUids);
         $folderIdentifiers = array_unique($folderIdentifiers);
 
-        $fileRecords = $this->getDatabaseConnection()->exec_SELECTgetRows(
+        $db = $this->getDatabaseConnection();
+
+        $nameSearch = '';
+        if (isset($fileName)) {
+            $nameParts = str_getcsv($fileName, ' ');
+            foreach ($nameParts as $part) {
+                $part = trim($part);
+                if ($part !== '') {
+                    $nameSearch .= ' AND name LIKE "%' . $db->escapeStrForLike($db->quoteStr($part, $this->table), $this->table) . '%"';
+                }
+            }
+        }
+
+        $fileRecords = $db->exec_SELECTgetRows(
             implode(',', $this->fields),
             $this->table,
-            'folder_hash IN ( ' . implode(',', $this->getDatabaseConnection()->fullQuoteArray($folderIdentifiers, $this->table)) . ')' .
-            ' AND storage IN (' . implode(',', $storageUids) . ')' .
-            (isset($fileName) ? ' AND name LIKE "%' . $this->getDatabaseConnection()->escapeStrForLike($this->getDatabaseConnection()->quoteStr($fileName, $this->table), $this->table) . '%"' : '') .
-            ($includeMissing ? '' : ' AND missing = 0'),
+            'folder_hash IN ( ' . implode(',', $db->fullQuoteArray($folderIdentifiers, $this->table)) . ')' .
+            ' AND storage IN (' . implode(',', $storageUids) . ')' . $nameSearch . ($includeMissing ? '' : ' AND missing = 0'),
             '',
             '',
             '',