xref: /webtrees/app/Source.php (revision 8f53f488f13e53e44dc48778e8f51ec9f91352dd)
1a25f0a04SGreg Roach<?php
2a25f0a04SGreg Roach/**
3a25f0a04SGreg Roach * webtrees: online genealogy
41062a142SGreg Roach * Copyright (C) 2018 webtrees development team
5a25f0a04SGreg Roach * This program is free software: you can redistribute it and/or modify
6a25f0a04SGreg Roach * it under the terms of the GNU General Public License as published by
7a25f0a04SGreg Roach * the Free Software Foundation, either version 3 of the License, or
8a25f0a04SGreg Roach * (at your option) any later version.
9a25f0a04SGreg Roach * This program is distributed in the hope that it will be useful,
10a25f0a04SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
11a25f0a04SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12a25f0a04SGreg Roach * GNU General Public License for more details.
13a25f0a04SGreg Roach * You should have received a copy of the GNU General Public License
14a25f0a04SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>.
15a25f0a04SGreg Roach */
1676692c8bSGreg Roachnamespace Fisharebest\Webtrees;
17a25f0a04SGreg Roach
18a25f0a04SGreg Roach/**
1976692c8bSGreg Roach * A GEDCOM source (SOUR) object.
20a25f0a04SGreg Roach */
21c1010edaSGreg Roachclass Source extends GedcomRecord
22c1010edaSGreg Roach{
23a25f0a04SGreg Roach    const RECORD_TYPE = 'SOUR';
24225e381fSGreg Roach    const ROUTE_NAME  = 'source';
25a25f0a04SGreg Roach
2676692c8bSGreg Roach    /**
27e71ef9d2SGreg Roach     * Get an instance of a source object. For single records,
28e71ef9d2SGreg Roach     * we just receive the XREF. For bulk records (such as lists
29e71ef9d2SGreg Roach     * and search results) we can receive the GEDCOM data as well.
30e71ef9d2SGreg Roach     *
31e71ef9d2SGreg Roach     * @param string      $xref
32e71ef9d2SGreg Roach     * @param Tree        $tree
33e71ef9d2SGreg Roach     * @param string|null $gedcom
34e71ef9d2SGreg Roach     *
35e71ef9d2SGreg Roach     * @throws \Exception
36e71ef9d2SGreg Roach     *
37e71ef9d2SGreg Roach     * @return Source|null
38e71ef9d2SGreg Roach     */
39c1010edaSGreg Roach    public static function getInstance($xref, Tree $tree, $gedcom = null)
40c1010edaSGreg Roach    {
41e71ef9d2SGreg Roach        $record = parent::getInstance($xref, $tree, $gedcom);
42e71ef9d2SGreg Roach
43e71ef9d2SGreg Roach        if ($record instanceof Source) {
44e71ef9d2SGreg Roach            return $record;
45e71ef9d2SGreg Roach        } else {
46e71ef9d2SGreg Roach            return null;
47e71ef9d2SGreg Roach        }
48e71ef9d2SGreg Roach    }
49e71ef9d2SGreg Roach
50e71ef9d2SGreg Roach    /**
5176692c8bSGreg Roach     * Each object type may have its own special rules, and re-implement this function.
5276692c8bSGreg Roach     *
5376692c8bSGreg Roach     * @param int $access_level
5476692c8bSGreg Roach     *
5576692c8bSGreg Roach     * @return bool
5676692c8bSGreg Roach     */
57*8f53f488SRico Sonntag    protected function canShowByType($access_level): bool
58c1010edaSGreg Roach    {
59a25f0a04SGreg Roach        // Hide sources if they are attached to private repositories ...
60a25f0a04SGreg Roach        preg_match_all('/\n1 REPO @(.+)@/', $this->gedcom, $matches);
61a25f0a04SGreg Roach        foreach ($matches[1] as $match) {
6224ec66ceSGreg Roach            $repo = Repository::getInstance($match, $this->tree);
63a25f0a04SGreg Roach            if ($repo && !$repo->canShow($access_level)) {
64a25f0a04SGreg Roach                return false;
65a25f0a04SGreg Roach            }
66a25f0a04SGreg Roach        }
67a25f0a04SGreg Roach
68a25f0a04SGreg Roach        // ... otherwise apply default behaviour
69a25f0a04SGreg Roach        return parent::canShowByType($access_level);
70a25f0a04SGreg Roach    }
71a25f0a04SGreg Roach
7276692c8bSGreg Roach    /**
7376692c8bSGreg Roach     * Generate a private version of this record
7476692c8bSGreg Roach     *
7576692c8bSGreg Roach     * @param int $access_level
7676692c8bSGreg Roach     *
7776692c8bSGreg Roach     * @return string
7876692c8bSGreg Roach     */
79*8f53f488SRico Sonntag    protected function createPrivateGedcomRecord($access_level): string
80c1010edaSGreg Roach    {
81a25f0a04SGreg Roach        return '0 @' . $this->xref . "@ SOUR\n1 TITL " . I18N::translate('Private');
82a25f0a04SGreg Roach    }
83a25f0a04SGreg Roach
8476692c8bSGreg Roach    /**
8576692c8bSGreg Roach     * Fetch data from the database
8676692c8bSGreg Roach     *
8776692c8bSGreg Roach     * @param string $xref
8876692c8bSGreg Roach     * @param int    $tree_id
8976692c8bSGreg Roach     *
9076692c8bSGreg Roach     * @return null|string
9176692c8bSGreg Roach     */
92c1010edaSGreg Roach    protected static function fetchGedcomRecord($xref, $tree_id)
93c1010edaSGreg Roach    {
9464d9078aSGreg Roach        return Database::prepare(
9564d9078aSGreg Roach            "SELECT s_gedcom FROM `##sources` WHERE s_id = :xref AND s_file = :tree_id"
9613abd6f3SGreg Roach        )->execute([
9764d9078aSGreg Roach            'xref'    => $xref,
9864d9078aSGreg Roach            'tree_id' => $tree_id,
9913abd6f3SGreg Roach        ])->fetchOne();
100a25f0a04SGreg Roach    }
101a25f0a04SGreg Roach
10276692c8bSGreg Roach    /**
10376692c8bSGreg Roach     * Extract names from the GEDCOM record.
10476692c8bSGreg Roach     */
105c1010edaSGreg Roach    public function extractNames()
106c1010edaSGreg Roach    {
10736a0c51dSGreg Roach        parent::extractNamesFromFacts(1, 'TITL', $this->getFacts('TITL'));
108a25f0a04SGreg Roach    }
109a25f0a04SGreg Roach}
110