summaryrefslogtreecommitdiff
path: root/app/Http/RequestHandlers/AutoCompleteCitation.php
diff options
context:
space:
mode:
authorGreg Roach <greg@subaqua.co.uk>2020-10-05 23:51:39 +0100
committerGreg Roach <greg@subaqua.co.uk>2020-10-05 23:51:39 +0100
commit63763244e313b0e5dc598319721f6a7aa399e128 (patch)
tree7635d38d0791f0ecab64def7224b8c1ac530edee /app/Http/RequestHandlers/AutoCompleteCitation.php
parente1994f421e2e448df20c8ce72f79078bd14cbbf2 (diff)
downloadwebtrees-63763244e313b0e5dc598319721f6a7aa399e128.tar.gz
webtrees-63763244e313b0e5dc598319721f6a7aa399e128.tar.bz2
webtrees-63763244e313b0e5dc598319721f6a7aa399e128.zip
Fix: #3113 - add autocomplete to surname fields
Diffstat (limited to 'app/Http/RequestHandlers/AutoCompleteCitation.php')
-rw-r--r--app/Http/RequestHandlers/AutoCompleteCitation.php98
1 files changed, 98 insertions, 0 deletions
diff --git a/app/Http/RequestHandlers/AutoCompleteCitation.php b/app/Http/RequestHandlers/AutoCompleteCitation.php
new file mode 100644
index 0000000000..782b465287
--- /dev/null
+++ b/app/Http/RequestHandlers/AutoCompleteCitation.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\Auth;
+use Fisharebest\Webtrees\GedcomRecord;
+use Fisharebest\Webtrees\Registry;
+use Fisharebest\Webtrees\Tree;
+use Illuminate\Database\Capsule\Manager as DB;
+use Illuminate\Database\Query\JoinClause;
+use Illuminate\Support\Collection;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function assert;
+use function preg_match_all;
+use function preg_quote;
+
+/**
+ * Autocomplete handler for source citations
+ */
+class AutoCompleteCitation extends AbstractAutocompleteHandler
+{
+ protected function search(ServerRequestInterface $request): Collection
+ {
+ $tree = $request->getAttribute('tree');
+ assert($tree instanceof Tree);
+
+ $query = $request->getAttribute('query');
+ $xref = $request->getQueryParams()['extra'] ?? '';
+ $source = Registry::sourceFactory()->make($xref, $tree);
+ $source = Auth::checkSourceAccess($source);
+
+ $regex_query = preg_quote(strtr($query, [' ' => '.+']), '/');
+
+ // Fetch all records with a link to this source
+ $individuals = DB::table('individuals')
+ ->join('link', static function (JoinClause $join): void {
+ $join
+ ->on('l_file', '=', 'i_file')
+ ->on('l_from', '=', 'i_id');
+ })
+ ->where('i_file', '=', $tree->id())
+ ->where('l_to', '=', $source->xref())
+ ->where('l_type', '=', 'SOUR')
+ ->distinct()
+ ->select(['individuals.*'])
+ ->get()
+ ->map(Registry::individualFactory()->mapper($tree))
+ ->filter(GedcomRecord::accessFilter());
+
+ $families = DB::table('families')
+ ->join('link', static function (JoinClause $join): void {
+ $join
+ ->on('l_file', '=', 'f_file')
+ ->on('l_from', '=', 'f_id')
+ ->where('l_type', '=', 'SOUR');
+ })
+ ->where('f_file', '=', $tree->id())
+ ->where('l_to', '=', $source->xref())
+ ->where('l_type', '=', 'SOUR')
+ ->distinct()
+ ->select(['families.*'])
+ ->get()
+ ->map(Registry::familyFactory()->mapper($tree))
+ ->filter(GedcomRecord::accessFilter());
+
+ $pages = new Collection();
+
+ foreach ($individuals->merge($families) as $record) {
+ if (preg_match_all('/\n1 SOUR @' . $source->xref() . '@(?:\n[2-9].*)*\n2 PAGE (.*' . $regex_query . '.*)/i', $record->gedcom(), $matches)) {
+ $pages = $pages->concat($matches[1]);
+ }
+
+ if (preg_match_all('/\n2 SOUR @' . $source->xref() . '@(?:\n[3-9].*)*\n3 PAGE (.*' . $regex_query . '.*)/i', $record->gedcom(), $matches)) {
+ $pages = $pages->concat($matches[1]);
+ }
+ }
+
+ return $pages->uniqueStrict();
+ }
+}