app/Http/Controllers/AutocompleteController.php
public function page(ServerRequestInterface $request, Tree $tree): ResponseInterface
    {
        $query = $request->get('query', '');
        $xref  = $request->get('extra', '');

        $source = Source::getInstance($xref, $tree);

        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', '=', $xref)
            ->where('l_type', '=', 'SOUR')
            ->distinct()
            ->select(['individuals.*'])
            ->get()
            ->map(Individual::rowMapper())
            ->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', '=', $xref)
            ->where('l_type', '=', 'SOUR')
            ->distinct()
            ->select(['families.*'])
            ->get()
            ->map(Family::rowMapper())
            ->filter(GedcomRecord::accessFilter());

        $pages = [];

        foreach ($individuals->merge($families) as $record) {
            if (preg_match_all('/\n1 SOUR @' . $xref . '@(?:\n[2-9].*)*\n2 PAGE (.*' . $regex_query . '.*)/i', $record->gedcom(), $matches)) {
                $pages = array_merge($pages, $matches[1]);
            }

            if (preg_match_all('/\n2 SOUR @' . $xref . '@(?:\n[3-9].*)*\n3 PAGE (.*' . $regex_query . '.*)/i', $record->gedcom(), $matches)) {
                $pages = array_merge($pages, $matches[1]);
            }
        }

        $pages = array_unique($pages);

        $pages = array_map(static function (string $page): array {
            return ['value' => $page];
        }, $pages);

        return response($pages);
    }
public function page(ServerRequestInterface $request, Tree $tree): ResponseInterface
    {
        $query = $request->get('query', '');
        $xref  = $request->get('extra', '');

        $source = Source::getInstance($xref, $tree);

        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', '=', $xref)
            ->where('l_type', '=', 'SOUR')
            ->distinct()
            ->select(['individuals.*'])
            ->get()
            ->map(Individual::rowMapper())
            ->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', '=', $xref)
            ->where('l_type', '=', 'SOUR')
            ->distinct()
            ->select(['families.*'])
            ->get()
            ->map(Family::rowMapper())
            ->filter(GedcomRecord::accessFilter());

        $pages = [];

        foreach ($individuals->merge($families) as $record) {
            if (preg_match_all('/\n1 SOUR @' . $xref . '@(?:\n[2-9].*)*\n2 PAGE (.*' . $regex_query . '.*)/i', $record->gedcom(), $matches)) {
                $pages = array_merge($pages, $matches[1]);
            }

            if (preg_match_all('/\n2 SOUR @' . $xref . '@(?:\n[3-9].*)*\n3 PAGE (.*' . $regex_query . '.*)/i', $record->gedcom(), $matches)) {
                $pages = array_merge($pages, $matches[1]);
            }
        }

        $pages = array_unique($pages);

        $pages = array_map(static function (string $page): array {
            return ['value' => $page];
        }, $pages);

        return response($pages);
    }
public function page ( ServerRequestInterface $ request , Tree $ tree ) : ResponseInterface { $ query = $ request -> get ( 'query' , '' ) ; $ xref = $ request -> get ( 'extra' , '' ) ; $ source = Source :: getInstance ( $ xref , $ tree ) ; 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' , '=' , $ xref ) -> where ( 'l_type' , '=' , 'SOUR' ) -> distinct ( ) -> select ( [ 'individuals.*' ] ) -> get ( ) -> map ( Individual :: rowMapper ( ) ) -> 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' , '=' , $ xref ) -> where ( 'l_type' , '=' , 'SOUR' ) -> distinct ( ) -> select ( [ 'families.*' ] ) -> get ( ) -> map ( Family :: rowMapper ( ) ) -> filter ( GedcomRecord :: accessFilter ( ) ) ; $ pages = [ ] ; foreach ( $ individuals -> merge ( $ families ) as $ record ) { if ( preg_match_all ( '/\n1 SOUR @' . $ xref . '@(?:\n[2-9].*)*\n2 PAGE (.*' . $ regex_query . '.*)/i' , $ record -> gedcom ( ) , $ matches ) ) { $ pages = array_merge ( $ pages , $ matches [ 1 ] ) ; } if ( preg_match_all ( '/\n2 SOUR @' . $ xref . '@(?:\n[3-9].*)*\n3 PAGE (.*' . $ regex_query . '.*)/i' , $ record -> gedcom ( ) , $ matches ) ) { $ pages = array_merge ( $ pages , $ matches [ 1 ] ) ; } } $ pages = array_unique ( $ pages ) ; $ pages = array_map ( static function ( string $ page ) : array { return [ 'value' => $ page ] ; } , $ pages ) ; return response ( $ pages ) ; }
Autocomplete for source citations.

@param ServerRequestInterface $request
@param Tree                   $tree

@return ResponseInterface
Autocomplete for source citations .