. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\GedcomCode\GedcomCodePedi; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function assert; use function redirect; /** * Link an existing individual as child in an existing family. */ class LinkChildToFamilyAction implements RequestHandlerInterface { /** * @param ServerRequestInterface $request * * @return ResponseInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); assert($tree instanceof Tree); $xref = $request->getQueryParams()['xref']; $individual = Registry::individualFactory()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); $params = (array) $request->getParsedBody(); $famid = $params['famid']; $family = Registry::familyFactory()->make($famid, $tree); $family = Auth::checkFamilyAccess($family, true); $PEDI = $params['PEDI']; // Replace any existing child->family link (we may be changing the PEDI); $fact_id = ''; foreach ($individual->facts(['FAMC']) as $fact) { if ($family === $fact->target()) { $fact_id = $fact->id(); break; } } $gedcom = GedcomCodePedi::createNewFamcPedi($PEDI, $famid); $individual->updateFact($fact_id, $gedcom, true); // Only set the family->child link if it does not already exist $chil_link_exists = false; foreach ($family->facts(['CHIL']) as $fact) { if ($individual === $fact->target()) { $chil_link_exists = true; break; } } if (!$chil_link_exists) { $family->createFact('1 CHIL @' . $individual->xref() . '@', true); } return redirect($individual->url()); } }