diff options
| author | Greg Roach <greg@subaqua.co.uk> | 2020-10-05 23:51:39 +0100 |
|---|---|---|
| committer | Greg Roach <greg@subaqua.co.uk> | 2020-10-05 23:51:39 +0100 |
| commit | 63763244e313b0e5dc598319721f6a7aa399e128 (patch) | |
| tree | 7635d38d0791f0ecab64def7224b8c1ac530edee /app/Http/RequestHandlers/AutoCompleteCitation.php | |
| parent | e1994f421e2e448df20c8ce72f79078bd14cbbf2 (diff) | |
| download | webtrees-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.php | 98 |
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(); + } +} |
