. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Elements\PedigreeLinkageType; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Validator; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; 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 = Validator::attributes($request)->tree(); $xref = Validator::attributes($request)->isXref()->string('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; } } switch ($PEDI) { case '': $gedcom = "1 FAMC @$famid@"; break; case PedigreeLinkageType::TYPE_ADOPTED: $gedcom = "1 FAMC @$famid@\n2 PEDI $PEDI\n1 ADOP\n2 FAMC @$famid@\n3 ADOP BOTH"; break; case PedigreeLinkageType::TYPE_SEALING: $gedcom = "1 FAMC @$famid@\n2 PEDI $PEDI\n1 SLGC\n2 FAMC @$famid@"; break; case PedigreeLinkageType::TYPE_FOSTER: $gedcom = "1 FAMC @$famid@\n2 PEDI $PEDI\n1 EVEN\n2 TYPE $PEDI"; break; default: $gedcom = "1 FAMC @$famid@\n2 PEDI $PEDI"; break; } $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()); } }